diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86InstructionSelector.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86InstructionSelector.cpp | 99 |
1 files changed, 26 insertions, 73 deletions
diff --git a/llvm/lib/Target/X86/X86InstructionSelector.cpp b/llvm/lib/Target/X86/X86InstructionSelector.cpp index 60fb4d2ef4bf..ff531713037c 100644 --- a/llvm/lib/Target/X86/X86InstructionSelector.cpp +++ b/llvm/lib/Target/X86/X86InstructionSelector.cpp @@ -214,8 +214,8 @@ static unsigned getSubRegIndex(const TargetRegisterClass *RC) { return SubIdx; } -static const TargetRegisterClass *getRegClassFromGRPhysReg(unsigned Reg) { - assert(Register::isPhysicalRegister(Reg)); +static const TargetRegisterClass *getRegClassFromGRPhysReg(Register Reg) { + assert(Reg.isPhysical()); if (X86::GR64RegClass.contains(Reg)) return &X86::GR64RegClass; if (X86::GR32RegClass.contains(Reg)) @@ -239,7 +239,7 @@ bool X86InstructionSelector::selectCopy(MachineInstr &I, const unsigned SrcSize = RBI.getSizeInBits(SrcReg, MRI, TRI); const RegisterBank &SrcRegBank = *RBI.getRegBank(SrcReg, MRI, TRI); - if (Register::isPhysicalRegister(DstReg)) { + if (DstReg.isPhysical()) { assert(I.isCopy() && "Generic operators do not allow physical registers"); if (DstSize > SrcSize && SrcRegBank.getID() == X86::GPRRegBankID && @@ -266,12 +266,12 @@ bool X86InstructionSelector::selectCopy(MachineInstr &I, return true; } - assert((!Register::isPhysicalRegister(SrcReg) || I.isCopy()) && + assert((!SrcReg.isPhysical() || I.isCopy()) && "No phys reg on generic operators"); assert((DstSize == SrcSize || // Copies are a mean to setup initial types, the number of // bits may not exactly match. - (Register::isPhysicalRegister(SrcReg) && + (SrcReg.isPhysical() && DstSize <= RBI.getSizeInBits(SrcReg, MRI, TRI))) && "Copy with different width?!"); @@ -280,7 +280,7 @@ bool X86InstructionSelector::selectCopy(MachineInstr &I, if (SrcRegBank.getID() == X86::GPRRegBankID && DstRegBank.getID() == X86::GPRRegBankID && SrcSize > DstSize && - Register::isPhysicalRegister(SrcReg)) { + SrcReg.isPhysical()) { // Change the physical register to performe truncate. const TargetRegisterClass *SrcRC = getRegClassFromGRPhysReg(SrcReg); @@ -479,7 +479,7 @@ static void X86SelectAddress(const MachineInstr &I, "unsupported type."); if (I.getOpcode() == TargetOpcode::G_PTR_ADD) { - if (auto COff = getConstantVRegVal(I.getOperand(2).getReg(), MRI)) { + if (auto COff = getConstantVRegSExtVal(I.getOperand(2).getReg(), MRI)) { int64_t Imm = *COff; if (isInt<32>(Imm)) { // Check for displacement overflow. AM.Disp = static_cast<int32_t>(Imm); @@ -780,69 +780,18 @@ bool X86InstructionSelector::selectZext(MachineInstr &I, const LLT DstTy = MRI.getType(DstReg); const LLT SrcTy = MRI.getType(SrcReg); + assert(!(SrcTy == LLT::scalar(8) && DstTy == LLT::scalar(16)) && + "8=>16 Zext is handled by tablegen"); assert(!(SrcTy == LLT::scalar(8) && DstTy == LLT::scalar(32)) && "8=>32 Zext is handled by tablegen"); assert(!(SrcTy == LLT::scalar(16) && DstTy == LLT::scalar(32)) && "16=>32 Zext is handled by tablegen"); - - const static struct ZextEntry { - LLT SrcTy; - LLT DstTy; - unsigned MovOp; - bool NeedSubregToReg; - } OpTable[] = { - {LLT::scalar(8), LLT::scalar(16), X86::MOVZX16rr8, false}, // i8 => i16 - {LLT::scalar(8), LLT::scalar(64), X86::MOVZX32rr8, true}, // i8 => i64 - {LLT::scalar(16), LLT::scalar(64), X86::MOVZX32rr16, true}, // i16 => i64 - {LLT::scalar(32), LLT::scalar(64), 0, true} // i32 => i64 - }; - - auto ZextEntryIt = - std::find_if(std::begin(OpTable), std::end(OpTable), - [SrcTy, DstTy](const ZextEntry &El) { - return El.DstTy == DstTy && El.SrcTy == SrcTy; - }); - - // Here we try to select Zext into a MOVZ and/or SUBREG_TO_REG instruction. - if (ZextEntryIt != std::end(OpTable)) { - const RegisterBank &DstRB = *RBI.getRegBank(DstReg, MRI, TRI); - const RegisterBank &SrcRB = *RBI.getRegBank(SrcReg, MRI, TRI); - const TargetRegisterClass *DstRC = getRegClass(DstTy, DstRB); - const TargetRegisterClass *SrcRC = getRegClass(SrcTy, SrcRB); - - if (!RBI.constrainGenericRegister(SrcReg, *SrcRC, MRI) || - !RBI.constrainGenericRegister(DstReg, *DstRC, MRI)) { - LLVM_DEBUG(dbgs() << "Failed to constrain " << TII.getName(I.getOpcode()) - << " operand\n"); - return false; - } - - unsigned TransitRegTo = DstReg; - unsigned TransitRegFrom = SrcReg; - if (ZextEntryIt->MovOp) { - // If we select Zext into MOVZ + SUBREG_TO_REG, we need to have - // a transit register in between: create it here. - if (ZextEntryIt->NeedSubregToReg) { - TransitRegFrom = MRI.createVirtualRegister( - getRegClass(LLT::scalar(32), DstReg, MRI)); - TransitRegTo = TransitRegFrom; - } - - BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(ZextEntryIt->MovOp)) - .addDef(TransitRegTo) - .addReg(SrcReg); - } - if (ZextEntryIt->NeedSubregToReg) { - BuildMI(*I.getParent(), I, I.getDebugLoc(), - TII.get(TargetOpcode::SUBREG_TO_REG)) - .addDef(DstReg) - .addImm(0) - .addReg(TransitRegFrom) - .addImm(X86::sub_32bit); - } - I.eraseFromParent(); - return true; - } + assert(!(SrcTy == LLT::scalar(8) && DstTy == LLT::scalar(64)) && + "8=>64 Zext is handled by tablegen"); + assert(!(SrcTy == LLT::scalar(16) && DstTy == LLT::scalar(64)) && + "16=>64 Zext is handled by tablegen"); + assert(!(SrcTy == LLT::scalar(32) && DstTy == LLT::scalar(64)) && + "32=>64 Zext is handled by tablegen"); if (SrcTy != LLT::scalar(1)) return false; @@ -859,12 +808,17 @@ bool X86InstructionSelector::selectZext(MachineInstr &I, else return false; - unsigned DefReg = SrcReg; + Register DefReg = SrcReg; if (DstTy != LLT::scalar(8)) { + Register ImpDefReg = + MRI.createVirtualRegister(getRegClass(DstTy, DstReg, MRI)); + BuildMI(*I.getParent(), I, I.getDebugLoc(), + TII.get(TargetOpcode::IMPLICIT_DEF), ImpDefReg); + DefReg = MRI.createVirtualRegister(getRegClass(DstTy, DstReg, MRI)); BuildMI(*I.getParent(), I, I.getDebugLoc(), - TII.get(TargetOpcode::SUBREG_TO_REG), DefReg) - .addImm(0) + TII.get(TargetOpcode::INSERT_SUBREG), DefReg) + .addReg(ImpDefReg) .addReg(SrcReg) .addImm(X86::sub_8bit); } @@ -1605,10 +1559,9 @@ bool X86InstructionSelector::selectDivRem(MachineInstr &I, }}, // i64 }; - auto OpEntryIt = std::find_if(std::begin(OpTable), std::end(OpTable), - [RegTy](const DivRemEntry &El) { - return El.SizeInBits == RegTy.getSizeInBits(); - }); + auto OpEntryIt = llvm::find_if(OpTable, [RegTy](const DivRemEntry &El) { + return El.SizeInBits == RegTy.getSizeInBits(); + }); if (OpEntryIt == std::end(OpTable)) return false; |
