diff options
-rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.td | 104 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/dynamic-regmask.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/ipra-inline-asm.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/ipra-reg-usage.ll | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/tail-call-conditional.mir | 2 | ||||
-rw-r--r-- | llvm/utils/TableGen/CodeGenRegisters.cpp | 12 |
7 files changed, 87 insertions, 44 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index f979cc51da4..55842a4a209 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -552,6 +552,10 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const { Reserved.set(X86::DIL); Reserved.set(X86::BPL); Reserved.set(X86::SPL); + Reserved.set(X86::SIH); + Reserved.set(X86::DIH); + Reserved.set(X86::BPH); + Reserved.set(X86::SPH); for (unsigned n = 0; n != 8; ++n) { // R8, R9, ... @@ -571,7 +575,8 @@ BitVector X86RegisterInfo::getReservedRegs(const MachineFunction &MF) const { } assert(checkAllSuperRegsMarked(Reserved, - {X86::SIL, X86::DIL, X86::BPL, X86::SPL})); + {X86::SIL, X86::DIL, X86::BPL, X86::SPL, + X86::SIH, X86::DIH, X86::BPH, X86::SPH})); return Reserved; } diff --git a/llvm/lib/Target/X86/X86RegisterInfo.td b/llvm/lib/Target/X86/X86RegisterInfo.td index 8f7f383de3e..a462e6a877b 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.td +++ b/llvm/lib/Target/X86/X86RegisterInfo.td @@ -23,6 +23,7 @@ class X86Reg<string n, bits<16> Enc, list<Register> subregs = []> : Register<n> let Namespace = "X86" in { def sub_8bit : SubRegIndex<8>; def sub_8bit_hi : SubRegIndex<8, 8>; + def sub_8bit_hi_phony : SubRegIndex<8, 8>; def sub_16bit : SubRegIndex<16>; def sub_16bit_hi : SubRegIndex<16, 16>; def sub_32bit : SubRegIndex<32>; @@ -74,6 +75,40 @@ def R14B : X86Reg<"r14b", 14>; def R15B : X86Reg<"r15b", 15>; } +let isArtificial = 1 in { +// High byte of the low 16 bits of the super-register: +def SIH : X86Reg<"", -1>; +def DIH : X86Reg<"", -1>; +def BPH : X86Reg<"", -1>; +def SPH : X86Reg<"", -1>; +def R8BH : X86Reg<"", -1>; +def R9BH : X86Reg<"", -1>; +def R10BH : X86Reg<"", -1>; +def R11BH : X86Reg<"", -1>; +def R12BH : X86Reg<"", -1>; +def R13BH : X86Reg<"", -1>; +def R14BH : X86Reg<"", -1>; +def R15BH : X86Reg<"", -1>; +// High word of the low 32 bits of the super-register: +def HAX : X86Reg<"", -1>; +def HDX : X86Reg<"", -1>; +def HCX : X86Reg<"", -1>; +def HBX : X86Reg<"", -1>; +def HSI : X86Reg<"", -1>; +def HDI : X86Reg<"", -1>; +def HBP : X86Reg<"", -1>; +def HSP : X86Reg<"", -1>; +def HIP : X86Reg<"", -1>; +def R8WH : X86Reg<"", -1>; +def R9WH : X86Reg<"", -1>; +def R10WH : X86Reg<"", -1>; +def R11WH : X86Reg<"", -1>; +def R12WH : X86Reg<"", -1>; +def R13WH : X86Reg<"", -1>; +def R14WH : X86Reg<"", -1>; +def R15WH : X86Reg<"", -1>; +} + // 16-bit registers let SubRegIndices = [sub_8bit, sub_8bit_hi], CoveredBySubRegs = 1 in { def AX : X86Reg<"ax", 0, [AL,AH]>; @@ -81,36 +116,25 @@ def DX : X86Reg<"dx", 2, [DL,DH]>; def CX : X86Reg<"cx", 1, [CL,CH]>; def BX : X86Reg<"bx", 3, [BL,BH]>; } -let SubRegIndices = [sub_8bit] in { -def SI : X86Reg<"si", 6, [SIL]>; -def DI : X86Reg<"di", 7, [DIL]>; -def BP : X86Reg<"bp", 5, [BPL]>; -def SP : X86Reg<"sp", 4, [SPL]>; +let SubRegIndices = [sub_8bit, sub_8bit_hi_phony], CoveredBySubRegs = 1 in { +def SI : X86Reg<"si", 6, [SIL,SIH]>; +def DI : X86Reg<"di", 7, [DIL,DIH]>; +def BP : X86Reg<"bp", 5, [BPL,BPH]>; +def SP : X86Reg<"sp", 4, [SPL,SPH]>; } def IP : X86Reg<"ip", 0>; -let isArtificial = 1 in { - def HAX : X86Reg<"", -1>; - def HDX : X86Reg<"", -3>; - def HCX : X86Reg<"", -2>; - def HBX : X86Reg<"", -4>; - def HSI : X86Reg<"", -7>; - def HDI : X86Reg<"", -8>; - def HBP : X86Reg<"", -6>; - def HSP : X86Reg<"", -5>; - def HIP : X86Reg<"", -1>; -} - // X86-64 only, requires REX. -let SubRegIndices = [sub_8bit], CostPerUse = 1 in { -def R8W : X86Reg<"r8w", 8, [R8B]>; -def R9W : X86Reg<"r9w", 9, [R9B]>; -def R10W : X86Reg<"r10w", 10, [R10B]>; -def R11W : X86Reg<"r11w", 11, [R11B]>; -def R12W : X86Reg<"r12w", 12, [R12B]>; -def R13W : X86Reg<"r13w", 13, [R13B]>; -def R14W : X86Reg<"r14w", 14, [R14B]>; -def R15W : X86Reg<"r15w", 15, [R15B]>; +let SubRegIndices = [sub_8bit, sub_8bit_hi_phony], CostPerUse = 1, + CoveredBySubRegs = 1 in { +def R8W : X86Reg<"r8w", 8, [R8B,R8BH]>; +def R9W : X86Reg<"r9w", 9, [R9B,R9BH]>; +def R10W : X86Reg<"r10w", 10, [R10B,R10BH]>; +def R11W : X86Reg<"r11w", 11, [R11B,R11BH]>; +def R12W : X86Reg<"r12w", 12, [R12B,R12BH]>; +def R13W : X86Reg<"r13w", 13, [R13B,R13BH]>; +def R14W : X86Reg<"r14w", 14, [R14B,R14BH]>; +def R15W : X86Reg<"r15w", 15, [R15B,R15BH]>; } // 32-bit registers @@ -127,15 +151,16 @@ def EIP : X86Reg<"eip", 0, [IP, HIP]>, DwarfRegNum<[-2, 8, 8]>; } // X86-64 only, requires REX -let SubRegIndices = [sub_16bit], CostPerUse = 1 in { -def R8D : X86Reg<"r8d", 8, [R8W]>; -def R9D : X86Reg<"r9d", 9, [R9W]>; -def R10D : X86Reg<"r10d", 10, [R10W]>; -def R11D : X86Reg<"r11d", 11, [R11W]>; -def R12D : X86Reg<"r12d", 12, [R12W]>; -def R13D : X86Reg<"r13d", 13, [R13W]>; -def R14D : X86Reg<"r14d", 14, [R14W]>; -def R15D : X86Reg<"r15d", 15, [R15W]>; +let SubRegIndices = [sub_16bit, sub_16bit_hi], CostPerUse = 1, + CoveredBySubRegs = 1 in { +def R8D : X86Reg<"r8d", 8, [R8W,R8WH]>; +def R9D : X86Reg<"r9d", 9, [R9W,R9WH]>; +def R10D : X86Reg<"r10d", 10, [R10W,R10WH]>; +def R11D : X86Reg<"r11d", 11, [R11W,R11WH]>; +def R12D : X86Reg<"r12d", 12, [R12W,R12WH]>; +def R13D : X86Reg<"r13d", 13, [R13W,R13WH]>; +def R14D : X86Reg<"r14d", 14, [R14W,R14WH]>; +def R15D : X86Reg<"r15d", 15, [R15W,R15WH]>; } // 64-bit registers, X86-64 only @@ -361,13 +386,20 @@ def GR8 : RegisterClass<"X86", [i8], 8, }]; } +let isAllocatable = 0 in +def GRH8 : RegisterClass<"X86", [i8], 8, + (add SIH, DIH, BPH, SPH, R8BH, R9BH, R10BH, R11BH, + R12BH, R13BH, R14BH, R15BH)>; + def GR16 : RegisterClass<"X86", [i16], 16, (add AX, CX, DX, SI, DI, BX, BP, SP, R8W, R9W, R10W, R11W, R14W, R15W, R12W, R13W)>; let isAllocatable = 0 in def GRH16 : RegisterClass<"X86", [i16], 16, - (add HAX, HCX, HDX, HSI, HDI, HBX, HBP, HSP, HIP)>; + (add HAX, HCX, HDX, HSI, HDI, HBX, HBP, HSP, HIP, + R8WH, R9WH, R10WH, R11WH, R12WH, R13WH, R14WH, + R15WH)>; def GR32 : RegisterClass<"X86", [i32], 32, (add EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP, diff --git a/llvm/test/CodeGen/X86/dynamic-regmask.ll b/llvm/test/CodeGen/X86/dynamic-regmask.ll index b84fe816fc7..6280eac13ac 100644 --- a/llvm/test/CodeGen/X86/dynamic-regmask.ll +++ b/llvm/test/CodeGen/X86/dynamic-regmask.ll @@ -11,7 +11,7 @@ define i32 @caller(i32 %a0) nounwind { ret i32 %b2 } ; CHECK: name: caller -; CHECK: CALL64pcrel32 @callee, CustomRegMask($bh,$bl,$bp,$bpl,$bx,$ebp,$ebx,$esp,$hbp,$hbx,$hsp,$rbp,$rbx,$rsp,$sp,$spl,$r10,$r11,$r12,$r13,$r14,$r15,$xmm8,$xmm9,$xmm10,$xmm11,$xmm12,$xmm13,$xmm14,$xmm15,$r10b,$r11b,$r12b,$r13b,$r14b,$r15b,$r10d,$r11d,$r12d,$r13d,$r14d,$r15d,$r10w,$r11w,$r12w,$r13w,$r14w,$r15w), implicit $rsp, implicit $ssp, implicit $eax, implicit $ecx, implicit $edx, implicit $edi, implicit $esi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax +; CHECK: CALL64pcrel32 @callee, CustomRegMask($bh,$bl,$bp,$bph,$bpl,$bx,$ebp,$ebx,$esp,$hbp,$hbx,$hsp,$rbp,$rbx,$rsp,$sp,$sph,$spl,$r10,$r11,$r12,$r13,$r14,$r15,$xmm8,$xmm9,$xmm10,$xmm11,$xmm12,$xmm13,$xmm14,$xmm15,$r10b,$r11b,$r12b,$r13b,$r14b,$r15b,$r10bh,$r11bh,$r12bh,$r13bh,$r14bh,$r15bh,$r10d,$r11d,$r12d,$r13d,$r14d,$r15d,$r10w,$r11w,$r12w,$r13w,$r14w,$r15w,$r10wh,$r11wh,$r12wh,$r13wh,$r14wh,$r15wh), implicit $rsp, implicit $ssp, implicit $eax, implicit $ecx, implicit $edx, implicit $edi, implicit $esi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax ; CHECK: RET 0, $eax define x86_regcallcc {i32, i32, i32} @test_callee(i32 %a0, i32 %b0, i32 %c0, i32 %d0, i32 %e0) nounwind { diff --git a/llvm/test/CodeGen/X86/ipra-inline-asm.ll b/llvm/test/CodeGen/X86/ipra-inline-asm.ll index 4e67a974fe3..94d0e7842fd 100644 --- a/llvm/test/CodeGen/X86/ipra-inline-asm.ll +++ b/llvm/test/CodeGen/X86/ipra-inline-asm.ll @@ -11,7 +11,7 @@ define void @bar() #0 { } ; Verifies that inline assembly is correctly handled by giving a list of clobbered registers -; CHECK: foo Clobbered Registers: $ah $al $ax $ch $cl $cx $di $dil $eax $ecx $edi $hax $hcx $hdi $rax $rcx $rdi +; CHECK: foo Clobbered Registers: $ah $al $ax $ch $cl $cx $di $dih $dil $eax $ecx $edi $hax $hcx $hdi $rax $rcx $rdi define void @foo() #0 { call void asm sideeffect "", "~{eax},~{ecx},~{edi}"() #0 ret void diff --git a/llvm/test/CodeGen/X86/ipra-reg-usage.ll b/llvm/test/CodeGen/X86/ipra-reg-usage.ll index 30cc53b4f8d..3e57ef21844 100644 --- a/llvm/test/CodeGen/X86/ipra-reg-usage.ll +++ b/llvm/test/CodeGen/X86/ipra-reg-usage.ll @@ -3,7 +3,7 @@ target triple = "x86_64-unknown-unknown" declare void @bar1() define preserve_allcc void @foo()#0 { -; CHECK: foo Clobbered Registers: $cs $df $ds $eflags $eip $eiz $es $fpsw $fs $gs $hip $ip $rip $riz $ss $ssp $bnd0 $bnd1 $bnd2 $bnd3 $cr0 $cr1 $cr2 $cr3 $cr4 $cr5 $cr6 $cr7 $cr8 $cr9 $cr10 $cr11 $cr12 $cr13 $cr14 $cr15 $dr0 $dr1 $dr2 $dr3 $dr4 $dr5 $dr6 $dr7 $dr8 $dr9 $dr10 $dr11 $dr12 $dr13 $dr14 $dr15 $fp0 $fp1 $fp2 $fp3 $fp4 $fp5 $fp6 $fp7 $k0 $k1 $k2 $k3 $k4 $k5 $k6 $k7 $mm0 $mm1 $mm2 $mm3 $mm4 $mm5 $mm6 $mm7 $r11 $st0 $st1 $st2 $st3 $st4 $st5 $st6 $st7 $xmm16 $xmm17 $xmm18 $xmm19 $xmm20 $xmm21 $xmm22 $xmm23 $xmm24 $xmm25 $xmm26 $xmm27 $xmm28 $xmm29 $xmm30 $xmm31 $ymm0 $ymm1 $ymm2 $ymm3 $ymm4 $ymm5 $ymm6 $ymm7 $ymm8 $ymm9 $ymm10 $ymm11 $ymm12 $ymm13 $ymm14 $ymm15 $ymm16 $ymm17 $ymm18 $ymm19 $ymm20 $ymm21 $ymm22 $ymm23 $ymm24 $ymm25 $ymm26 $ymm27 $ymm28 $ymm29 $ymm30 $ymm31 $zmm0 $zmm1 $zmm2 $zmm3 $zmm4 $zmm5 $zmm6 $zmm7 $zmm8 $zmm9 $zmm10 $zmm11 $zmm12 $zmm13 $zmm14 $zmm15 $zmm16 $zmm17 $zmm18 $zmm19 $zmm20 $zmm21 $zmm22 $zmm23 $zmm24 $zmm25 $zmm26 $zmm27 $zmm28 $zmm29 $zmm30 $zmm31 $r11b $r11d $r11w +; CHECK: foo Clobbered Registers: $cs $df $ds $eflags $eip $eiz $es $fpsw $fs $gs $hip $ip $rip $riz $ss $ssp $bnd0 $bnd1 $bnd2 $bnd3 $cr0 $cr1 $cr2 $cr3 $cr4 $cr5 $cr6 $cr7 $cr8 $cr9 $cr10 $cr11 $cr12 $cr13 $cr14 $cr15 $dr0 $dr1 $dr2 $dr3 $dr4 $dr5 $dr6 $dr7 $dr8 $dr9 $dr10 $dr11 $dr12 $dr13 $dr14 $dr15 $fp0 $fp1 $fp2 $fp3 $fp4 $fp5 $fp6 $fp7 $k0 $k1 $k2 $k3 $k4 $k5 $k6 $k7 $mm0 $mm1 $mm2 $mm3 $mm4 $mm5 $mm6 $mm7 $r11 $st0 $st1 $st2 $st3 $st4 $st5 $st6 $st7 $xmm16 $xmm17 $xmm18 $xmm19 $xmm20 $xmm21 $xmm22 $xmm23 $xmm24 $xmm25 $xmm26 $xmm27 $xmm28 $xmm29 $xmm30 $xmm31 $ymm0 $ymm1 $ymm2 $ymm3 $ymm4 $ymm5 $ymm6 $ymm7 $ymm8 $ymm9 $ymm10 $ymm11 $ymm12 $ymm13 $ymm14 $ymm15 $ymm16 $ymm17 $ymm18 $ymm19 $ymm20 $ymm21 $ymm22 $ymm23 $ymm24 $ymm25 $ymm26 $ymm27 $ymm28 $ymm29 $ymm30 $ymm31 $zmm0 $zmm1 $zmm2 $zmm3 $zmm4 $zmm5 $zmm6 $zmm7 $zmm8 $zmm9 $zmm10 $zmm11 $zmm12 $zmm13 $zmm14 $zmm15 $zmm16 $zmm17 $zmm18 $zmm19 $zmm20 $zmm21 $zmm22 $zmm23 $zmm24 $zmm25 $zmm26 $zmm27 $zmm28 $zmm29 $zmm30 $zmm31 $r11b $r11bh $r11d $r11w $r11wh call void @bar1() call void @bar2() ret void diff --git a/llvm/test/CodeGen/X86/tail-call-conditional.mir b/llvm/test/CodeGen/X86/tail-call-conditional.mir index 47ae83dad7f..22d315e4a86 100644 --- a/llvm/test/CodeGen/X86/tail-call-conditional.mir +++ b/llvm/test/CodeGen/X86/tail-call-conditional.mir @@ -48,7 +48,7 @@ body: | ; CHECK-NEXT: $rdi = COPY $rsi ; CHECK-NEXT: $rsi = COPY $rax ; CHECK-NEXT: CMP64ri8 $rax, 9, implicit-def $eflags - ; CHECK-NEXT: TCRETURNdi64cc @f1, 0, 3, csr_64, implicit $rsp, implicit $eflags, implicit $ssp, implicit $rsp, implicit $rdi, implicit $rsi, implicit $rdi, implicit-def $rdi, implicit $hsi, implicit-def $hsi, implicit $sil, implicit-def $sil, implicit $si, implicit-def $si, implicit $esi, implicit-def $esi, implicit $rsi, implicit-def $rsi, implicit $hdi, implicit-def $hdi, implicit $dil, implicit-def $dil, implicit $di, implicit-def $di, implicit $edi, implicit-def $edi + ; CHECK-NEXT: TCRETURNdi64cc @f1, 0, 3, csr_64, implicit $rsp, implicit $eflags, implicit $ssp, implicit $rsp, implicit $rdi, implicit $rsi, implicit $rdi, implicit-def $rdi, implicit $hsi, implicit-def $hsi, implicit $sih, implicit-def $sih, implicit $sil, implicit-def $sil, implicit $si, implicit-def $si, implicit $esi, implicit-def $esi, implicit $rsi, implicit-def $rsi, implicit $hdi, implicit-def $hdi, implicit $dih, implicit-def $dih, implicit $dil, implicit-def $dil, implicit $di, implicit-def $di, implicit $edi, implicit-def $edi bb.1: successors: %bb.2, %bb.3 diff --git a/llvm/utils/TableGen/CodeGenRegisters.cpp b/llvm/utils/TableGen/CodeGenRegisters.cpp index e05f9481012..b0d13b7d38f 100644 --- a/llvm/utils/TableGen/CodeGenRegisters.cpp +++ b/llvm/utils/TableGen/CodeGenRegisters.cpp @@ -388,13 +388,17 @@ CodeGenRegister::computeSubRegs(CodeGenRegBank &RegBank) { // user already specified. for (unsigned i = 0, e = ExplicitSubRegs.size(); i != e; ++i) { CodeGenRegister *SR = ExplicitSubRegs[i]; - if (!SR->CoveredBySubRegs || SR->ExplicitSubRegs.size() <= 1) + if (!SR->CoveredBySubRegs || SR->ExplicitSubRegs.size() <= 1 || + SR->Artificial) continue; // SR is composed of multiple sub-regs. Find their names in this register. SmallVector<CodeGenSubRegIndex*, 8> Parts; - for (unsigned j = 0, e = SR->ExplicitSubRegs.size(); j != e; ++j) - Parts.push_back(getSubRegIndex(SR->ExplicitSubRegs[j])); + for (unsigned j = 0, e = SR->ExplicitSubRegs.size(); j != e; ++j) { + CodeGenSubRegIndex &I = *SR->ExplicitSubRegIndices[j]; + if (!I.Artificial) + Parts.push_back(getSubRegIndex(SR->ExplicitSubRegs[j])); + } // Offer this as an existing spelling for the concatenation of Parts. CodeGenSubRegIndex &Idx = *ExplicitSubRegIndices[i]; @@ -2180,6 +2184,8 @@ void CodeGenRegBank::inferMatchingSuperRegClass(CodeGenRegisterClass *RC, for (auto I = FirstSubRegRC, E = std::prev(RegClasses.end()); I != std::next(E); ++I) { CodeGenRegisterClass &SubRC = *I; + if (SubRC.Artificial) + continue; // Topological shortcut: SubRC members have the wrong shape. if (!TopoSigs.anyCommon(SubRC.getTopoSigs())) continue; |