From 42e48c5142c7a46d6efaaaf0849cc8c208d88448 Mon Sep 17 00:00:00 2001 From: Shengchen Kan Date: Sun, 26 Nov 2023 10:47:44 +0800 Subject: [PATCH 1/2] [X86][MC] Allow to specify any of the 8/16/32/64 register names interchangeably for R16-R31 --- .../X86/MCTargetDesc/X86MCTargetDesc.cpp | 64 +++++++++ llvm/test/CodeGen/X86/asm-mismatched-types.ll | 126 ++++++++++++++++++ 2 files changed, 190 insertions(+) diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index af5cb1215abcc..3b4638afeaf11 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -817,6 +817,22 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, NO_SUB_SUPER(13, R13B) NO_SUB_SUPER(14, R14B) NO_SUB_SUPER(15, R15B) + NO_SUB_SUPER(16, R16B) + NO_SUB_SUPER(17, R17B) + NO_SUB_SUPER(18, R18B) + NO_SUB_SUPER(19, R19B) + NO_SUB_SUPER(20, R20B) + NO_SUB_SUPER(21, R21B) + NO_SUB_SUPER(22, R22B) + NO_SUB_SUPER(23, R23B) + NO_SUB_SUPER(24, R24B) + NO_SUB_SUPER(25, R25B) + NO_SUB_SUPER(26, R26B) + NO_SUB_SUPER(27, R27B) + NO_SUB_SUPER(28, R28B) + NO_SUB_SUPER(29, R29B) + NO_SUB_SUPER(30, R30B) + NO_SUB_SUPER(31, R31B) } } case 16: @@ -838,6 +854,22 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, NO_SUB_SUPER(13, R13W) NO_SUB_SUPER(14, R14W) NO_SUB_SUPER(15, R15W) + NO_SUB_SUPER(16, R16W) + NO_SUB_SUPER(17, R17W) + NO_SUB_SUPER(18, R18W) + NO_SUB_SUPER(19, R19W) + NO_SUB_SUPER(20, R20W) + NO_SUB_SUPER(21, R21W) + NO_SUB_SUPER(22, R22W) + NO_SUB_SUPER(23, R23W) + NO_SUB_SUPER(24, R24W) + NO_SUB_SUPER(25, R25W) + NO_SUB_SUPER(26, R26W) + NO_SUB_SUPER(27, R27W) + NO_SUB_SUPER(28, R28W) + NO_SUB_SUPER(29, R29W) + NO_SUB_SUPER(30, R30W) + NO_SUB_SUPER(31, R31W) } case 32: switch (Reg.id()) { @@ -858,6 +890,22 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, NO_SUB_SUPER(13, R13D) NO_SUB_SUPER(14, R14D) NO_SUB_SUPER(15, R15D) + NO_SUB_SUPER(16, R16D) + NO_SUB_SUPER(17, R17D) + NO_SUB_SUPER(18, R18D) + NO_SUB_SUPER(19, R19D) + NO_SUB_SUPER(20, R20D) + NO_SUB_SUPER(21, R21D) + NO_SUB_SUPER(22, R22D) + NO_SUB_SUPER(23, R23D) + NO_SUB_SUPER(24, R24D) + NO_SUB_SUPER(25, R25D) + NO_SUB_SUPER(26, R26D) + NO_SUB_SUPER(27, R27D) + NO_SUB_SUPER(28, R28D) + NO_SUB_SUPER(29, R29D) + NO_SUB_SUPER(30, R30D) + NO_SUB_SUPER(31, R31D) } case 64: switch (Reg.id()) { @@ -878,6 +926,22 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, NO_SUB_SUPER(13, R13) NO_SUB_SUPER(14, R14) NO_SUB_SUPER(15, R15) + NO_SUB_SUPER(16, R16) + NO_SUB_SUPER(17, R17) + NO_SUB_SUPER(18, R18) + NO_SUB_SUPER(19, R19) + NO_SUB_SUPER(20, R20) + NO_SUB_SUPER(21, R21) + NO_SUB_SUPER(22, R22) + NO_SUB_SUPER(23, R23) + NO_SUB_SUPER(24, R24) + NO_SUB_SUPER(25, R25) + NO_SUB_SUPER(26, R26) + NO_SUB_SUPER(27, R27) + NO_SUB_SUPER(28, R28) + NO_SUB_SUPER(29, R29) + NO_SUB_SUPER(30, R30) + NO_SUB_SUPER(31, R31) } } } diff --git a/llvm/test/CodeGen/X86/asm-mismatched-types.ll b/llvm/test/CodeGen/X86/asm-mismatched-types.ll index 97f9c0872f8f5..47525e025f1dc 100644 --- a/llvm/test/CodeGen/X86/asm-mismatched-types.ll +++ b/llvm/test/CodeGen/X86/asm-mismatched-types.ll @@ -133,3 +133,129 @@ define void @reg8_as_16(i16 %p) { call void asm sideeffect "# REG: $0", "{dil}"(i16 %p) ret void } + +; CHECK-LABEL: egpr_reg64_as_32: +; CHECK: # REG: %r16d +define void @egpr_reg64_as_32(i32 %p) { + call void asm sideeffect "# REG: $0", "{r16}"(i32 %p) + ret void +} + +; CHECK-LABEL: egpr_reg64_as_32_float: +; CHECK: # REG: %r16d +define void @egpr_reg64_as_32_float(float %p) { + call void asm sideeffect "# REG: $0", "{r16}"(float %p) + ret void +} + +; CHECK-LABEL: egpr_reg64_as_16: +; CHECK: # REG: %r17w +define void @egpr_reg64_as_16(i16 %p) { + call void asm sideeffect "# REG: $0", "{r17}"(i16 %p) + ret void +} + +; CHECK-LABEL: egpr_reg64_as_8: +; CHECK: # REG: %r21b +define void @egpr_reg64_as_8(i8 %p) { + call void asm sideeffect "# REG: $0", "{r21}"(i8 %p) + ret void +} + +; CHECK-LABEL: egpr_reg32_as_16: +; CHECK: # REG: %r21w +define void @egpr_reg32_as_16(i16 %p) { + call void asm sideeffect "# REG: $0", "{r21d}"(i16 %p) + ret void +} + +; CHECK-LABEL: egpr_reg32_as_8: +; CHECK: # REG: %r20b +define void @egpr_reg32_as_8(i8 %p) { + call void asm sideeffect "# REG: $0", "{r20d}"(i8 %p) + ret void +} + +; CHECK-LABEL: egpr_reg16_as_8: +; CHECK: # REG: %r17b +define void @egpr_reg16_as_8(i8 %p) { + call void asm sideeffect "# REG: $0", "{r17w}"(i8 %p) + ret void +} + +; CHECK-LABEL: egpr_reg32_as_64: +; CHECK: # REG: %r21 +define void @egpr_reg32_as_64(i64 %p) { + call void asm sideeffect "# REG: $0", "{r21d}"(i64 %p) + ret void +} + +; CHECK-LABEL: egpr_reg32_as_64_float: +; CHECK: # REG: %r21 +define void @egpr_reg32_as_64_float(double %p) { + call void asm sideeffect "# REG: $0", "{r21d}"(double %p) + ret void +} + +; CHECK-LABEL: egpr_reg16_as_64: +; CHECK: # REG: %r21 +define void @egpr_reg16_as_64(i64 %p) { + call void asm sideeffect "# REG: $0", "{r21w}"(i64 %p) + ret void +} + +; CHECK-LABEL: egpr_reg16_as_64_float: +; CHECK: # REG: %r21 +define void @egpr_reg16_as_64_float(double %p) { + call void asm sideeffect "# REG: $0", "{r21w}"(double %p) + ret void +} + +; CHECK-LABEL: egpr_reg8_as_64: +; CHECK: # REG: %r16 +define void @egpr_reg8_as_64(i64 %p) { + call void asm sideeffect "# REG: $0", "{r16b}"(i64 %p) + ret void +} + +; CHECK-LABEL: egpr_reg8_as_64_float: +; CHECK: # REG: %r16 +define void @egpr_reg8_as_64_float(double %p) { + call void asm sideeffect "# REG: $0", "{r16b}"(double %p) + ret void +} + +; CHECK-LABEL: egpr_reg16_as_32: +; CHECK: # REG: %r19d +define void @egpr_reg16_as_32(i32 %p) { + call void asm sideeffect "# REG: $0", "{r19w}"(i32 %p) + ret void +} + +; CHECK-LABEL: egpr_reg16_as_32_float: +; CHECK: # REG: %r19d +define void @egpr_reg16_as_32_float(float %p) { + call void asm sideeffect "# REG: $0", "{r19w}"(float %p) + ret void +} + +; CHECK-LABEL: egpr_reg8_as_32: +; CHECK: # REG: %r17d +define void @egpr_reg8_as_32(i32 %p) { + call void asm sideeffect "# REG: $0", "{r17b}"(i32 %p) + ret void +} + +; CHECK-LABEL: egpr_reg8_as_32_float: +; CHECK: # REG: %r17d +define void @egpr_reg8_as_32_float(float %p) { + call void asm sideeffect "# REG: $0", "{r17b}"(float %p) + ret void +} + +; CHECK-LABEL: egpr_reg8_as_16: +; CHECK: # REG: %r18w +define void @egpr_reg8_as_16(i16 %p) { + call void asm sideeffect "# REG: $0", "{r18b}"(i16 %p) + ret void +} From 09d8b08512d66b56dac99c6a002655d0aa7b3977 Mon Sep 17 00:00:00 2001 From: Shengchen Kan Date: Mon, 27 Nov 2023 09:25:22 +0800 Subject: [PATCH 2/2] Address reivew comments --- .../X86/MCTargetDesc/X86MCTargetDesc.cpp | 196 +++++++++--------- 1 file changed, 100 insertions(+), 96 deletions(-) diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index 3b4638afeaf11..165e9207ef1c2 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -786,6 +786,10 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, #define SP_SUB_SUPER(R) SUB_SUPER(SPL, SP, ESP, RSP, R) #define NO_SUB_SUPER(NO, REG) \ SUB_SUPER(R##NO##B, R##NO##W, R##NO##D, R##NO, REG) +#define NO_SUB_SUPER_B(NO) NO_SUB_SUPER(NO, R##NO##B) +#define NO_SUB_SUPER_W(NO) NO_SUB_SUPER(NO, R##NO##W) +#define NO_SUB_SUPER_D(NO) NO_SUB_SUPER(NO, R##NO##D) +#define NO_SUB_SUPER_Q(NO) NO_SUB_SUPER(NO, R##NO) switch (Size) { default: llvm_unreachable("illegal register size"); @@ -809,30 +813,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, DI_SUB_SUPER(DIL) BP_SUB_SUPER(BPL) SP_SUB_SUPER(SPL) - NO_SUB_SUPER(8, R8B) - NO_SUB_SUPER(9, R9B) - NO_SUB_SUPER(10, R10B) - NO_SUB_SUPER(11, R11B) - NO_SUB_SUPER(12, R12B) - NO_SUB_SUPER(13, R13B) - NO_SUB_SUPER(14, R14B) - NO_SUB_SUPER(15, R15B) - NO_SUB_SUPER(16, R16B) - NO_SUB_SUPER(17, R17B) - NO_SUB_SUPER(18, R18B) - NO_SUB_SUPER(19, R19B) - NO_SUB_SUPER(20, R20B) - NO_SUB_SUPER(21, R21B) - NO_SUB_SUPER(22, R22B) - NO_SUB_SUPER(23, R23B) - NO_SUB_SUPER(24, R24B) - NO_SUB_SUPER(25, R25B) - NO_SUB_SUPER(26, R26B) - NO_SUB_SUPER(27, R27B) - NO_SUB_SUPER(28, R28B) - NO_SUB_SUPER(29, R29B) - NO_SUB_SUPER(30, R30B) - NO_SUB_SUPER(31, R31B) + NO_SUB_SUPER_B(8) + NO_SUB_SUPER_B(9) + NO_SUB_SUPER_B(10) + NO_SUB_SUPER_B(11) + NO_SUB_SUPER_B(12) + NO_SUB_SUPER_B(13) + NO_SUB_SUPER_B(14) + NO_SUB_SUPER_B(15) + NO_SUB_SUPER_B(16) + NO_SUB_SUPER_B(17) + NO_SUB_SUPER_B(18) + NO_SUB_SUPER_B(19) + NO_SUB_SUPER_B(20) + NO_SUB_SUPER_B(21) + NO_SUB_SUPER_B(22) + NO_SUB_SUPER_B(23) + NO_SUB_SUPER_B(24) + NO_SUB_SUPER_B(25) + NO_SUB_SUPER_B(26) + NO_SUB_SUPER_B(27) + NO_SUB_SUPER_B(28) + NO_SUB_SUPER_B(29) + NO_SUB_SUPER_B(30) + NO_SUB_SUPER_B(31) } } case 16: @@ -846,30 +850,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, DI_SUB_SUPER(DI) BP_SUB_SUPER(BP) SP_SUB_SUPER(SP) - NO_SUB_SUPER(8, R8W) - NO_SUB_SUPER(9, R9W) - NO_SUB_SUPER(10, R10W) - NO_SUB_SUPER(11, R11W) - NO_SUB_SUPER(12, R12W) - NO_SUB_SUPER(13, R13W) - NO_SUB_SUPER(14, R14W) - NO_SUB_SUPER(15, R15W) - NO_SUB_SUPER(16, R16W) - NO_SUB_SUPER(17, R17W) - NO_SUB_SUPER(18, R18W) - NO_SUB_SUPER(19, R19W) - NO_SUB_SUPER(20, R20W) - NO_SUB_SUPER(21, R21W) - NO_SUB_SUPER(22, R22W) - NO_SUB_SUPER(23, R23W) - NO_SUB_SUPER(24, R24W) - NO_SUB_SUPER(25, R25W) - NO_SUB_SUPER(26, R26W) - NO_SUB_SUPER(27, R27W) - NO_SUB_SUPER(28, R28W) - NO_SUB_SUPER(29, R29W) - NO_SUB_SUPER(30, R30W) - NO_SUB_SUPER(31, R31W) + NO_SUB_SUPER_W(8) + NO_SUB_SUPER_W(9) + NO_SUB_SUPER_W(10) + NO_SUB_SUPER_W(11) + NO_SUB_SUPER_W(12) + NO_SUB_SUPER_W(13) + NO_SUB_SUPER_W(14) + NO_SUB_SUPER_W(15) + NO_SUB_SUPER_W(16) + NO_SUB_SUPER_W(17) + NO_SUB_SUPER_W(18) + NO_SUB_SUPER_W(19) + NO_SUB_SUPER_W(20) + NO_SUB_SUPER_W(21) + NO_SUB_SUPER_W(22) + NO_SUB_SUPER_W(23) + NO_SUB_SUPER_W(24) + NO_SUB_SUPER_W(25) + NO_SUB_SUPER_W(26) + NO_SUB_SUPER_W(27) + NO_SUB_SUPER_W(28) + NO_SUB_SUPER_W(29) + NO_SUB_SUPER_W(30) + NO_SUB_SUPER_W(31) } case 32: switch (Reg.id()) { @@ -882,30 +886,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, DI_SUB_SUPER(EDI) BP_SUB_SUPER(EBP) SP_SUB_SUPER(ESP) - NO_SUB_SUPER(8, R8D) - NO_SUB_SUPER(9, R9D) - NO_SUB_SUPER(10, R10D) - NO_SUB_SUPER(11, R11D) - NO_SUB_SUPER(12, R12D) - NO_SUB_SUPER(13, R13D) - NO_SUB_SUPER(14, R14D) - NO_SUB_SUPER(15, R15D) - NO_SUB_SUPER(16, R16D) - NO_SUB_SUPER(17, R17D) - NO_SUB_SUPER(18, R18D) - NO_SUB_SUPER(19, R19D) - NO_SUB_SUPER(20, R20D) - NO_SUB_SUPER(21, R21D) - NO_SUB_SUPER(22, R22D) - NO_SUB_SUPER(23, R23D) - NO_SUB_SUPER(24, R24D) - NO_SUB_SUPER(25, R25D) - NO_SUB_SUPER(26, R26D) - NO_SUB_SUPER(27, R27D) - NO_SUB_SUPER(28, R28D) - NO_SUB_SUPER(29, R29D) - NO_SUB_SUPER(30, R30D) - NO_SUB_SUPER(31, R31D) + NO_SUB_SUPER_D(8) + NO_SUB_SUPER_D(9) + NO_SUB_SUPER_D(10) + NO_SUB_SUPER_D(11) + NO_SUB_SUPER_D(12) + NO_SUB_SUPER_D(13) + NO_SUB_SUPER_D(14) + NO_SUB_SUPER_D(15) + NO_SUB_SUPER_D(16) + NO_SUB_SUPER_D(17) + NO_SUB_SUPER_D(18) + NO_SUB_SUPER_D(19) + NO_SUB_SUPER_D(20) + NO_SUB_SUPER_D(21) + NO_SUB_SUPER_D(22) + NO_SUB_SUPER_D(23) + NO_SUB_SUPER_D(24) + NO_SUB_SUPER_D(25) + NO_SUB_SUPER_D(26) + NO_SUB_SUPER_D(27) + NO_SUB_SUPER_D(28) + NO_SUB_SUPER_D(29) + NO_SUB_SUPER_D(30) + NO_SUB_SUPER_D(31) } case 64: switch (Reg.id()) { @@ -918,30 +922,30 @@ MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, DI_SUB_SUPER(RDI) BP_SUB_SUPER(RBP) SP_SUB_SUPER(RSP) - NO_SUB_SUPER(8, R8) - NO_SUB_SUPER(9, R9) - NO_SUB_SUPER(10, R10) - NO_SUB_SUPER(11, R11) - NO_SUB_SUPER(12, R12) - NO_SUB_SUPER(13, R13) - NO_SUB_SUPER(14, R14) - NO_SUB_SUPER(15, R15) - NO_SUB_SUPER(16, R16) - NO_SUB_SUPER(17, R17) - NO_SUB_SUPER(18, R18) - NO_SUB_SUPER(19, R19) - NO_SUB_SUPER(20, R20) - NO_SUB_SUPER(21, R21) - NO_SUB_SUPER(22, R22) - NO_SUB_SUPER(23, R23) - NO_SUB_SUPER(24, R24) - NO_SUB_SUPER(25, R25) - NO_SUB_SUPER(26, R26) - NO_SUB_SUPER(27, R27) - NO_SUB_SUPER(28, R28) - NO_SUB_SUPER(29, R29) - NO_SUB_SUPER(30, R30) - NO_SUB_SUPER(31, R31) + NO_SUB_SUPER_Q(8) + NO_SUB_SUPER_Q(9) + NO_SUB_SUPER_Q(10) + NO_SUB_SUPER_Q(11) + NO_SUB_SUPER_Q(12) + NO_SUB_SUPER_Q(13) + NO_SUB_SUPER_Q(14) + NO_SUB_SUPER_Q(15) + NO_SUB_SUPER_Q(16) + NO_SUB_SUPER_Q(17) + NO_SUB_SUPER_Q(18) + NO_SUB_SUPER_Q(19) + NO_SUB_SUPER_Q(20) + NO_SUB_SUPER_Q(21) + NO_SUB_SUPER_Q(22) + NO_SUB_SUPER_Q(23) + NO_SUB_SUPER_Q(24) + NO_SUB_SUPER_Q(25) + NO_SUB_SUPER_Q(26) + NO_SUB_SUPER_Q(27) + NO_SUB_SUPER_Q(28) + NO_SUB_SUPER_Q(29) + NO_SUB_SUPER_Q(30) + NO_SUB_SUPER_Q(31) } } }