Skip to content

Commit 27c0bc9

Browse files
authored
[X86][MC] Allow to specify any of the 8/16/32/64 register names interchangeably for R16-R31 (#73421)
1 parent 659e401 commit 27c0bc9

File tree

2 files changed

+226
-32
lines changed

2 files changed

+226
-32
lines changed

llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp

Lines changed: 100 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,10 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
786786
#define SP_SUB_SUPER(R) SUB_SUPER(SPL, SP, ESP, RSP, R)
787787
#define NO_SUB_SUPER(NO, REG) \
788788
SUB_SUPER(R##NO##B, R##NO##W, R##NO##D, R##NO, REG)
789+
#define NO_SUB_SUPER_B(NO) NO_SUB_SUPER(NO, R##NO##B)
790+
#define NO_SUB_SUPER_W(NO) NO_SUB_SUPER(NO, R##NO##W)
791+
#define NO_SUB_SUPER_D(NO) NO_SUB_SUPER(NO, R##NO##D)
792+
#define NO_SUB_SUPER_Q(NO) NO_SUB_SUPER(NO, R##NO)
789793
switch (Size) {
790794
default:
791795
llvm_unreachable("illegal register size");
@@ -809,14 +813,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
809813
DI_SUB_SUPER(DIL)
810814
BP_SUB_SUPER(BPL)
811815
SP_SUB_SUPER(SPL)
812-
NO_SUB_SUPER(8, R8B)
813-
NO_SUB_SUPER(9, R9B)
814-
NO_SUB_SUPER(10, R10B)
815-
NO_SUB_SUPER(11, R11B)
816-
NO_SUB_SUPER(12, R12B)
817-
NO_SUB_SUPER(13, R13B)
818-
NO_SUB_SUPER(14, R14B)
819-
NO_SUB_SUPER(15, R15B)
816+
NO_SUB_SUPER_B(8)
817+
NO_SUB_SUPER_B(9)
818+
NO_SUB_SUPER_B(10)
819+
NO_SUB_SUPER_B(11)
820+
NO_SUB_SUPER_B(12)
821+
NO_SUB_SUPER_B(13)
822+
NO_SUB_SUPER_B(14)
823+
NO_SUB_SUPER_B(15)
824+
NO_SUB_SUPER_B(16)
825+
NO_SUB_SUPER_B(17)
826+
NO_SUB_SUPER_B(18)
827+
NO_SUB_SUPER_B(19)
828+
NO_SUB_SUPER_B(20)
829+
NO_SUB_SUPER_B(21)
830+
NO_SUB_SUPER_B(22)
831+
NO_SUB_SUPER_B(23)
832+
NO_SUB_SUPER_B(24)
833+
NO_SUB_SUPER_B(25)
834+
NO_SUB_SUPER_B(26)
835+
NO_SUB_SUPER_B(27)
836+
NO_SUB_SUPER_B(28)
837+
NO_SUB_SUPER_B(29)
838+
NO_SUB_SUPER_B(30)
839+
NO_SUB_SUPER_B(31)
820840
}
821841
}
822842
case 16:
@@ -830,14 +850,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
830850
DI_SUB_SUPER(DI)
831851
BP_SUB_SUPER(BP)
832852
SP_SUB_SUPER(SP)
833-
NO_SUB_SUPER(8, R8W)
834-
NO_SUB_SUPER(9, R9W)
835-
NO_SUB_SUPER(10, R10W)
836-
NO_SUB_SUPER(11, R11W)
837-
NO_SUB_SUPER(12, R12W)
838-
NO_SUB_SUPER(13, R13W)
839-
NO_SUB_SUPER(14, R14W)
840-
NO_SUB_SUPER(15, R15W)
853+
NO_SUB_SUPER_W(8)
854+
NO_SUB_SUPER_W(9)
855+
NO_SUB_SUPER_W(10)
856+
NO_SUB_SUPER_W(11)
857+
NO_SUB_SUPER_W(12)
858+
NO_SUB_SUPER_W(13)
859+
NO_SUB_SUPER_W(14)
860+
NO_SUB_SUPER_W(15)
861+
NO_SUB_SUPER_W(16)
862+
NO_SUB_SUPER_W(17)
863+
NO_SUB_SUPER_W(18)
864+
NO_SUB_SUPER_W(19)
865+
NO_SUB_SUPER_W(20)
866+
NO_SUB_SUPER_W(21)
867+
NO_SUB_SUPER_W(22)
868+
NO_SUB_SUPER_W(23)
869+
NO_SUB_SUPER_W(24)
870+
NO_SUB_SUPER_W(25)
871+
NO_SUB_SUPER_W(26)
872+
NO_SUB_SUPER_W(27)
873+
NO_SUB_SUPER_W(28)
874+
NO_SUB_SUPER_W(29)
875+
NO_SUB_SUPER_W(30)
876+
NO_SUB_SUPER_W(31)
841877
}
842878
case 32:
843879
switch (Reg.id()) {
@@ -850,14 +886,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
850886
DI_SUB_SUPER(EDI)
851887
BP_SUB_SUPER(EBP)
852888
SP_SUB_SUPER(ESP)
853-
NO_SUB_SUPER(8, R8D)
854-
NO_SUB_SUPER(9, R9D)
855-
NO_SUB_SUPER(10, R10D)
856-
NO_SUB_SUPER(11, R11D)
857-
NO_SUB_SUPER(12, R12D)
858-
NO_SUB_SUPER(13, R13D)
859-
NO_SUB_SUPER(14, R14D)
860-
NO_SUB_SUPER(15, R15D)
889+
NO_SUB_SUPER_D(8)
890+
NO_SUB_SUPER_D(9)
891+
NO_SUB_SUPER_D(10)
892+
NO_SUB_SUPER_D(11)
893+
NO_SUB_SUPER_D(12)
894+
NO_SUB_SUPER_D(13)
895+
NO_SUB_SUPER_D(14)
896+
NO_SUB_SUPER_D(15)
897+
NO_SUB_SUPER_D(16)
898+
NO_SUB_SUPER_D(17)
899+
NO_SUB_SUPER_D(18)
900+
NO_SUB_SUPER_D(19)
901+
NO_SUB_SUPER_D(20)
902+
NO_SUB_SUPER_D(21)
903+
NO_SUB_SUPER_D(22)
904+
NO_SUB_SUPER_D(23)
905+
NO_SUB_SUPER_D(24)
906+
NO_SUB_SUPER_D(25)
907+
NO_SUB_SUPER_D(26)
908+
NO_SUB_SUPER_D(27)
909+
NO_SUB_SUPER_D(28)
910+
NO_SUB_SUPER_D(29)
911+
NO_SUB_SUPER_D(30)
912+
NO_SUB_SUPER_D(31)
861913
}
862914
case 64:
863915
switch (Reg.id()) {
@@ -870,14 +922,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size,
870922
DI_SUB_SUPER(RDI)
871923
BP_SUB_SUPER(RBP)
872924
SP_SUB_SUPER(RSP)
873-
NO_SUB_SUPER(8, R8)
874-
NO_SUB_SUPER(9, R9)
875-
NO_SUB_SUPER(10, R10)
876-
NO_SUB_SUPER(11, R11)
877-
NO_SUB_SUPER(12, R12)
878-
NO_SUB_SUPER(13, R13)
879-
NO_SUB_SUPER(14, R14)
880-
NO_SUB_SUPER(15, R15)
925+
NO_SUB_SUPER_Q(8)
926+
NO_SUB_SUPER_Q(9)
927+
NO_SUB_SUPER_Q(10)
928+
NO_SUB_SUPER_Q(11)
929+
NO_SUB_SUPER_Q(12)
930+
NO_SUB_SUPER_Q(13)
931+
NO_SUB_SUPER_Q(14)
932+
NO_SUB_SUPER_Q(15)
933+
NO_SUB_SUPER_Q(16)
934+
NO_SUB_SUPER_Q(17)
935+
NO_SUB_SUPER_Q(18)
936+
NO_SUB_SUPER_Q(19)
937+
NO_SUB_SUPER_Q(20)
938+
NO_SUB_SUPER_Q(21)
939+
NO_SUB_SUPER_Q(22)
940+
NO_SUB_SUPER_Q(23)
941+
NO_SUB_SUPER_Q(24)
942+
NO_SUB_SUPER_Q(25)
943+
NO_SUB_SUPER_Q(26)
944+
NO_SUB_SUPER_Q(27)
945+
NO_SUB_SUPER_Q(28)
946+
NO_SUB_SUPER_Q(29)
947+
NO_SUB_SUPER_Q(30)
948+
NO_SUB_SUPER_Q(31)
881949
}
882950
}
883951
}

llvm/test/CodeGen/X86/asm-mismatched-types.ll

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,129 @@ define void @reg8_as_16(i16 %p) {
133133
call void asm sideeffect "# REG: $0", "{dil}"(i16 %p)
134134
ret void
135135
}
136+
137+
; CHECK-LABEL: egpr_reg64_as_32:
138+
; CHECK: # REG: %r16d
139+
define void @egpr_reg64_as_32(i32 %p) {
140+
call void asm sideeffect "# REG: $0", "{r16}"(i32 %p)
141+
ret void
142+
}
143+
144+
; CHECK-LABEL: egpr_reg64_as_32_float:
145+
; CHECK: # REG: %r16d
146+
define void @egpr_reg64_as_32_float(float %p) {
147+
call void asm sideeffect "# REG: $0", "{r16}"(float %p)
148+
ret void
149+
}
150+
151+
; CHECK-LABEL: egpr_reg64_as_16:
152+
; CHECK: # REG: %r17w
153+
define void @egpr_reg64_as_16(i16 %p) {
154+
call void asm sideeffect "# REG: $0", "{r17}"(i16 %p)
155+
ret void
156+
}
157+
158+
; CHECK-LABEL: egpr_reg64_as_8:
159+
; CHECK: # REG: %r21b
160+
define void @egpr_reg64_as_8(i8 %p) {
161+
call void asm sideeffect "# REG: $0", "{r21}"(i8 %p)
162+
ret void
163+
}
164+
165+
; CHECK-LABEL: egpr_reg32_as_16:
166+
; CHECK: # REG: %r21w
167+
define void @egpr_reg32_as_16(i16 %p) {
168+
call void asm sideeffect "# REG: $0", "{r21d}"(i16 %p)
169+
ret void
170+
}
171+
172+
; CHECK-LABEL: egpr_reg32_as_8:
173+
; CHECK: # REG: %r20b
174+
define void @egpr_reg32_as_8(i8 %p) {
175+
call void asm sideeffect "# REG: $0", "{r20d}"(i8 %p)
176+
ret void
177+
}
178+
179+
; CHECK-LABEL: egpr_reg16_as_8:
180+
; CHECK: # REG: %r17b
181+
define void @egpr_reg16_as_8(i8 %p) {
182+
call void asm sideeffect "# REG: $0", "{r17w}"(i8 %p)
183+
ret void
184+
}
185+
186+
; CHECK-LABEL: egpr_reg32_as_64:
187+
; CHECK: # REG: %r21
188+
define void @egpr_reg32_as_64(i64 %p) {
189+
call void asm sideeffect "# REG: $0", "{r21d}"(i64 %p)
190+
ret void
191+
}
192+
193+
; CHECK-LABEL: egpr_reg32_as_64_float:
194+
; CHECK: # REG: %r21
195+
define void @egpr_reg32_as_64_float(double %p) {
196+
call void asm sideeffect "# REG: $0", "{r21d}"(double %p)
197+
ret void
198+
}
199+
200+
; CHECK-LABEL: egpr_reg16_as_64:
201+
; CHECK: # REG: %r21
202+
define void @egpr_reg16_as_64(i64 %p) {
203+
call void asm sideeffect "# REG: $0", "{r21w}"(i64 %p)
204+
ret void
205+
}
206+
207+
; CHECK-LABEL: egpr_reg16_as_64_float:
208+
; CHECK: # REG: %r21
209+
define void @egpr_reg16_as_64_float(double %p) {
210+
call void asm sideeffect "# REG: $0", "{r21w}"(double %p)
211+
ret void
212+
}
213+
214+
; CHECK-LABEL: egpr_reg8_as_64:
215+
; CHECK: # REG: %r16
216+
define void @egpr_reg8_as_64(i64 %p) {
217+
call void asm sideeffect "# REG: $0", "{r16b}"(i64 %p)
218+
ret void
219+
}
220+
221+
; CHECK-LABEL: egpr_reg8_as_64_float:
222+
; CHECK: # REG: %r16
223+
define void @egpr_reg8_as_64_float(double %p) {
224+
call void asm sideeffect "# REG: $0", "{r16b}"(double %p)
225+
ret void
226+
}
227+
228+
; CHECK-LABEL: egpr_reg16_as_32:
229+
; CHECK: # REG: %r19d
230+
define void @egpr_reg16_as_32(i32 %p) {
231+
call void asm sideeffect "# REG: $0", "{r19w}"(i32 %p)
232+
ret void
233+
}
234+
235+
; CHECK-LABEL: egpr_reg16_as_32_float:
236+
; CHECK: # REG: %r19d
237+
define void @egpr_reg16_as_32_float(float %p) {
238+
call void asm sideeffect "# REG: $0", "{r19w}"(float %p)
239+
ret void
240+
}
241+
242+
; CHECK-LABEL: egpr_reg8_as_32:
243+
; CHECK: # REG: %r17d
244+
define void @egpr_reg8_as_32(i32 %p) {
245+
call void asm sideeffect "# REG: $0", "{r17b}"(i32 %p)
246+
ret void
247+
}
248+
249+
; CHECK-LABEL: egpr_reg8_as_32_float:
250+
; CHECK: # REG: %r17d
251+
define void @egpr_reg8_as_32_float(float %p) {
252+
call void asm sideeffect "# REG: $0", "{r17b}"(float %p)
253+
ret void
254+
}
255+
256+
; CHECK-LABEL: egpr_reg8_as_16:
257+
; CHECK: # REG: %r18w
258+
define void @egpr_reg8_as_16(i16 %p) {
259+
call void asm sideeffect "# REG: $0", "{r18b}"(i16 %p)
260+
ret void
261+
}

0 commit comments

Comments
 (0)