45#define DEBUG_TYPE "reginfo"
47#define GET_REGINFO_TARGET_DESC
48#include "PPCGenRegisterInfo.inc"
50STATISTIC(InflateGPRC,
"Number of gprc inputs for getLargestLegalClass");
51STATISTIC(InflateGP8RC,
"Number of g8rc inputs for getLargestLegalClass");
55 cl::desc(
"Enable use of a base pointer for complex stack frames"));
59 cl::desc(
"Force the use of a base pointer in every function"));
63 cl::desc(
"Enable spills from gpr to vsr rather than stack"));
67 cl::desc(
"Consider R1 caller preserved so stack saves of "
68 "caller preserved registers can be LICM candidates"),
73 cl::desc(
"Maximum search distance for definition of CR bit "
87 cl::desc(
"Emit information about accumulator register spills "
99 TM.isPPC64() ? 0 : 1),
101 ImmToIdxMap[PPC::LD] = PPC::LDX; ImmToIdxMap[PPC::STD] = PPC::STDX;
102 ImmToIdxMap[PPC::LBZ] = PPC::LBZX; ImmToIdxMap[PPC::STB] = PPC::STBX;
103 ImmToIdxMap[PPC::LHZ] = PPC::LHZX; ImmToIdxMap[PPC::LHA] = PPC::LHAX;
104 ImmToIdxMap[PPC::LWZ] = PPC::LWZX; ImmToIdxMap[PPC::LWA] = PPC::LWAX;
105 ImmToIdxMap[PPC::LFS] = PPC::LFSX; ImmToIdxMap[PPC::LFD] = PPC::LFDX;
106 ImmToIdxMap[PPC::STH] = PPC::STHX; ImmToIdxMap[PPC::STW] = PPC::STWX;
107 ImmToIdxMap[PPC::STFS] = PPC::STFSX; ImmToIdxMap[PPC::STFD] = PPC::STFDX;
108 ImmToIdxMap[PPC::ADDI] = PPC::ADD4;
109 ImmToIdxMap[PPC::LWA_32] = PPC::LWAX_32;
112 ImmToIdxMap[PPC::LHA8] = PPC::LHAX8; ImmToIdxMap[PPC::LBZ8] = PPC::LBZX8;
113 ImmToIdxMap[PPC::LHZ8] = PPC::LHZX8; ImmToIdxMap[PPC::LWZ8] = PPC::LWZX8;
114 ImmToIdxMap[PPC::STB8] = PPC::STBX8; ImmToIdxMap[PPC::STH8] = PPC::STHX8;
115 ImmToIdxMap[PPC::STW8] = PPC::STWX8; ImmToIdxMap[PPC::STDU] = PPC::STDUX;
116 ImmToIdxMap[PPC::ADDI8] = PPC::ADD8;
117 ImmToIdxMap[PPC::LQ] = PPC::LQX_PSEUDO;
118 ImmToIdxMap[PPC::STQ] = PPC::STQX_PSEUDO;
121 ImmToIdxMap[PPC::DFLOADf32] = PPC::LXSSPX;
122 ImmToIdxMap[PPC::DFLOADf64] = PPC::LXSDX;
123 ImmToIdxMap[PPC::SPILLTOVSR_LD] = PPC::SPILLTOVSR_LDX;
124 ImmToIdxMap[PPC::SPILLTOVSR_ST] = PPC::SPILLTOVSR_STX;
125 ImmToIdxMap[PPC::DFSTOREf32] = PPC::STXSSPX;
126 ImmToIdxMap[PPC::DFSTOREf64] = PPC::STXSDX;
127 ImmToIdxMap[PPC::LXV] = PPC::LXVX;
128 ImmToIdxMap[PPC::LXSD] = PPC::LXSDX;
129 ImmToIdxMap[PPC::LXSSP] = PPC::LXSSPX;
130 ImmToIdxMap[PPC::STXV] = PPC::STXVX;
131 ImmToIdxMap[PPC::STXSD] = PPC::STXSDX;
132 ImmToIdxMap[PPC::STXSSP] = PPC::STXSSPX;
135 ImmToIdxMap[PPC::EVLDD] = PPC::EVLDDX;
136 ImmToIdxMap[PPC::EVSTDD] = PPC::EVSTDDX;
137 ImmToIdxMap[PPC::SPESTW] = PPC::SPESTWX;
138 ImmToIdxMap[PPC::SPELWZ] = PPC::SPELWZX;
141 ImmToIdxMap[PPC::PLBZ] = PPC::LBZX; ImmToIdxMap[PPC::PLBZ8] = PPC::LBZX8;
142 ImmToIdxMap[PPC::PLHZ] = PPC::LHZX; ImmToIdxMap[PPC::PLHZ8] = PPC::LHZX8;
143 ImmToIdxMap[PPC::PLHA] = PPC::LHAX; ImmToIdxMap[PPC::PLHA8] = PPC::LHAX8;
144 ImmToIdxMap[PPC::PLWZ] = PPC::LWZX; ImmToIdxMap[PPC::PLWZ8] = PPC::LWZX8;
145 ImmToIdxMap[PPC::PLWA] = PPC::LWAX; ImmToIdxMap[PPC::PLWA8] = PPC::LWAX;
146 ImmToIdxMap[PPC::PLD] = PPC::LDX; ImmToIdxMap[PPC::PSTD] = PPC::STDX;
148 ImmToIdxMap[PPC::PSTB] = PPC::STBX; ImmToIdxMap[PPC::PSTB8] = PPC::STBX8;
149 ImmToIdxMap[PPC::PSTH] = PPC::STHX; ImmToIdxMap[PPC::PSTH8] = PPC::STHX8;
150 ImmToIdxMap[PPC::PSTW] = PPC::STWX; ImmToIdxMap[PPC::PSTW8] = PPC::STWX8;
152 ImmToIdxMap[PPC::PLFS] = PPC::LFSX; ImmToIdxMap[PPC::PSTFS] = PPC::STFSX;
153 ImmToIdxMap[PPC::PLFD] = PPC::LFDX; ImmToIdxMap[PPC::PSTFD] = PPC::STFDX;
154 ImmToIdxMap[PPC::PLXSSP] = PPC::LXSSPX; ImmToIdxMap[PPC::PSTXSSP] = PPC::STXSSPX;
155 ImmToIdxMap[PPC::PLXSD] = PPC::LXSDX; ImmToIdxMap[PPC::PSTXSD] = PPC::STXSDX;
156 ImmToIdxMap[PPC::PLXV] = PPC::LXVX; ImmToIdxMap[PPC::PSTXV] = PPC::STXVX;
158 ImmToIdxMap[PPC::LXVP] = PPC::LXVPX;
159 ImmToIdxMap[PPC::STXVP] = PPC::STXVPX;
160 ImmToIdxMap[PPC::PLXVP] = PPC::LXVPX;
161 ImmToIdxMap[PPC::PSTXVP] = PPC::STXVPX;
173 return &PPC::G8RC_NOX0RegClass;
174 return &PPC::GPRC_NOR0RegClass;
178 return &PPC::G8RCRegClass;
179 return &PPC::GPRCRegClass;
188 if (Subtarget.hasVSX()) {
189 if (Subtarget.pairedVectorMemops())
190 return CSR_64_AllRegs_VSRP_SaveList;
192 return CSR_64_AllRegs_AIX_Dflt_VSX_SaveList;
193 return CSR_64_AllRegs_VSX_SaveList;
195 if (Subtarget.hasAltivec()) {
197 return CSR_64_AllRegs_AIX_Dflt_Altivec_SaveList;
198 return CSR_64_AllRegs_Altivec_SaveList;
200 return CSR_64_AllRegs_SaveList;
218 if (Subtarget.pairedVectorMemops())
219 return SaveR2 ? CSR_SVR64_ColdCC_R2_VSRP_SaveList
220 : CSR_SVR64_ColdCC_VSRP_SaveList;
221 if (Subtarget.hasAltivec())
222 return SaveR2 ? CSR_SVR64_ColdCC_R2_Altivec_SaveList
223 : CSR_SVR64_ColdCC_Altivec_SaveList;
224 return SaveR2 ? CSR_SVR64_ColdCC_R2_SaveList
225 : CSR_SVR64_ColdCC_SaveList;
228 if (Subtarget.pairedVectorMemops())
229 return CSR_SVR32_ColdCC_VSRP_SaveList;
230 else if (Subtarget.hasAltivec())
231 return CSR_SVR32_ColdCC_Altivec_SaveList;
232 else if (Subtarget.hasSPE())
233 return CSR_SVR32_ColdCC_SPE_SaveList;
234 return CSR_SVR32_ColdCC_SaveList;
238 if (Subtarget.pairedVectorMemops()) {
241 return SaveR2 ? CSR_PPC64_R2_SaveList : CSR_PPC64_SaveList;
242 return SaveR2 ? CSR_AIX64_R2_VSRP_SaveList : CSR_AIX64_VSRP_SaveList;
244 return SaveR2 ? CSR_SVR464_R2_VSRP_SaveList : CSR_SVR464_VSRP_SaveList;
246 if (Subtarget.hasAltivec() &&
248 return SaveR2 ? CSR_PPC64_R2_Altivec_SaveList
249 : CSR_PPC64_Altivec_SaveList;
251 return SaveR2 ? CSR_PPC64_R2_SaveList : CSR_PPC64_SaveList;
255 if (Subtarget.pairedVectorMemops())
257 : CSR_AIX32_SaveList;
258 if (Subtarget.hasAltivec())
260 : CSR_AIX32_SaveList;
261 return CSR_AIX32_SaveList;
263 if (Subtarget.pairedVectorMemops())
264 return CSR_SVR432_VSRP_SaveList;
265 if (Subtarget.hasAltivec())
266 return CSR_SVR432_Altivec_SaveList;
267 else if (Subtarget.hasSPE()) {
269 return CSR_SVR432_SPE_NO_S30_31_SaveList;
270 return CSR_SVR432_SPE_SaveList;
272 return CSR_SVR432_SaveList;
280 if (Subtarget.hasVSX()) {
281 if (Subtarget.pairedVectorMemops())
282 return CSR_64_AllRegs_VSRP_RegMask;
284 return CSR_64_AllRegs_AIX_Dflt_VSX_RegMask;
285 return CSR_64_AllRegs_VSX_RegMask;
287 if (Subtarget.hasAltivec()) {
289 return CSR_64_AllRegs_AIX_Dflt_Altivec_RegMask;
290 return CSR_64_AllRegs_Altivec_RegMask;
292 return CSR_64_AllRegs_RegMask;
296 if (Subtarget.pairedVectorMemops()) {
298 return TM.
isPPC64() ? CSR_PPC64_RegMask : CSR_AIX32_RegMask;
299 return TM.
isPPC64() ? CSR_AIX64_VSRP_RegMask : CSR_AIX32_VSRP_RegMask;
303 ? CSR_PPC64_Altivec_RegMask
306 ? CSR_AIX32_Altivec_RegMask
307 : CSR_AIX32_RegMask);
312 return Subtarget.pairedVectorMemops()
313 ? CSR_SVR64_ColdCC_VSRP_RegMask
314 : (Subtarget.hasAltivec() ? CSR_SVR64_ColdCC_Altivec_RegMask
315 : CSR_SVR64_ColdCC_RegMask);
317 return Subtarget.pairedVectorMemops()
318 ? CSR_SVR32_ColdCC_VSRP_RegMask
319 : (Subtarget.hasAltivec()
320 ? CSR_SVR32_ColdCC_Altivec_RegMask
321 : (Subtarget.hasSPE() ? CSR_SVR32_ColdCC_SPE_RegMask
322 : CSR_SVR32_ColdCC_RegMask));
326 return Subtarget.pairedVectorMemops()
327 ? CSR_SVR464_VSRP_RegMask
328 : (Subtarget.hasAltivec() ? CSR_PPC64_Altivec_RegMask
329 : CSR_PPC64_RegMask);
331 return Subtarget.pairedVectorMemops()
332 ? CSR_SVR432_VSRP_RegMask
333 : (Subtarget.hasAltivec()
334 ? CSR_SVR432_Altivec_RegMask
335 : (Subtarget.hasSPE()
337 ? CSR_SVR432_SPE_NO_S30_31_RegMask
338 : CSR_SVR432_SPE_RegMask)
339 : CSR_SVR432_RegMask));
344 return CSR_NoRegs_RegMask;
348 for (
unsigned PseudoReg : {PPC::ZERO, PPC::ZERO8, PPC::RM})
349 Mask[PseudoReg / 32] &= ~(1u << (PseudoReg % 32));
379 markSuperRegs(
Reserved, PPC::VRSAVE);
401 if (TFI->needsFP(MF))
416 if (!Subtarget.hasAltivec())
420 if (Subtarget.
isAIXABI() && Subtarget.hasAltivec() &&
424 for (
auto Reg : CSR_Altivec_SaveList) {
441 if (PhysReg == PPC::CTR || PhysReg == PPC::CTR8 || PhysReg == PPC::LR ||
467 if (FrameSize & ~0x7FFF) {
468 LLVM_DEBUG(
dbgs() <<
"TRUE - Frame size is too large for D-Form.\n");
477 if (CSI.isSpilledToReg())
480 int FrIdx = CSI.getFrameIdx();
484 unsigned Opcode = InstrInfo->getStoreOpcodeForSpill(RC);
489 LLVM_DEBUG(
dbgs() <<
"Memory Operand: " << InstrInfo->getName(Opcode)
490 <<
" for register " <<
printReg(Reg,
this) <<
".\n");
491 LLVM_DEBUG(
dbgs() <<
"TRUE - Not fixed frame object that requires "
503 if (InstrInfo->isXFormMemOp(Opcode)) {
504 LLVM_DEBUG(
dbgs() <<
"Memory Operand: " << InstrInfo->getName(Opcode)
505 <<
" for register " <<
printReg(Reg,
this) <<
".\n");
511 if ((Opcode == PPC::RESTORE_QUADWORD) || (Opcode == PPC::SPILL_QUADWORD)) {
512 LLVM_DEBUG(
dbgs() <<
"Memory Operand: " << InstrInfo->getName(Opcode)
513 <<
" for register " <<
printReg(Reg,
this) <<
".\n");
529 return !Subtarget.hasROPProtect();
547 !MFI.hasVarSizedObjects() && !MFI.hasOpaqueSPAdjustment())
571 VirtReg, Order, Hints, MF, VRM,
Matrix);
577 return BaseImplRetVal;
588 switch (
Use.getOpcode()) {
589 case TargetOpcode::COPY: {
590 ResultOp = &
Use.getOperand(0);
591 ResultReg = ResultOp->
getReg();
593 MRI->getRegClass(ResultReg)->contains(PPC::UACC0) &&
597 if (RegClass->
contains(PPC::VSRp0)) {
598 HintReg = getSubReg(UACCPhys, ResultOp->
getSubReg());
600 if (HintReg >= PPC::VSRp0 && HintReg <= PPC::VSRp31)
602 }
else if (RegClass->
contains(PPC::ACC0)) {
603 HintReg = PPC::ACC0 + (UACCPhys - PPC::UACC0);
604 if (HintReg >= PPC::ACC0 && HintReg <= PPC::ACC7)
610 case PPC::BUILD_UACC: {
611 ResultOp = &
Use.getOperand(0);
612 ResultReg = ResultOp->
getReg();
613 if (
MRI->getRegClass(ResultReg)->contains(PPC::ACC0) &&
616 assert((ACCPhys >= PPC::ACC0 && ACCPhys <= PPC::ACC7) &&
617 "Expecting an ACC register for BUILD_UACC.");
618 Register HintReg = PPC::UACC0 + (ACCPhys - PPC::ACC0);
625 return BaseImplRetVal;
631 const unsigned DefaultSafety = 1;
633 switch (RC->
getID()) {
636 case PPC::G8RC_NOX0RegClassID:
637 case PPC::GPRC_NOR0RegClassID:
638 case PPC::SPERCRegClassID:
639 case PPC::G8RCRegClassID:
640 case PPC::GPRCRegClassID: {
641 unsigned FP = TFI->
hasFP(MF) ? 1 : 0;
642 return 32 -
FP - DefaultSafety;
644 case PPC::F4RCRegClassID:
645 case PPC::F8RCRegClassID:
646 case PPC::VSLRCRegClassID:
647 return 32 - DefaultSafety;
648 case PPC::VFRCRegClassID:
649 case PPC::VRRCRegClassID: {
654 return 20 - DefaultSafety;
656 return 32 - DefaultSafety;
657 case PPC::VSFRCRegClassID:
658 case PPC::VSSRCRegClassID:
659 case PPC::VSRCRegClassID: {
664 return 52 - DefaultSafety;
666 return 64 - DefaultSafety;
667 case PPC::CRRCRegClassID:
668 return 8 - DefaultSafety;
676 const auto *DefaultSuperclass =
678 if (Subtarget.hasVSX()) {
687 RC == &PPC::G8RCRegClass) {
689 return &PPC::SPILLTOVSRRCRegClass;
696 if (getRegSizeInBits(*
getRegClass(SuperID)) != getRegSizeInBits(*RC))
700 case PPC::VSSRCRegClassID:
701 return Subtarget.hasP8Vector() ?
getRegClass(SuperID)
703 case PPC::VSFRCRegClassID:
704 case PPC::VSRCRegClassID:
706 case PPC::VSRpRCRegClassID:
707 return Subtarget.pairedVectorMemops() ?
getRegClass(SuperID)
709 case PPC::ACCRCRegClassID:
710 case PPC::UACCRCRegClassID:
711 return Subtarget.hasMMA() ?
getRegClass(SuperID) : DefaultSuperclass;
716 return DefaultSuperclass;
750 "Maximum call-frame size not sufficiently aligned");
756 bool KillNegSizeReg =
MI.getOperand(1).isKill();
757 Register NegSizeReg =
MI.getOperand(1).getReg();
769 .
addImm(maxCallFrameSize);
777 .
addImm(maxCallFrameSize);
789 bool &KillNegSizeReg,
822 if (MaxAlign < TargetAlign && isInt<16>(FrameSize)) {
842 if (MaxAlign > TargetAlign) {
843 unsigned UnalNegSizeReg = NegSizeReg;
851 unsigned NegSizeReg1 = NegSizeReg;
856 KillNegSizeReg =
true;
859 if (MaxAlign > TargetAlign) {
860 unsigned UnalNegSizeReg = NegSizeReg;
868 unsigned NegSizeReg1 = NegSizeReg;
873 KillNegSizeReg =
true;
891 Register FramePointer =
MI.getOperand(0).getReg();
892 const Register ActualNegSizeReg =
MI.getOperand(1).getReg();
893 bool KillNegSizeReg =
MI.getOperand(2).isKill();
894 Register NegSizeReg =
MI.getOperand(2).getReg();
897 if (FramePointer == NegSizeReg) {
898 assert(KillNegSizeReg &&
"FramePointer is a def and NegSizeReg is an use, "
899 "NegSizeReg should be killed");
906 NegSizeReg = ActualNegSizeReg;
907 KillNegSizeReg =
false;
912 if (NegSizeReg != ActualNegSizeReg)
937 MI.getOperand(0).getReg())
938 .
addImm(maxCallFrameSize);
951 unsigned FrameIndex)
const {
975 if (SrcReg != PPC::CR0) {
982 .
addImm(getEncodingValue(SrcReg) * 4)
996 unsigned FrameIndex)
const {
1011 Register DestReg =
MI.getOperand(0).getReg();
1012 assert(
MI.definesRegister(DestReg,
nullptr) &&
1013 "RESTORE_CR does not define its destination");
1020 if (DestReg != PPC::CR0) {
1024 unsigned ShiftBits = getEncodingValue(DestReg)*4;
1031 BuildMI(
MBB,
II, dl,
TII.get(LP64 ? PPC::MTOCRF8 : PPC::MTOCRF), DestReg)
1039 unsigned FrameIndex)
const {
1061 unsigned CRBitSpillDistance = 0;
1062 bool SeenUse =
false;
1063 for (; Ins != Rend; ++Ins) {
1065 if (Ins->modifiesRegister(SrcReg,
TRI))
1068 if (Ins->readsRegister(SrcReg,
TRI))
1076 if (!Ins->isDebugInstr())
1077 CRBitSpillDistance++;
1084 bool SpillsKnownBit =
false;
1086 switch (Ins->getOpcode()) {
1090 SpillsKnownBit =
true;
1095 SpillsKnownBit =
true;
1102 if (Subtarget.isISA3_1()) {
1112 if (Subtarget.isISA3_0()) {
1113 if (SrcReg == PPC::CR0LT || SrcReg == PPC::CR1LT ||
1114 SrcReg == PPC::CR2LT || SrcReg == PPC::CR3LT ||
1115 SrcReg == PPC::CR4LT || SrcReg == PPC::CR5LT ||
1116 SrcReg == PPC::CR6LT || SrcReg == PPC::CR7LT) {
1141 .
addImm(getEncodingValue(SrcReg))
1148 bool KillsCRBit =
MI.killsRegister(SrcReg,
TRI);
1151 if (SpillsKnownBit && KillsCRBit && !SeenUse) {
1152 Ins->setDesc(
TII.get(PPC::UNENCODED_NOP));
1153 Ins->removeOperand(0);
1158 unsigned FrameIndex)
const {
1173 Register DestReg =
MI.getOperand(0).getReg();
1174 assert(
MI.definesRegister(DestReg,
nullptr) &&
1175 "RESTORE_CRBIT does not define its destination");
1183 BuildMI(
MBB,
II, dl,
TII.get(LP64 ? PPC::MFOCRF8 : PPC::MFOCRF), RegO)
1186 unsigned ShiftBits = getEncodingValue(DestReg);
1188 BuildMI(
MBB,
II, dl,
TII.get(LP64 ? PPC::RLWIMI8 : PPC::RLWIMI), RegO)
1191 .
addImm(ShiftBits ? 32 - ShiftBits : 0)
1213 std::string Dest = PPC::ACCRCRegClass.contains(DestReg) ?
"acc" :
"uacc";
1214 std::string Src = PPC::ACCRCRegClass.contains(SrcReg) ?
"acc" :
"uacc";
1215 dbgs() <<
"Emitting copy from " << Src <<
" to " << Dest <<
":\n";
1227 dbgs() <<
"Emitting " << (IsPrimed ?
"acc" :
"uacc") <<
" register "
1228 << (IsRestore ?
"restore" :
"spill") <<
":\n";
1237 unsigned FrameIndex,
bool IsLittleEndian,
1238 bool IsKilled,
bool TwoPairs) {
1243 "Spilling register pairs does not support virtual registers.");
1246 Offset = IsLittleEndian ? 48 : 0;
1248 Offset = IsLittleEndian ? 16 : 0;
1249 Register Reg = (SrcReg > PPC::VSRp15) ? PPC::V0 + (SrcReg - PPC::VSRp16) * 2
1250 : PPC::VSL0 + (SrcReg - PPC::VSRp0) * 2;
1254 Offset += IsLittleEndian ? -16 : 16;
1259 Offset += IsLittleEndian ? -16 : 16;
1263 Offset += IsLittleEndian ? -16 : 16;
1274 unsigned FrameIndex)
const {
1276 "Expecting to do this only if paired vector stores are disabled.");
1285 bool IsKilled =
MI.getOperand(0).isKill();
1297 dbgs() <<
"Emitting wacc register " << (IsRestore ?
"restore" :
"spill")
1310 unsigned FrameIndex)
const {
1318 bool IsKilled =
MI.getOperand(0).isKill();
1320 bool IsPrimed = PPC::ACCRCRegClass.contains(SrcReg);
1322 PPC::VSRp0 + (SrcReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2;
1339 FrameIndex, IsLittleEndian ? 32 : 0);
1342 FrameIndex, IsLittleEndian ? 0 : 32);
1344 if (IsPrimed && !IsKilled)
1353 unsigned FrameIndex)
const {
1361 Register DestReg =
MI.getOperand(0).getReg();
1362 assert(
MI.definesRegister(DestReg,
nullptr) &&
1363 "RESTORE_ACC does not define its destination");
1365 bool IsPrimed = PPC::ACCRCRegClass.contains(DestReg);
1367 PPC::VSRp0 + (DestReg - (IsPrimed ? PPC::ACC0 : PPC::UACC0)) * 2;
1375 FrameIndex, IsLittleEndian ? 32 : 0);
1377 FrameIndex, IsLittleEndian ? 0 : 32);
1388 unsigned FrameIndex)
const {
1410 FrameIndex, IsLittleEndian ? 32 : 0);
1413 FrameIndex, IsLittleEndian ? 0 : 32);
1422 unsigned FrameIndex)
const {
1436 Register DestReg =
MI.getOperand(0).getReg();
1439 FrameIndex, IsLittleEndian ? 32 : 0);
1441 FrameIndex, IsLittleEndian ? 0 : 32);
1454 unsigned FrameIndex)
const {
1463 bool IsKilled =
MI.getOperand(0).isKill();
1465 Register Reg = PPC::X0 + (SrcReg - PPC::G8p0) * 2;
1470 FrameIndex, IsLittleEndian ? 8 : 0);
1473 FrameIndex, IsLittleEndian ? 0 : 8);
1481 unsigned FrameIndex)
const {
1489 Register DestReg =
MI.getOperand(0).getReg();
1490 assert(
MI.definesRegister(DestReg,
nullptr) &&
1491 "RESTORE_QUADWORD does not define its destination");
1493 Register Reg = PPC::X0 + (DestReg - PPC::G8p0) * 2;
1497 IsLittleEndian ? 8 : 0);
1499 IsLittleEndian ? 0 : 8);
1506 Register Reg,
int &FrameIdx)
const {
1515 if (PPC::CR2 <= Reg && Reg <= PPC::CR4) {
1533 case PPC::DFLOADf32:
1534 case PPC::DFLOADf64:
1535 case PPC::DFSTOREf32:
1536 case PPC::DFSTOREf64:
1557 unsigned OpC =
MI.getOpcode();
1563 unsigned FIOperandNum) {
1565 unsigned OffsetOperandNo = (FIOperandNum == 2) ? 1 : 2;
1566 if (
MI.isInlineAsm())
1567 OffsetOperandNo = FIOperandNum - 1;
1568 else if (
MI.getOpcode() == TargetOpcode::STACKMAP ||
1569 MI.getOpcode() == TargetOpcode::PATCHPOINT)
1570 OffsetOperandNo = FIOperandNum + 1;
1572 return OffsetOperandNo;
1577 int SPAdj,
unsigned FIOperandNum,
1579 assert(SPAdj == 0 &&
"Unexpected");
1597 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
1604 unsigned OpC =
MI.getOpcode();
1606 if ((OpC == PPC::DYNAREAOFFSET || OpC == PPC::DYNAREAOFFSET8)) {
1613 if (FPSI && FrameIndex == FPSI &&
1614 (OpC == PPC::DYNALLOC || OpC == PPC::DYNALLOC8)) {
1620 if (FPSI && FrameIndex == FPSI &&
1621 (OpC == PPC::PREPARE_PROBED_ALLOCA_64 ||
1622 OpC == PPC::PREPARE_PROBED_ALLOCA_32 ||
1623 OpC == PPC::PREPARE_PROBED_ALLOCA_NEGSIZE_SAME_REG_64 ||
1624 OpC == PPC::PREPARE_PROBED_ALLOCA_NEGSIZE_SAME_REG_32)) {
1631 if (OpC == PPC::SPILL_CR) {
1634 }
else if (OpC == PPC::RESTORE_CR) {
1637 }
else if (OpC == PPC::SPILL_CRBIT) {
1640 }
else if (OpC == PPC::RESTORE_CRBIT) {
1643 }
else if (OpC == PPC::SPILL_ACC || OpC == PPC::SPILL_UACC) {
1646 }
else if (OpC == PPC::RESTORE_ACC || OpC == PPC::RESTORE_UACC) {
1652 }
else if (OpC == PPC::SPILL_WACC) {
1655 }
else if (OpC == PPC::RESTORE_WACC) {
1658 }
else if (OpC == PPC::SPILL_QUADWORD) {
1661 }
else if (OpC == PPC::RESTORE_QUADWORD) {
1667 MI.getOperand(FIOperandNum).ChangeToRegister(
1672 bool noImmForm = !
MI.isInlineAsm() && OpC != TargetOpcode::STACKMAP &&
1673 OpC != TargetOpcode::PATCHPOINT && !ImmToIdxMap.
count(OpC);
1677 Offset +=
MI.getOperand(OffsetOperandNo).getImm();
1692 if ((OpC == PPC::LXVP || OpC == PPC::STXVP) &&
1694 Subtarget.hasPrefixInstrs() && Subtarget.hasP10Vector()) {
1695 unsigned NewOpc = OpC == PPC::LXVP ? PPC::PLXVP : PPC::PSTXVP;
1696 MI.setDesc(
TII.get(NewOpc));
1706 assert(OpC != PPC::DBG_VALUE &&
1707 "This should be handled in a target-independent way");
1710 bool OffsetFitsMnemonic = (OpC == PPC::EVSTDD || OpC == PPC::EVLDD) ?
1713 if (
TII.isPrefixed(
MI.getOpcode()))
1714 OffsetFitsMnemonic = isInt<34>(
Offset);
1715 if (!noImmForm && ((OffsetFitsMnemonic &&
1717 OpC == TargetOpcode::STACKMAP ||
1718 OpC == TargetOpcode::PATCHPOINT)) {
1719 MI.getOperand(OffsetOperandNo).ChangeToImmediate(
Offset);
1730 unsigned NewOpcode = 0u;
1737 if (ScavengingFailed && Subtarget.hasDirectMove()) {
1740 SRegHi = SReg =
is64Bit ? PPC::X4 : PPC::R4;
1741 if (
MI.getOperand(0).getReg() == SReg)
1742 SRegHi = SReg = SReg + 1;
1755 else if (isInt<32>(
Offset)) {
1770 unsigned OperandBase;
1774 else if (OpC != TargetOpcode::INLINEASM &&
1775 OpC != TargetOpcode::INLINEASM_BR) {
1777 "No indexed form of load or store available!");
1778 NewOpcode = ImmToIdxMap.
find(OpC)->second;
1779 MI.setDesc(
TII.get(NewOpcode));
1782 OperandBase = OffsetOperandNo;
1785 Register StackReg =
MI.getOperand(FIOperandNum).getReg();
1786 MI.getOperand(OperandBase).ChangeToRegister(StackReg,
false);
1787 MI.getOperand(OperandBase + 1).ChangeToRegister(SReg,
false,
false,
true);
1791 if (ScavengingFailed && Subtarget.hasDirectMove())
1798 if (NewOpcode == PPC::LQX_PSEUDO || NewOpcode == PPC::STQX_PSEUDO) {
1799 assert(
is64Bit &&
"Quadword loads/stores only supported in 64-bit mode");
1804 MI.setDesc(
TII.get(NewOpcode == PPC::LQX_PSEUDO ? PPC::LQ : PPC::STQ));
1805 MI.getOperand(OperandBase + 1).ChangeToRegister(NewReg,
false);
1806 MI.getOperand(OperandBase).ChangeToImmediate(0);
1815 return TFI->
hasFP(MF) ? PPC::R31 : PPC::R1;
1817 return TFI->
hasFP(MF) ? PPC::X31 : PPC::X1;
1843 return hasStackRealignment(MF);
1863 unsigned OpC =
MI->getOpcode();
1864 if (!ImmToIdxMap.
count(OpC))
1868 if ((OpC == PPC::ADDI || OpC == PPC::ADDI8) &&
1869 MI->getOperand(2).getImm() == 0)
1898 unsigned ADDriOpc = TM.
isPPC64() ? PPC::ADDI8 : PPC::ADDI;
1903 DL = Ins->getDebugLoc();
1912 MRI.constrainRegClass(BaseReg,
TII.getRegClass(MCID, 0,
this, MF));
1922 unsigned FIOperandNum = 0;
1923 while (!
MI.getOperand(FIOperandNum).isFI()) {
1925 assert(FIOperandNum <
MI.getNumOperands() &&
1926 "Instr doesn't have FrameIndex operand!");
1929 MI.getOperand(FIOperandNum).ChangeToRegister(BaseReg,
false);
1931 Offset +=
MI.getOperand(OffsetOperandNo).getImm();
1932 MI.getOperand(OffsetOperandNo).ChangeToImmediate(
Offset);
1940 MRI.constrainRegClass(BaseReg,
1941 TII.getRegClass(MCID, FIOperandNum,
this, MF));
1947 unsigned FIOperandNum = 0;
1948 while (!
MI->getOperand(FIOperandNum).isFI()) {
1950 assert(FIOperandNum < MI->getNumOperands() &&
1951 "Instr doesn't have FrameIndex operand!");
1955 Offset +=
MI->getOperand(OffsetOperandNo).getImm();
1957 return MI->getOpcode() == PPC::DBG_VALUE ||
1958 MI->getOpcode() == TargetOpcode::STACKMAP ||
1959 MI->getOpcode() == TargetOpcode::PATCHPOINT ||
unsigned const MachineRegisterInfo * MRI
static const TargetRegisterClass * getRegClass(const MachineInstr &MI, Register Reg)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file implements the BitVector class.
Analysis containing CSE Info
const HexagonInstrInfo * TII
static cl::opt< bool > EnableBasePointer("m68k-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
unsigned const TargetRegisterInfo * TRI
uint64_t IntrinsicInst * II
cl::opt< bool > DisableAutoPairedVecSt("disable-auto-paired-vec-st", cl::desc("disable automatically generated 32byte paired vector stores"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > MaxCRBitSpillDist("ppc-max-crbit-spill-dist", cl::desc("Maximum search distance for definition of CR bit " "spill on ppc"), cl::Hidden, cl::init(100))
static cl::opt< bool > EnableBasePointer("ppc-use-base-pointer", cl::Hidden, cl::init(true), cl::desc("Enable use of a base pointer for complex stack frames"))
static cl::opt< bool > EnableGPRToVecSpills("ppc-enable-gpr-to-vsr-spills", cl::Hidden, cl::init(false), cl::desc("Enable spills from gpr to vsr rather than stack"))
static cl::opt< bool > ReportAccMoves("ppc-report-acc-moves", cl::desc("Emit information about accumulator register spills " "and copies"), cl::Hidden, cl::init(false))
static void emitWAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsRestore)
static unsigned getOffsetONFromFION(const MachineInstr &MI, unsigned FIOperandNum)
static unsigned offsetMinAlignForOpcode(unsigned OpC)
static void emitAccSpillRestoreInfo(MachineBasicBlock &MBB, bool IsPrimed, bool IsRestore)
static unsigned offsetMinAlign(const MachineInstr &MI)
static cl::opt< bool > StackPtrConst("ppc-stack-ptr-caller-preserved", cl::desc("Consider R1 caller preserved so stack saves of " "caller preserved registers can be LICM candidates"), cl::init(true), cl::Hidden)
static void spillRegPairs(MachineBasicBlock &MBB, MachineBasicBlock::iterator II, DebugLoc DL, const TargetInstrInfo &TII, Register SrcReg, unsigned FrameIndex, bool IsLittleEndian, bool IsKilled, bool TwoPairs)
static cl::opt< bool > AlwaysBasePointer("ppc-always-use-base-pointer", cl::Hidden, cl::init(false), cl::desc("Force the use of a base pointer in every function"))
cl::opt< bool > DisableAutoPairedVecSt
This file declares the machine register scavenger class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static const TargetRegisterClass * getMinimalPhysRegClass(const TargetRegisterInfo *TRI, MCRegister Reg, TypeT Ty)
static bool is64Bit(const char *name)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool test(unsigned Idx) const
bool any() const
any - Returns true if any bit is set.
bool none() const
none - Returns true if none of the bits are set.
The CalleeSavedInfo class tracks the information need to locate where a callee saved register is in t...
iterator find(const_arg_type_t< KeyT > Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Describe properties that are true of each instruction in the target description file.
MCRegAliasIterator enumerates all registers aliasing Reg.
Wrapper class representing physical registers. Should be passed by value.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
Align getMaxAlign() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
bool isCalleeSavedInfoValid() const
Has the callee saved info been calculated yet?
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
bool isFixedObjectIndex(int ObjectIdx) const
Returns true if the specified index corresponds to a fixed stack object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
bool hasInlineAsm() const
Returns true if the function contains any inline assembly.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
bool isAllocatable(MCRegister PhysReg) const
isAllocatable - Returns true when PhysReg belongs to an allocatable register class and it hasn't been...
uint64_t determineFrameLayout(const MachineFunction &MF, bool UseEstimate=false, unsigned *NewMaxCallFrameSize=nullptr) const
Determine the frame layout but do not update the machine function.
PPCFunctionInfo - This class is derived from MachineFunction private PowerPC target-specific informat...
int getFramePointerSaveIndex() const
bool usesTOCBasePtr() const
void resolveFrameIndex(MachineInstr &MI, Register BaseReg, int64_t Offset) const override
bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM, const LiveRegMatrix *Matrix) const override
Register getFrameRegister(const MachineFunction &MF) const override
bool hasBasePointer(const MachineFunction &MF) const
Register getBaseRegister(const MachineFunction &MF) const
void prepareDynamicAlloca(MachineBasicBlock::iterator II, Register &NegSizeReg, bool &KillNegSizeReg, Register &FramePointer) const
To accomplish dynamic stack allocation, we have to calculate exact size subtracted from the stack poi...
void lowerCRBitSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
void lowerACCSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerACCSpilling - Generate the code for spilling the accumulator register.
bool requiresFrameIndexScavenging(const MachineFunction &MF) const override
void lowerCRSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerCRSpilling - Generate the code for spilling a CR register.
void lowerDynamicAreaOffset(MachineBasicBlock::iterator II) const
void lowerDynamicAlloc(MachineBasicBlock::iterator II) const
lowerDynamicAlloc - Generate the code for allocating an object in the current frame.
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
void adjustStackMapLiveOutMask(uint32_t *Mask) const override
bool hasReservedSpillSlot(const MachineFunction &MF, Register Reg, int &FrameIdx) const override
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind=0) const override
getPointerRegClass - Return the register class to use to hold pointers.
bool isCallerPreservedPhysReg(MCRegister PhysReg, const MachineFunction &MF) const override
bool needsFrameBaseReg(MachineInstr *MI, int64_t Offset) const override
Returns true if the instruction's frame index reference would be better served by a base register oth...
const uint32_t * getNoPreservedMask() const override
void lowerCRRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
void lowerQuadwordRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerQuadwordRestore - Generate code to restore paired general register.
static void emitAccCopyInfo(MachineBasicBlock &MBB, MCRegister DestReg, MCRegister SrcReg)
bool requiresVirtualBaseRegisters(const MachineFunction &MF) const override
void lowerCRBitRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
Register materializeFrameBaseRegister(MachineBasicBlock *MBB, int FrameIdx, int64_t Offset) const override
Insert defining instruction(s) for BaseReg to be a pointer to FrameIdx at the beginning of the basic ...
unsigned getRegPressureLimit(const TargetRegisterClass *RC, MachineFunction &MF) const override
void lowerWACCRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerWACCRestore - Generate the code to restore the wide accumulator register.
void lowerPrepareProbedAlloca(MachineBasicBlock::iterator II) const
void lowerQuadwordSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerQuadwordSpilling - Generate code to spill paired general register.
PPCRegisterInfo(const PPCTargetMachine &TM)
bool isFrameOffsetLegal(const MachineInstr *MI, Register BaseReg, int64_t Offset) const override
void lowerWACCSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerWACCSpilling - Generate the code for spilling the wide accumulator register.
void lowerOctWordSpilling(MachineBasicBlock::iterator II, unsigned FrameIndex) const
Remove any STXVP[X] instructions and split them out into a pair of STXV[X] instructions if –disable-a...
bool isAsmClobberable(const MachineFunction &MF, MCRegister PhysReg) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &MF) const override
void lowerACCRestore(MachineBasicBlock::iterator II, unsigned FrameIndex) const
lowerACCRestore - Generate the code to restore the accumulator register.
bool is32BitELFABI() const
bool isUsingPCRelativeCalls() const
const PPCInstrInfo * getInstrInfo() const override
bool isLittleEndian() const
MCRegister getTOCPointerRegister() const
MCRegister getStackPointerRegister() const
bool is64BitELFABI() const
const PPCRegisterInfo * getRegisterInfo() const override
Common code between 32-bit and 64-bit PowerPC targets.
BitVector getRegsAvailable(const TargetRegisterClass *RC)
Return all available registers in the register class in Mask.
Wrapper class representing virtual and physical registers.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
static constexpr bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
Align getStackAlign() const
getStackAlignment - This method returns the number of bytes to which the stack pointer must be aligne...
TargetInstrInfo - Interface to description of machine instruction set.
bool isPositionIndependent() const
bool getAIXExtendedAltivecABI() const
unsigned getID() const
Return the register class ID number.
bool contains(Register Reg) const
Return true if the specified register is included in this register class.
ArrayRef< unsigned > superclasses() const
Returns a list of super-classes.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterClass * getLargestLegalSuperClass(const TargetRegisterClass *RC, const MachineFunction &) const
Returns the largest super class of RC that is legal to use in the current sub-target and has the same...
virtual bool getRegAllocationHints(Register VirtReg, ArrayRef< MCPhysReg > Order, SmallVectorImpl< MCPhysReg > &Hints, const MachineFunction &MF, const VirtRegMap *VRM=nullptr, const LiveRegMatrix *Matrix=nullptr) const
Get a list of 'hint' registers that the register allocator should try first when allocating a physica...
A Use represents the edge between a Value definition and its users.
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
bool hasPhys(Register virtReg) const
returns true if the specified virtual register is mapped to a physical register
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Kill
The last use of a register.
@ Undef
Value of the register doesn't matter.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0, bool mem=true)
addFrameReference - This function is used to add a reference to the base of an abstract object on the...
static unsigned getCRFromCRBit(unsigned SrcReg)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
unsigned getKillRegState(bool B)
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.