diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index af5cb1215abcc..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,14 +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_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: @@ -830,14 +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_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()) { @@ -850,14 +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_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()) { @@ -870,14 +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_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) } } } 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 +}