48#define GET_INSTRINFO_CTOR_DTOR
49#define GET_INSTRMAP_INFO
50#include "SystemZGenInstrInfo.inc"
52#define DEBUG_TYPE "systemz-II"
60void SystemZInstrInfo::anchor() {}
64 RI(sti.getSpecialRegisters()->getReturnFunctionAddressRegister(),
71 unsigned NewOpcode)
const {
79 MBB->insert(LowPartMI, HighPartMI);
87 HighRegOp.
setReg(RI.getSubReg(HighRegOp.
getReg(), SystemZ::subreg_h64));
88 LowRegOp.
setReg(RI.getSubReg(LowRegOp.
getReg(), SystemZ::subreg_l64));
99 assert(HighOpcode && LowOpcode &&
"Both offsets should be in range");
104 if (
MI->mayStore()) {
116 auto overlapsAddressReg = [&](
Register Reg) ->
bool {
117 return RI.regsOverlap(
Reg,
MI->getOperand(1).getReg()) ||
118 RI.regsOverlap(
Reg,
MI->getOperand(3).getReg());
120 if (overlapsAddressReg(HighRegOp.
getReg())) {
122 "Both loads clobber address!");
135 MachineBasicBlock *
MBB =
MI->getParent();
138 MachineOperand &OffsetMO =
MI->getOperand(2);
139 SystemZCallingConventionRegisters *Regs = STI.getSpecialRegisters();
146 assert(NewOpcode &&
"No support for huge argument lists yet");
147 MI->setDesc(
get(NewOpcode));
157void SystemZInstrInfo::expandRIPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
159 bool ConvertHigh)
const {
162 MI.setDesc(
get(IsHigh ? HighOpcode : LowOpcode));
163 if (IsHigh && ConvertHigh)
164 MI.getOperand(1).setImm(uint32_t(
MI.getOperand(1).getImm()));
171void SystemZInstrInfo::expandRIEPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
173 unsigned HighOpcode)
const {
178 if (!DestIsHigh && !SrcIsHigh)
179 MI.setDesc(
get(LowOpcodeK));
181 if (DestReg != SrcReg) {
182 emitGRX32Move(*
MI.getParent(),
MI,
MI.getDebugLoc(), DestReg, SrcReg,
183 SystemZ::LR, 32,
MI.getOperand(1).isKill(),
184 MI.getOperand(1).isUndef());
185 MI.getOperand(1).setReg(DestReg);
187 MI.setDesc(
get(DestIsHigh ? HighOpcode : LowOpcode));
188 MI.tieOperands(0, 1);
195void SystemZInstrInfo::expandRXYPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
196 unsigned HighOpcode)
const {
200 MI.getOperand(2).getImm());
201 MI.setDesc(
get(Opcode));
207void SystemZInstrInfo::expandLOCPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
208 unsigned HighOpcode)
const {
211 MI.setDesc(
get(Opcode));
217void SystemZInstrInfo::expandZExtPseudo(
MachineInstr &
MI,
unsigned LowOpcode,
218 unsigned Size)
const {
219 MachineInstrBuilder MIB =
220 emitGRX32Move(*
MI.getParent(),
MI,
MI.getDebugLoc(),
221 MI.getOperand(0).getReg(),
MI.getOperand(1).getReg(), LowOpcode,
222 Size,
MI.getOperand(1).isKill(),
MI.getOperand(1).isUndef());
228 MI.eraseFromParent();
231void SystemZInstrInfo::expandLoadStackGuard(
MachineInstr *
MI)
const {
232 MachineBasicBlock *
MBB =
MI->getParent();
234 const Register Reg64 =
MI->getOperand(0).getReg();
235 const Register Reg32 = RI.getSubReg(Reg64, SystemZ::subreg_l32);
256 MI->setDesc(
get(SystemZ::LG));
257 MachineInstrBuilder(MF,
MI).addReg(Reg64).addImm(40).addReg(0);
269 unsigned SrcReg,
unsigned LowLowOpcode,
270 unsigned Size,
bool KillSrc,
271 bool UndefSrc)
const {
275 if (DestIsHigh && SrcIsHigh)
276 Opcode = SystemZ::RISBHH;
277 else if (DestIsHigh && !SrcIsHigh)
278 Opcode = SystemZ::RISBHL;
279 else if (!DestIsHigh && SrcIsHigh)
280 Opcode = SystemZ::RISBLH;
285 unsigned Rotate = (DestIsHigh != SrcIsHigh ? 32 : 0);
295 unsigned OpIdx2)
const {
298 return *
MI.getParent()->getParent()->CloneMachineInstr(&
MI);
302 switch (
MI.getOpcode()) {
303 case SystemZ::SELRMux:
304 case SystemZ::SELFHR:
307 case SystemZ::LOCRMux:
308 case SystemZ::LOCFHR:
310 case SystemZ::LOCGR: {
311 auto &WorkingMI = cloneIfNew(
MI);
313 unsigned CCValid = WorkingMI.getOperand(3).getImm();
314 unsigned CCMask = WorkingMI.getOperand(4).getImm();
315 WorkingMI.getOperand(4).setImm(CCMask ^ CCValid);
332 if ((
MCID.TSFlags & Flag) &&
MI.getOperand(1).isFI() &&
333 MI.getOperand(2).getImm() == 0 &&
MI.getOperand(3).getReg() == 0) {
334 FrameIndex =
MI.getOperand(1).getIndex();
335 return MI.getOperand(0).getReg();
341 int &FrameIndex)
const {
346 int &FrameIndex)
const {
351 int &FrameIndex)
const {
368 return MI.getOperand(0).getReg();
374 int &FrameIndex)
const {
391 return MI.getOperand(0).getReg();
398 int &SrcFrameIndex)
const {
401 if (
MI.getOpcode() != SystemZ::MVC || !
MI.getOperand(0).isFI() ||
402 MI.getOperand(1).getImm() != 0 || !
MI.getOperand(3).isFI() ||
403 MI.getOperand(4).getImm() != 0)
407 int64_t
Length =
MI.getOperand(2).getImm();
408 unsigned FI1 =
MI.getOperand(0).getIndex();
409 unsigned FI2 =
MI.getOperand(3).getIndex();
414 DestFrameIndex = FI1;
423 bool AllowModify)
const {
429 while (
I !=
MBB.begin()) {
431 if (
I->isDebugInstr())
436 if (!isUnpredicatedTerminator(*
I))
446 if (!Branch.hasMBBTarget())
456 TBB = Branch.getMBBTarget();
461 MBB.erase(std::next(
I),
MBB.end());
467 if (
MBB.isLayoutSuccessor(Branch.getMBBTarget())) {
469 I->eraseFromParent();
475 TBB = Branch.getMBBTarget();
483 TBB = Branch.getMBBTarget();
490 assert(
Cond.size() == 2 &&
TBB &&
"Should have seen a conditional branch");
494 if (
TBB != Branch.getMBBTarget())
498 unsigned OldCCValid =
Cond[0].getImm();
499 unsigned OldCCMask =
Cond[1].getImm();
500 if (OldCCValid == Branch.CCValid && OldCCMask == Branch.CCMask)
511 int *BytesRemoved)
const {
512 assert(!BytesRemoved &&
"code size not handled");
518 while (
I !=
MBB.begin()) {
520 if (
I->isDebugInstr())
527 I->eraseFromParent();
537 assert(
Cond.size() == 2 &&
"Invalid condition");
547 int *BytesAdded)
const {
553 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
555 "SystemZ branch conditions have one component!");
556 assert(!BytesAdded &&
"code size not handled");
560 assert(!FBB &&
"Unconditional branch with multiple successors!");
567 unsigned CCValid =
Cond[0].getImm();
568 unsigned CCMask =
Cond[1].getImm();
583 int64_t &
Value)
const {
584 assert(
MI.isCompare() &&
"Caller should have checked for a comparison");
586 if (
MI.getNumExplicitOperands() == 2 &&
MI.getOperand(0).isReg() &&
587 MI.getOperand(1).isImm()) {
588 SrcReg =
MI.getOperand(0).getReg();
590 Value =
MI.getOperand(1).getImm();
603 int &FalseCycles)
const {
605 if (!STI.hasLoadStoreOnCond())
607 if (Pred.size() != 2)
613 RI.getCommonSubClass(
MRI.getRegClass(TrueReg),
MRI.getRegClass(FalseReg));
618 if ((STI.hasLoadStoreOnCond2() &&
619 SystemZ::GRX32BitRegClass.hasSubClassEq(RC)) ||
620 SystemZ::GR32BitRegClass.hasSubClassEq(RC) ||
621 SystemZ::GR64BitRegClass.hasSubClassEq(RC)) {
641 assert(Pred.size() == 2 &&
"Invalid condition");
642 unsigned CCValid = Pred[0].getImm();
643 unsigned CCMask = Pred[1].getImm();
646 if (SystemZ::GRX32BitRegClass.hasSubClassEq(RC)) {
647 if (STI.hasMiscellaneousExtensions3())
648 Opc = SystemZ::SELRMux;
649 else if (STI.hasLoadStoreOnCond2())
650 Opc = SystemZ::LOCRMux;
653 MRI.constrainRegClass(DstReg, &SystemZ::GR32BitRegClass);
654 Register TReg =
MRI.createVirtualRegister(&SystemZ::GR32BitRegClass);
655 Register FReg =
MRI.createVirtualRegister(&SystemZ::GR32BitRegClass);
661 }
else if (SystemZ::GR64BitRegClass.hasSubClassEq(RC)) {
662 if (STI.hasMiscellaneousExtensions3())
663 Opc = SystemZ::SELGR;
665 Opc = SystemZ::LOCGR;
677 unsigned DefOpc =
DefMI.getOpcode();
679 if (DefOpc == SystemZ::VGBM) {
680 int64_t ImmVal =
DefMI.getOperand(1).getImm();
695 MRI->getRegClass(CopyDstReg) == &SystemZ::GR128BitRegClass &&
696 MRI->hasOneNonDBGUse(Reg)) {
700 Register TmpReg =
MRI->createVirtualRegister(&SystemZ::GR64BitRegClass);
705 UseMI.setDesc(
get(SystemZ::REG_SEQUENCE));
706 UseMI.getOperand(1).setReg(TmpReg);
708 .
addImm(SystemZ::subreg_h64)
710 .
addImm(SystemZ::subreg_l64);
712 if (
MRI->use_nodbg_empty(Reg))
713 DefMI.eraseFromParent();
720 if (DefOpc != SystemZ::LHIMux && DefOpc != SystemZ::LHI &&
721 DefOpc != SystemZ::LGHI)
723 if (
DefMI.getOperand(0).getReg() != Reg)
725 int32_t ImmVal = (int32_t)
DefMI.getOperand(1).getImm();
727 unsigned UseOpc =
UseMI.getOpcode();
733 case SystemZ::SELRMux:
736 case SystemZ::LOCRMux:
737 if (!STI.hasLoadStoreOnCond2())
739 NewUseOpc = SystemZ::LOCHIMux;
740 if (
UseMI.getOperand(2).getReg() == Reg)
742 else if (
UseMI.getOperand(1).getReg() == Reg)
743 UseIdx = 2, CommuteIdx = 1;
751 if (!STI.hasLoadStoreOnCond2())
753 NewUseOpc = SystemZ::LOCGHI;
754 if (
UseMI.getOperand(2).getReg() == Reg)
756 else if (
UseMI.getOperand(1).getReg() == Reg)
757 UseIdx = 2, CommuteIdx = 1;
765 if (CommuteIdx != -1)
766 if (!commuteInstruction(
UseMI,
false, CommuteIdx, UseIdx))
769 bool DeleteDef =
MRI->hasOneNonDBGUse(Reg);
772 UseMI.tieOperands(0, 1);
773 UseMI.getOperand(UseIdx).ChangeToImmediate(ImmVal);
775 DefMI.eraseFromParent();
781 unsigned Opcode =
MI.getOpcode();
782 if (Opcode == SystemZ::Return ||
783 Opcode == SystemZ::Return_XPLINK ||
784 Opcode == SystemZ::Trap ||
785 Opcode == SystemZ::CallJG ||
786 Opcode == SystemZ::CallBR)
793 unsigned NumCycles,
unsigned ExtraPredCycles,
803 if (
MBB.getLastNonDebugInstr()->getOpcode() != SystemZ::Trap &&
807 return NumCycles == 1;
812 unsigned NumCyclesT,
unsigned ExtraPredCyclesT,
814 unsigned NumCyclesF,
unsigned ExtraPredCyclesF,
824 return NumCycles == 1;
829 assert(Pred.size() == 2 &&
"Invalid condition");
830 unsigned CCValid = Pred[0].getImm();
831 unsigned CCMask = Pred[1].getImm();
832 assert(CCMask > 0 && CCMask < 15 &&
"Invalid predicate");
833 unsigned Opcode =
MI.getOpcode();
834 if (Opcode == SystemZ::Trap) {
835 MI.setDesc(
get(SystemZ::CondTrap));
841 if (Opcode == SystemZ::Return || Opcode == SystemZ::Return_XPLINK) {
842 MI.setDesc(
get(Opcode == SystemZ::Return ? SystemZ::CondReturn
843 : SystemZ::CondReturn_XPLINK));
850 if (Opcode == SystemZ::CallJG) {
852 const uint32_t *RegMask =
MI.getOperand(1).getRegMask();
855 MI.setDesc(
get(SystemZ::CallBRCL));
864 if (Opcode == SystemZ::CallBR) {
866 const uint32_t *RegMask =
MI.getOperand(1).getRegMask();
869 MI.setDesc(
get(SystemZ::CallBCR));
885 bool RenamableSrc)
const {
889 if (SystemZ::GR128BitRegClass.
contains(DestReg, SrcReg)) {
891 RI.getSubReg(SrcReg, SystemZ::subreg_h64), KillSrc);
895 RI.getSubReg(SrcReg, SystemZ::subreg_l64), KillSrc);
901 if (SystemZ::GRX32BitRegClass.
contains(DestReg, SrcReg)) {
902 emitGRX32Move(
MBB,
MBBI,
DL, DestReg, SrcReg, SystemZ::LR, 32, KillSrc,
908 if (SystemZ::VR128BitRegClass.
contains(DestReg) &&
909 SystemZ::FP128BitRegClass.
contains(SrcReg)) {
911 RI.getMatchingSuperReg(RI.getSubReg(SrcReg, SystemZ::subreg_h64),
912 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
914 RI.getMatchingSuperReg(RI.getSubReg(SrcReg, SystemZ::subreg_l64),
915 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
922 if (SystemZ::FP128BitRegClass.
contains(DestReg) &&
923 SystemZ::VR128BitRegClass.
contains(SrcReg)) {
925 RI.getMatchingSuperReg(RI.getSubReg(DestReg, SystemZ::subreg_h64),
926 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
928 RI.getMatchingSuperReg(RI.getSubReg(DestReg, SystemZ::subreg_l64),
929 SystemZ::subreg_h64, &SystemZ::VR128BitRegClass);
931 if (DestRegHi != SrcReg.
asMCReg())
938 if (SystemZ::FP128BitRegClass.
contains(DestReg) &&
939 SystemZ::GR128BitRegClass.
contains(SrcReg)) {
940 MCRegister DestRegHi = RI.getSubReg(DestReg, SystemZ::subreg_h64);
941 MCRegister DestRegLo = RI.getSubReg(DestReg, SystemZ::subreg_l64);
942 MCRegister SrcRegHi = RI.getSubReg(SrcReg, SystemZ::subreg_h64);
943 MCRegister SrcRegLo = RI.getSubReg(SrcReg, SystemZ::subreg_l64);
955 if (DestReg == SystemZ::CC) {
957 SystemZ::GR32BitRegClass.contains(SrcReg) ? SystemZ::TMLH : SystemZ::TMHH;
964 if (SystemZ::GR128BitRegClass.
contains(DestReg) &&
965 SystemZ::VR128BitRegClass.
contains(SrcReg)) {
966 MCRegister DestH64 = RI.getSubReg(DestReg, SystemZ::subreg_h64);
967 MCRegister DestL64 = RI.getSubReg(DestReg, SystemZ::subreg_l64);
971 .
addReg(SystemZ::NoRegister)
976 .
addReg(SystemZ::NoRegister)
981 if (SystemZ::VR128BitRegClass.
contains(DestReg) &&
982 SystemZ::GR128BitRegClass.
contains(SrcReg)) {
984 .
addReg(RI.getSubReg(SrcReg, SystemZ::subreg_h64))
985 .
addReg(RI.getSubReg(SrcReg, SystemZ::subreg_l64));
991 if (SystemZ::GR64BitRegClass.
contains(DestReg, SrcReg))
992 Opcode = SystemZ::LGR;
993 else if (SystemZ::FP16BitRegClass.
contains(DestReg, SrcReg))
994 Opcode = STI.hasVector() ? SystemZ::LDR16 : SystemZ::LER16;
995 else if (SystemZ::FP32BitRegClass.
contains(DestReg, SrcReg))
997 Opcode = STI.hasVector() ? SystemZ::LDR32 : SystemZ::LER;
998 else if (SystemZ::FP64BitRegClass.
contains(DestReg, SrcReg))
999 Opcode = SystemZ::LDR;
1000 else if (SystemZ::FP128BitRegClass.
contains(DestReg, SrcReg))
1001 Opcode = SystemZ::LXR;
1002 else if (SystemZ::VR32BitRegClass.
contains(DestReg, SrcReg))
1003 Opcode = SystemZ::VLR32;
1004 else if (SystemZ::VR64BitRegClass.
contains(DestReg, SrcReg))
1005 Opcode = SystemZ::VLR64;
1006 else if (SystemZ::VR128BitRegClass.
contains(DestReg, SrcReg))
1007 Opcode = SystemZ::VLR;
1008 else if (SystemZ::AR32BitRegClass.
contains(DestReg, SrcReg))
1009 Opcode = SystemZ::CPYA;
1010 else if (SystemZ::GR64BitRegClass.
contains(DestReg) &&
1011 SystemZ::FP64BitRegClass.
contains(SrcReg))
1012 Opcode = SystemZ::LGDR;
1013 else if (SystemZ::FP64BitRegClass.
contains(DestReg) &&
1014 SystemZ::GR64BitRegClass.
contains(SrcReg))
1015 Opcode = SystemZ::LDGR;
1032 unsigned LoadOpcode, StoreOpcode;
1049 unsigned LoadOpcode, StoreOpcode;
1059 return ((
MCID.TSFlags & Flag) &&
1061 MI->getOperand(3).getReg() == 0);
1067 LogicOp() =
default;
1068 LogicOp(
unsigned regSize,
unsigned immLSB,
unsigned immSize)
1069 :
RegSize(regSize), ImmLSB(immLSB), ImmSize(immSize) {}
1071 explicit operator bool()
const {
return RegSize; }
1074 unsigned ImmLSB = 0;
1075 unsigned ImmSize = 0;
1082 case SystemZ::NILMux:
return LogicOp(32, 0, 16);
1083 case SystemZ::NIHMux:
return LogicOp(32, 16, 16);
1084 case SystemZ::NILL64:
return LogicOp(64, 0, 16);
1085 case SystemZ::NILH64:
return LogicOp(64, 16, 16);
1086 case SystemZ::NIHL64:
return LogicOp(64, 32, 16);
1087 case SystemZ::NIHH64:
return LogicOp(64, 48, 16);
1088 case SystemZ::NIFMux:
return LogicOp(32, 0, 32);
1089 case SystemZ::NILF64:
return LogicOp(64, 0, 32);
1090 case SystemZ::NIHF64:
return LogicOp(64, 32, 32);
1091 default:
return LogicOp();
1099 if (CCDef !=
nullptr)
1121 unsigned Start, End;
1124 if (
And.RegSize == 64) {
1125 NewOpcode = SystemZ::RISBG;
1127 if (STI.hasMiscellaneousExtensions())
1128 NewOpcode = SystemZ::RISBGN;
1130 NewOpcode = SystemZ::RISBMux;
1146 unsigned NumOps =
MI.getNumOperands();
1149 if (
Op.isReg() &&
Op.isKill())
1163 bool Invert)
const {
1169 Opc = *InverseOpcode;
1176 case SystemZ::WFADB:
1177 case SystemZ::WFASB:
1178 case SystemZ::WFAXB:
1179 case SystemZ::VFADB:
1180 case SystemZ::VFASB:
1181 case SystemZ::WFMDB:
1182 case SystemZ::WFMSB:
1183 case SystemZ::WFMXB:
1184 case SystemZ::VFMDB:
1185 case SystemZ::VFMSB:
1193std::optional<unsigned>
1197 case SystemZ::WFADB:
1198 return SystemZ::WFSDB;
1199 case SystemZ::WFASB:
1200 return SystemZ::WFSSB;
1201 case SystemZ::WFAXB:
1202 return SystemZ::WFSXB;
1203 case SystemZ::VFADB:
1204 return SystemZ::VFSDB;
1205 case SystemZ::VFASB:
1206 return SystemZ::VFSSB;
1208 case SystemZ::WFSDB:
1209 return SystemZ::WFADB;
1210 case SystemZ::WFSSB:
1211 return SystemZ::WFASB;
1212 case SystemZ::WFSXB:
1213 return SystemZ::WFAXB;
1214 case SystemZ::VFSDB:
1215 return SystemZ::VFADB;
1216 case SystemZ::VFSSB:
1217 return SystemZ::VFASB;
1219 return std::nullopt;
1231 unsigned Opcode =
MI.getOpcode();
1236 bool CCLiveAtMI =
true;
1241 CCLiveRange = &LIS->
getRegUnit(*CCUnits.begin());
1242 CCLiveAtMI = CCLiveRange->
liveAt(MISlot);
1245 if (
Ops.size() == 2 &&
Ops[0] == 0 &&
Ops[1] == 1) {
1246 if (!CCLiveAtMI && (Opcode == SystemZ::LA || Opcode == SystemZ::LAY) &&
1247 isInt<8>(
MI.getOperand(2).getImm()) && !
MI.getOperand(3).getReg()) {
1250 MI.getDebugLoc(),
get(SystemZ::AGSI))
1253 .
addImm(
MI.getOperand(2).getImm());
1263 if (
Ops.size() != 1)
1266 unsigned OpNum =
Ops[0];
1270 (RC == &SystemZ::FP16BitRegClass &&
Size == 4 && !STI.hasVector())) &&
1271 "Invalid size combination");
1274 if ((Opcode == SystemZ::AHI || Opcode == SystemZ::AGHI) && OpNum == 0 &&
1277 Opcode = (Opcode == SystemZ::AHI ? SystemZ::ASI : SystemZ::AGSI);
1279 BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
get(Opcode))
1282 .
addImm(
MI.getOperand(2).getImm());
1288 if ((Opcode == SystemZ::ALFI && OpNum == 0 &&
1289 isInt<8>((int32_t)
MI.getOperand(2).getImm())) ||
1290 (Opcode == SystemZ::ALGFI && OpNum == 0 &&
1293 Opcode = (Opcode == SystemZ::ALFI ? SystemZ::ALSI : SystemZ::ALGSI);
1295 BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
get(Opcode))
1298 .
addImm((int8_t)
MI.getOperand(2).getImm());
1303 if ((Opcode == SystemZ::SLFI && OpNum == 0 &&
1304 isInt<8>((int32_t)-
MI.getOperand(2).getImm())) ||
1305 (Opcode == SystemZ::SLGFI && OpNum == 0 &&
1308 Opcode = (Opcode == SystemZ::SLFI ? SystemZ::ALSI : SystemZ::ALGSI);
1310 BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
get(Opcode))
1313 .
addImm((int8_t)-
MI.getOperand(2).getImm());
1318 unsigned MemImmOpc = 0;
1320 case SystemZ::LHIMux:
1321 case SystemZ::LHI: MemImmOpc = SystemZ::MVHI;
break;
1322 case SystemZ::LGHI: MemImmOpc = SystemZ::MVGHI;
break;
1323 case SystemZ::CHIMux:
1324 case SystemZ::CHI: MemImmOpc = SystemZ::CHSI;
break;
1325 case SystemZ::CGHI: MemImmOpc = SystemZ::CGHSI;
break;
1326 case SystemZ::CLFIMux:
1329 MemImmOpc = SystemZ::CLFHSI;
1331 case SystemZ::CLGFI:
1333 MemImmOpc = SystemZ::CLGHSI;
1338 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1342 .
addImm(
MI.getOperand(1).getImm());
1344 if (Opcode == SystemZ::LGDR || Opcode == SystemZ::LDGR) {
1345 bool Op0IsGPR = (Opcode == SystemZ::LGDR);
1346 bool Op1IsGPR = (Opcode == SystemZ::LDGR);
1350 unsigned StoreOpcode = Op1IsGPR ? SystemZ::STG : SystemZ::STD;
1351 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1353 .
add(
MI.getOperand(1))
1361 unsigned LoadOpcode = Op0IsGPR ? SystemZ::LG : SystemZ::LD;
1362 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1364 .
add(
MI.getOperand(0))
1384 if (OpNum == 0 &&
MI.hasOneMemOperand()) {
1389 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1394 .
add(
MI.getOperand(1))
1400 return BuildMI(*InsertPt->getParent(), InsertPt,
MI.getDebugLoc(),
1402 .
add(
MI.getOperand(1))
1415 unsigned NumOps =
MI.getNumExplicitOperands();
1416 int MemOpcode = SystemZ::getMemOpcode(Opcode);
1417 if (MemOpcode == -1 ||
1418 (CCLiveAtMI && !
MI.definesRegister(SystemZ::CC,
nullptr) &&
1419 get(MemOpcode).hasImplicitDefOfPhysReg(SystemZ::CC)))
1425 for (
unsigned I = 0, E =
MCID.getNumOperands();
I != E; ++
I) {
1430 if (RC == &SystemZ::VR32BitRegClass || RC == &SystemZ::VR64BitRegClass) {
1436 !(SystemZ::FP32BitRegClass.
contains(PhysReg) ||
1437 SystemZ::FP64BitRegClass.
contains(PhysReg) ||
1438 SystemZ::VF128BitRegClass.
contains(PhysReg)))
1443 bool FusedFPOp = (Opcode == SystemZ::WFMADB || Opcode == SystemZ::WFMASB ||
1444 Opcode == SystemZ::WFMSDB || Opcode == SystemZ::WFMSSB);
1448 if (OpNum == 0 || OpNum == 3 || DstReg != AccReg)
1453 bool NeedsCommute =
false;
1454 if ((
MI.getOpcode() == SystemZ::CR ||
MI.getOpcode() == SystemZ::CGR ||
1455 MI.getOpcode() == SystemZ::CLR ||
MI.getOpcode() == SystemZ::CLGR ||
1456 MI.getOpcode() == SystemZ::WFCDB ||
MI.getOpcode() == SystemZ::WFCSB ||
1457 MI.getOpcode() == SystemZ::WFKDB ||
MI.getOpcode() == SystemZ::WFKSB) &&
1459 NeedsCommute =
true;
1461 bool CCOperands =
false;
1462 if (
MI.getOpcode() == SystemZ::LOCRMux ||
MI.getOpcode() == SystemZ::LOCGR ||
1463 MI.getOpcode() == SystemZ::SELRMux ||
MI.getOpcode() == SystemZ::SELGR) {
1465 "LOCR/SELR instruction operands corrupt?");
1481 : ((OpNum == 1 &&
MI.isCommutable())
1482 ?
MI.getOperand(2).getReg()
1484 if (DstPhys && !SystemZ::GRH32BitRegClass.
contains(DstPhys) && SrcReg &&
1486 NeedsCommute = (OpNum == 1);
1492 if ((OpNum ==
NumOps - 1) || NeedsCommute || FusedFPOp) {
1495 assert(AccessBytes != 0 &&
"Size of access should be known");
1496 assert(AccessBytes <=
Size &&
"Access outside the frame index");
1499 MI.getDebugLoc(),
get(MemOpcode));
1500 if (
MI.isCompare()) {
1501 assert(
NumOps == 2 &&
"Expected 2 register operands for a compare.");
1502 MIB.
add(
MI.getOperand(NeedsCommute ? 1 : 0));
1504 else if (FusedFPOp) {
1505 MIB.
add(
MI.getOperand(0));
1506 MIB.
add(
MI.getOperand(3));
1507 MIB.
add(
MI.getOperand(OpNum == 1 ? 2 : 1));
1510 MIB.
add(
MI.getOperand(0));
1512 MIB.
add(
MI.getOperand(2));
1514 for (
unsigned I = 1;
I < OpNum; ++
I)
1515 MIB.
add(
MI.getOperand(
I));
1521 unsigned CCValid =
MI.getOperand(
NumOps).getImm();
1522 unsigned CCMask =
MI.getOperand(
NumOps + 1).getImm();
1524 MIB.
addImm(NeedsCommute ? CCMask ^ CCValid : CCMask);
1527 (!
MI.definesRegister(SystemZ::CC,
nullptr) ||
1528 MI.registerDefIsDead(SystemZ::CC,
nullptr))) {
1536 if (MO.isReg() && MO.getReg().isVirtual()) {
1538 if (
MRI.getRegClass(Reg) == &SystemZ::VR32BitRegClass)
1539 MRI.setRegClass(Reg, &SystemZ::FP32BitRegClass);
1540 else if (
MRI.getRegClass(Reg) == &SystemZ::VR64BitRegClass)
1541 MRI.setRegClass(Reg, &SystemZ::FP64BitRegClass);
1542 else if (
MRI.getRegClass(Reg) == &SystemZ::VR128BitRegClass)
1543 MRI.setRegClass(Reg, &SystemZ::VF128BitRegClass);
1568 unsigned LoadOpc = 0;
1569 unsigned RegMemOpcode = 0;
1571 RegMemOpcode =
MI.getOpcode() == SystemZ::WFADB ? SystemZ::ADB
1572 :
MI.getOpcode() == SystemZ::WFSDB ? SystemZ::SDB
1573 :
MI.getOpcode() == SystemZ::WFMDB ? SystemZ::MDB
1576 LoadOpc = SystemZ::VL64;
1577 FPRC = &SystemZ::FP64BitRegClass;
1579 RegMemOpcode =
MI.getOpcode() == SystemZ::WFASB ? SystemZ::AEB
1580 :
MI.getOpcode() == SystemZ::WFSSB ? SystemZ::SEB
1581 :
MI.getOpcode() == SystemZ::WFMSB ? SystemZ::MEEB
1584 LoadOpc = SystemZ::VL32;
1585 FPRC = &SystemZ::FP32BitRegClass;
1588 if (!RegMemOpcode || LoadMI.
getOpcode() != LoadOpc)
1592 if (
get(RegMemOpcode).hasImplicitDefOfPhysReg(SystemZ::CC)) {
1594 assert(LoadMI != InsertPt &&
"Assuming InsertPt not to be first in MBB.");
1597 if (MII->definesRegister(SystemZ::CC,
nullptr)) {
1598 if (!MII->registerDefIsDead(SystemZ::CC,
nullptr))
1602 if (MII ==
MBB->begin()) {
1603 if (
MBB->isLiveIn(SystemZ::CC))
1611 if (
Ops.size() != 1 || FoldAsLoadDefReg !=
MI.getOperand(
Ops[0]).getReg())
1617 if ((RegMemOpcode == SystemZ::SDB || RegMemOpcode == SystemZ::SEB) &&
1618 FoldAsLoadDefReg != RHS.getReg())
1625 BuildMI(*
MI.getParent(), InsertPt,
MI.getDebugLoc(),
get(RegMemOpcode), DstReg)
1631 MRI->setRegClass(DstReg, FPRC);
1639 switch (
MI.getOpcode()) {
1641 splitMove(
MI, SystemZ::LG);
1644 case SystemZ::ST128:
1645 splitMove(
MI, SystemZ::STG);
1649 splitMove(
MI, SystemZ::LD);
1653 splitMove(
MI, SystemZ::STD);
1656 case SystemZ::LBMux:
1657 expandRXYPseudo(
MI, SystemZ::LB, SystemZ::LBH);
1660 case SystemZ::LHMux:
1661 expandRXYPseudo(
MI, SystemZ::LH, SystemZ::LHH);
1664 case SystemZ::LLCRMux:
1665 expandZExtPseudo(
MI, SystemZ::LLCR, 8);
1668 case SystemZ::LLHRMux:
1669 expandZExtPseudo(
MI, SystemZ::LLHR, 16);
1672 case SystemZ::LLCMux:
1673 expandRXYPseudo(
MI, SystemZ::LLC, SystemZ::LLCH);
1676 case SystemZ::LLHMux:
1677 expandRXYPseudo(
MI, SystemZ::LLH, SystemZ::LLHH);
1681 expandRXYPseudo(
MI, SystemZ::L, SystemZ::LFH);
1684 case SystemZ::LOCMux:
1685 expandLOCPseudo(
MI, SystemZ::LOC, SystemZ::LOCFH);
1688 case SystemZ::LOCHIMux:
1689 expandLOCPseudo(
MI, SystemZ::LOCHI, SystemZ::LOCHHI);
1692 case SystemZ::STCMux:
1693 expandRXYPseudo(
MI, SystemZ::STC, SystemZ::STCH);
1696 case SystemZ::STHMux:
1697 expandRXYPseudo(
MI, SystemZ::STH, SystemZ::STHH);
1700 case SystemZ::STMux:
1701 expandRXYPseudo(
MI, SystemZ::ST, SystemZ::STFH);
1704 case SystemZ::STOCMux:
1705 expandLOCPseudo(
MI, SystemZ::STOC, SystemZ::STOCFH);
1708 case SystemZ::LHIMux:
1709 expandRIPseudo(
MI, SystemZ::LHI, SystemZ::IIHF,
true);
1712 case SystemZ::IIFMux:
1713 expandRIPseudo(
MI, SystemZ::IILF, SystemZ::IIHF,
false);
1716 case SystemZ::IILMux:
1717 expandRIPseudo(
MI, SystemZ::IILL, SystemZ::IIHL,
false);
1720 case SystemZ::IIHMux:
1721 expandRIPseudo(
MI, SystemZ::IILH, SystemZ::IIHH,
false);
1724 case SystemZ::NIFMux:
1725 expandRIPseudo(
MI, SystemZ::NILF, SystemZ::NIHF,
false);
1728 case SystemZ::NILMux:
1729 expandRIPseudo(
MI, SystemZ::NILL, SystemZ::NIHL,
false);
1732 case SystemZ::NIHMux:
1733 expandRIPseudo(
MI, SystemZ::NILH, SystemZ::NIHH,
false);
1736 case SystemZ::OIFMux:
1737 expandRIPseudo(
MI, SystemZ::OILF, SystemZ::OIHF,
false);
1740 case SystemZ::OILMux:
1741 expandRIPseudo(
MI, SystemZ::OILL, SystemZ::OIHL,
false);
1744 case SystemZ::OIHMux:
1745 expandRIPseudo(
MI, SystemZ::OILH, SystemZ::OIHH,
false);
1748 case SystemZ::XIFMux:
1749 expandRIPseudo(
MI, SystemZ::XILF, SystemZ::XIHF,
false);
1752 case SystemZ::TMLMux:
1753 expandRIPseudo(
MI, SystemZ::TMLL, SystemZ::TMHL,
false);
1756 case SystemZ::TMHMux:
1757 expandRIPseudo(
MI, SystemZ::TMLH, SystemZ::TMHH,
false);
1760 case SystemZ::AHIMux:
1761 expandRIPseudo(
MI, SystemZ::AHI, SystemZ::AIH,
false);
1764 case SystemZ::AHIMuxK:
1765 expandRIEPseudo(
MI, SystemZ::AHI, SystemZ::AHIK, SystemZ::AIH);
1768 case SystemZ::AFIMux:
1769 expandRIPseudo(
MI, SystemZ::AFI, SystemZ::AIH,
false);
1772 case SystemZ::CHIMux:
1773 expandRIPseudo(
MI, SystemZ::CHI, SystemZ::CIH,
false);
1776 case SystemZ::CFIMux:
1777 expandRIPseudo(
MI, SystemZ::CFI, SystemZ::CIH,
false);
1780 case SystemZ::CLFIMux:
1781 expandRIPseudo(
MI, SystemZ::CLFI, SystemZ::CLIH,
false);
1785 expandRXYPseudo(
MI, SystemZ::C, SystemZ::CHF);
1788 case SystemZ::CLMux:
1789 expandRXYPseudo(
MI, SystemZ::CL, SystemZ::CLHF);
1792 case SystemZ::RISBMux: {
1795 if (SrcIsHigh == DestIsHigh)
1796 MI.setDesc(
get(DestIsHigh ? SystemZ::RISBHH : SystemZ::RISBLL));
1798 MI.setDesc(
get(DestIsHigh ? SystemZ::RISBHL : SystemZ::RISBLH));
1799 MI.getOperand(5).setImm(
MI.getOperand(5).getImm() ^ 32);
1804 case SystemZ::ADJDYNALLOC:
1805 splitAdjDynAlloc(
MI);
1808 case TargetOpcode::LOAD_STACK_GUARD:
1809 expandLoadStackGuard(&
MI);
1818 if (
MI.isInlineAsm()) {
1820 const char *AsmStr =
MI.getOperand(0).getSymbolName();
1823 else if (
MI.getOpcode() == SystemZ::PATCHPOINT)
1825 else if (
MI.getOpcode() == SystemZ::STACKMAP)
1826 return MI.getOperand(1).getImm();
1827 else if (
MI.getOpcode() == SystemZ::FENTRY_CALL)
1829 if (
MI.getOpcode() == TargetOpcode::PATCHABLE_FUNCTION_ENTER)
1831 if (
MI.getOpcode() == TargetOpcode::PATCHABLE_RET)
1832 return 18 + (
MI.getOperand(0).
getImm() == SystemZ::CondReturn ? 4 : 0);
1834 return MI.getDesc().getSize();
1839 switch (
MI.getOpcode()) {
1850 MI.getOperand(1).getImm(), &
MI.getOperand(2));
1853 case SystemZ::BRCTH:
1857 case SystemZ::BRCTG:
1864 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1869 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1874 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1876 case SystemZ::CLGIJ:
1877 case SystemZ::CLGRJ:
1879 MI.getOperand(2).getImm(), &
MI.getOperand(3));
1881 case SystemZ::INLINEASM_BR:
1891 unsigned &LoadOpcode,
1892 unsigned &StoreOpcode)
const {
1893 if (RC == &SystemZ::GR32BitRegClass || RC == &SystemZ::ADDR32BitRegClass) {
1894 LoadOpcode = SystemZ::L;
1895 StoreOpcode = SystemZ::ST;
1896 }
else if (RC == &SystemZ::GRH32BitRegClass) {
1897 LoadOpcode = SystemZ::LFH;
1898 StoreOpcode = SystemZ::STFH;
1899 }
else if (RC == &SystemZ::GRX32BitRegClass) {
1900 LoadOpcode = SystemZ::LMux;
1901 StoreOpcode = SystemZ::STMux;
1902 }
else if (RC == &SystemZ::GR64BitRegClass ||
1903 RC == &SystemZ::ADDR64BitRegClass) {
1904 LoadOpcode = SystemZ::LG;
1905 StoreOpcode = SystemZ::STG;
1906 }
else if (RC == &SystemZ::GR128BitRegClass ||
1907 RC == &SystemZ::ADDR128BitRegClass) {
1908 LoadOpcode = SystemZ::L128;
1909 StoreOpcode = SystemZ::ST128;
1910 }
else if (RC == &SystemZ::FP16BitRegClass && !STI.hasVector()) {
1911 LoadOpcode = SystemZ::LE16;
1912 StoreOpcode = SystemZ::STE16;
1913 }
else if (RC == &SystemZ::FP32BitRegClass) {
1914 LoadOpcode = SystemZ::LE;
1915 StoreOpcode = SystemZ::STE;
1916 }
else if (RC == &SystemZ::FP64BitRegClass) {
1917 LoadOpcode = SystemZ::LD;
1918 StoreOpcode = SystemZ::STD;
1919 }
else if (RC == &SystemZ::FP128BitRegClass) {
1920 LoadOpcode = SystemZ::LX;
1921 StoreOpcode = SystemZ::STX;
1922 }
else if (RC == &SystemZ::FP16BitRegClass ||
1923 RC == &SystemZ::VR16BitRegClass) {
1924 LoadOpcode = SystemZ::VL16;
1925 StoreOpcode = SystemZ::VST16;
1926 }
else if (RC == &SystemZ::VR32BitRegClass) {
1927 LoadOpcode = SystemZ::VL32;
1928 StoreOpcode = SystemZ::VST32;
1929 }
else if (RC == &SystemZ::VR64BitRegClass) {
1930 LoadOpcode = SystemZ::VL64;
1931 StoreOpcode = SystemZ::VST64;
1932 }
else if (RC == &SystemZ::VF128BitRegClass ||
1933 RC == &SystemZ::VR128BitRegClass) {
1934 LoadOpcode = SystemZ::VL;
1935 StoreOpcode = SystemZ::VST;
1947 int Disp12Opcode = SystemZ::getDisp12Opcode(Opcode);
1948 if (Disp12Opcode >= 0)
1949 return Disp12Opcode;
1957 int Disp20Opcode = SystemZ::getDisp20Opcode(Opcode);
1958 if (Disp20Opcode >= 0)
1959 return Disp20Opcode;
1966 if (
MI &&
MI->getOperand(0).isReg()) {
1971 return SystemZ::LEY;
1972 case SystemZ::VST32:
1973 return SystemZ::STEY;
1975 return SystemZ::LDY;
1976 case SystemZ::VST64:
1977 return SystemZ::STDY;
1989 return SystemZ::getDisp12Opcode(Opcode) >= 0;
1990 return SystemZ::getDisp20Opcode(Opcode) >= 0;
1995 case SystemZ::L:
return SystemZ::LT;
1996 case SystemZ::LY:
return SystemZ::LT;
1997 case SystemZ::LG:
return SystemZ::LTG;
1998 case SystemZ::LGF:
return SystemZ::LTGF;
1999 case SystemZ::LR:
return SystemZ::LTR;
2000 case SystemZ::LGFR:
return SystemZ::LTGFR;
2001 case SystemZ::LGR:
return SystemZ::LTGR;
2002 case SystemZ::LCDFR:
return SystemZ::LCDBR;
2003 case SystemZ::LPDFR:
return SystemZ::LPDBR;
2004 case SystemZ::LNDFR:
return SystemZ::LNDBR;
2005 case SystemZ::LCDFR_32:
return SystemZ::LCEBR;
2006 case SystemZ::LPDFR_32:
return SystemZ::LPEBR;
2007 case SystemZ::LNDFR_32:
return SystemZ::LNEBR;
2012 case SystemZ::RISBGN:
return SystemZ::RISBG;
2018 unsigned &Start,
unsigned &End)
const {
2028 Start = 63 - (LSB +
Length - 1);
2036 assert(LSB > 0 &&
"Bottom bit must be set");
2037 assert(LSB +
Length < BitSize &&
"Top bit must be set");
2038 Start = 63 - (LSB - 1);
2039 End = 63 - (LSB +
Length);
2056 case SystemZ::CLGFI:
2062 if (!STI.hasMiscellaneousExtensions())
2064 if (!(
MI &&
MI->getOperand(3).getReg() == 0))
2072 return SystemZ::CRJ;
2074 return SystemZ::CGRJ;
2076 return SystemZ::CIJ;
2078 return SystemZ::CGIJ;
2080 return SystemZ::CLRJ;
2082 return SystemZ::CLGRJ;
2084 return SystemZ::CLIJ;
2085 case SystemZ::CLGFI:
2086 return SystemZ::CLGIJ;
2093 return SystemZ::CRBReturn;
2095 return SystemZ::CGRBReturn;
2097 return SystemZ::CIBReturn;
2099 return SystemZ::CGIBReturn;
2101 return SystemZ::CLRBReturn;
2103 return SystemZ::CLGRBReturn;
2105 return SystemZ::CLIBReturn;
2106 case SystemZ::CLGFI:
2107 return SystemZ::CLGIBReturn;
2114 return SystemZ::CRBCall;
2116 return SystemZ::CGRBCall;
2118 return SystemZ::CIBCall;
2120 return SystemZ::CGIBCall;
2122 return SystemZ::CLRBCall;
2124 return SystemZ::CLGRBCall;
2126 return SystemZ::CLIBCall;
2127 case SystemZ::CLGFI:
2128 return SystemZ::CLGIBCall;
2135 return SystemZ::CRT;
2137 return SystemZ::CGRT;
2139 return SystemZ::CIT;
2141 return SystemZ::CGIT;
2143 return SystemZ::CLRT;
2145 return SystemZ::CLGRT;
2147 return SystemZ::CLFIT;
2148 case SystemZ::CLGFI:
2149 return SystemZ::CLGIT;
2151 return SystemZ::CLT;
2153 return SystemZ::CLGT;
2164 MBBI->getOperand(1).isReg() && !
MBBI->mayLoad() &&
2165 "Not a compare reg/reg.");
2171 if (
MI.readsRegister(SystemZ::CC,
nullptr)) {
2172 unsigned Flags =
MI.getDesc().TSFlags;
2178 if (
MI.definesRegister(SystemZ::CC,
nullptr)) {
2186 if (!
LiveRegs.available(SystemZ::CC))
2191 for (
unsigned Idx = 0; Idx < CCUsers.
size(); ++Idx) {
2192 unsigned Flags = CCUsers[Idx]->getDesc().TSFlags;
2194 0 : CCUsers[Idx]->getNumExplicitOperands() - 2);
2195 MachineOperand &CCMaskMO = CCUsers[Idx]->getOperand(FirstOpNum + 1);
2197 CCMaskMO.
setImm(NewCCMask);
2235 if (!STI.hasLoadAndTrap())
2240 return SystemZ::LAT;
2242 return SystemZ::LGAT;
2244 return SystemZ::LFHAT;
2246 return SystemZ::LLGFAT;
2248 return SystemZ::LLGTAT;
2257 unsigned Opcode = 0;
2259 Opcode = SystemZ::LGHI;
2261 Opcode = SystemZ::LLILL;
2263 Opcode = SystemZ::LLILH;
2267 Opcode = SystemZ::LGFI;
2274 assert (
MRI.isSSA() &&
"Huge values only handled before reg-alloc .");
2275 Register Reg0 =
MRI.createVirtualRegister(&SystemZ::GR64BitRegClass);
2276 Register Reg1 =
MRI.createVirtualRegister(&SystemZ::GR64BitRegClass);
2287 for (
unsigned I = 0, E =
MI.getNumOperands();
I != E; ++
I) {
2288 if (
I >=
MCID.getNumOperands())
2296 ((
MCOI.RegClass != -1 && !
Op.isReg() && !
Op.isFI()) ||
2297 (
MCOI.RegClass == -1 && !
Op.isImm()))) {
2298 ErrInfo =
"Addressing mode operands corrupt!";
2321 bool SameVal = (VALa && VALb && (VALa == VALb));
2325 if (PSVa && PSVb && (PSVa == PSVb))
2331 int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
2332 int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
2333 LocationSize LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
2335 LowOffset + (
int)LowWidth.
getValue() <= HighOffset)
2344 int64_t &ImmVal)
const {
2346 if (
MI.getOpcode() == SystemZ::VGBM && Reg ==
MI.getOperand(0).getReg()) {
2347 ImmVal =
MI.getOperand(1).getImm();
2355std::optional<DestSourcePair>
2361 return std::nullopt;
unsigned const MachineRegisterInfo * MRI
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
DXIL Forward Handle Accesses
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Register const TargetRegisterInfo * TRI
Promote Memory to Register
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
static bool isSimpleBD12Move(const MachineInstr *MI, unsigned Flag)
static void transferDeadCC(MachineInstr *OldMI, MachineInstr *NewMI)
static void transferMIFlag(MachineInstr *OldMI, MachineInstr *NewMI, MachineInstr::MIFlag Flag)
static int isSimpleMove(const MachineInstr &MI, int &FrameIndex, unsigned Flag)
static LogicOp interpretAndImmediate(unsigned Opcode)
static uint64_t allOnes(unsigned int Count)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
SlotIndexes * getSlotIndexes() const
VNInfo::Allocator & getVNInfoAllocator()
LiveRange & getRegUnit(MCRegUnit Unit)
Return the live range for register unit Unit.
SlotIndex ReplaceMachineInstrInMaps(MachineInstr &MI, MachineInstr &NewMI)
This class represents the liveness of a register, stack slot, etc.
bool liveAt(SlotIndex index) const
LLVM_ABI VNInfo * createDeadDef(SlotIndex Def, VNInfo::Allocator &VNIAlloc)
createDeadDef - Make sure the range has a value defined at Def.
A set of register units used to track register liveness.
LLVM_ABI void replaceKillInstruction(Register Reg, MachineInstr &OldMI, MachineInstr &NewMI)
replaceKillInstruction - Update register kill info by replacing a kill instruction with a new one.
TypeSize getValue() const
Describe properties that are true of each instruction in the target description file.
This holds information about one operand of a machine instruction, indicating the register class for ...
Wrapper class representing physical registers. Should be passed by value.
static MCRegister from(unsigned Val)
Check the provided unsigned value is a valid MCRegister.
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
uint64_t getMaxCallFrameSize() const
Return the maximum size of a call frame that must be allocated for an outgoing function call.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
BasicBlockListType::iterator iterator
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineInstr - Allocate a new MachineInstr.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addFrameIndex(int Idx) const
const MachineInstrBuilder & addRegMask(const uint32_t *Mask) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
const MachineInstrBuilder & addDef(Register RegNo, unsigned Flags=0, unsigned SubReg=0) const
Add a virtual register definition operand.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
bool registerDefIsDead(Register Reg, const TargetRegisterInfo *TRI) const
Returns true if the register is dead in this machine instruction.
bool definesRegister(Register Reg, const TargetRegisterInfo *TRI) const
Return true if the MachineInstr fully defines the specified register.
LLVM_ABI void setDesc(const MCInstrDesc &TID)
Replace the instruction descriptor (thus opcode) of the current instruction with a new one.
bool hasOneMemOperand() const
Return true if this instruction has exactly one MachineMemOperand.
mmo_iterator memoperands_begin() const
Access to memory operands of the instruction.
void setFlag(MIFlag Flag)
Set a MI flag.
const MachineOperand & getOperand(unsigned i) const
MachineOperand * findRegisterDefOperand(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false)
Wrapper for findRegisterDefOperandIdx, it returns a pointer to the MachineOperand rather than an inde...
LLVM_ABI bool addRegisterDead(Register Reg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI defined a register without a use.
A description of a memory reference used in the backend.
LocationSize getSize() const
Return the size in bytes of the memory reference.
const PseudoSourceValue * getPseudoValue() const
bool isAtomic() const
Returns true if this operation has an atomic ordering requirement of unordered or higher,...
const Value * getValue() const
Return the base address of the memory access.
int64_t getOffset() const
For normal values, this is a byte offset added to the base address.
MachineOperand class - Representation of each machine instruction operand.
void setImm(int64_t immVal)
void setIsDead(bool Val=true)
LLVM_ABI void setReg(Register Reg)
Change the register this operand corresponds to.
void setIsKill(bool Val=true)
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
MI-level patchpoint operands.
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given patchpoint should emit.
Special value supplied for machine level alias analysis.
Wrapper class representing virtual and physical registers.
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
SlotIndex - An opaque wrapper around machine indexes.
SlotIndex getRegSlot(bool EC=false) const
Returns the register use/def slot in the current instruction for a normal or early-clobber def.
SlotIndex getInstructionIndex(const MachineInstr &MI, bool IgnoreBundle=false) const
Returns the base index for the given instruction.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
virtual int getStackPointerBias()=0
virtual int getCallFrameSize()=0
unsigned getLoadAndTrap(unsigned Opcode) const
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Register isLoadFromStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
unsigned getLoadAndTest(unsigned Opcode) const
bool isPredicable(const MachineInstr &MI) const override
Register isStoreToStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const override
bool isStackSlotCopy(const MachineInstr &MI, int &DestFrameIndex, int &SrcFrameIndex) const override
MachineInstr * convertToThreeAddress(MachineInstr &MI, LiveVariables *LV, LiveIntervals *LIS) const override
unsigned getOpcodeForOffset(unsigned Opcode, int64_t Offset, const MachineInstr *MI=nullptr) const
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
bool getConstValDefinedInReg(const MachineInstr &MI, const Register Reg, int64_t &ImmVal) const override
bool isAssociativeAndCommutative(const MachineInstr &Inst, bool Invert) const override
bool hasDisplacementPairInsn(unsigned Opcode) const
MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned CommuteOpIdx1, unsigned CommuteOpIdx2) const override
Commutes the operands in the given instruction by changing the operands order and/or changing the ins...
void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, const DebugLoc &DL, Register DstReg, ArrayRef< MachineOperand > Cond, Register TrueReg, Register FalseReg) const override
std::optional< unsigned > getInverseOpcode(unsigned Opcode) const override
bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, BranchProbability Probability) const override
SystemZII::Branch getBranchInfo(const MachineInstr &MI) const
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
unsigned getFusedCompare(unsigned Opcode, SystemZII::FusedCompareType Type, const MachineInstr *MI=nullptr) const
bool expandPostRAPseudo(MachineInstr &MBBI) const override
bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &Mask, int64_t &Value) const override
bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override
void getLoadStoreOpcodes(const TargetRegisterClass *RC, unsigned &LoadOpcode, unsigned &StoreOpcode) const
bool isRxSBGMask(uint64_t Mask, unsigned BitSize, unsigned &Start, unsigned &End) const
bool foldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, Register Reg, MachineRegisterInfo *MRI) const override
bool canInsertSelect(const MachineBasicBlock &, ArrayRef< MachineOperand > Cond, Register, Register, Register, int &, int &, int &) const override
std::optional< DestSourcePair > isCopyInstrImpl(const MachineInstr &MI) const override
bool prepareCompareSwapOperands(MachineBasicBlock::iterator MBBI) const
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr &MI, ArrayRef< unsigned > Ops, MachineBasicBlock::iterator InsertPt, int FrameIndex, LiveIntervals *LIS=nullptr, VirtRegMap *VRM=nullptr) const override
SystemZInstrInfo(const SystemZSubtarget &STI)
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIdx, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
void loadImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned Reg, uint64_t Value) const
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Pred) const override
virtual MachineInstr * commuteInstructionImpl(MachineInstr &MI, bool NewMI, unsigned OpIdx1, unsigned OpIdx2) const
This method commutes the operands of the given machine instruction MI.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
MCRegister getPhys(Register virtReg) const
returns the physical register mapped to the specified virtual register
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Undef
Value of the register doesn't matter.
static unsigned getAccessSize(unsigned int Flags)
unsigned getFirstReg(unsigned Reg)
MachineBasicBlock * splitBlockBefore(MachineBasicBlock::iterator MI, MachineBasicBlock *MBB)
int getTargetMemOpcode(uint16_t Opcode)
const unsigned CCMASK_CMP_GT
const unsigned CCMASK_ANY
static bool isImmLL(uint64_t Val)
static bool isImmLH(uint64_t Val)
MachineBasicBlock * emitBlockAfter(MachineBasicBlock *MBB)
unsigned reverseCCMask(unsigned CCMask)
const unsigned CCMASK_CMP_EQ
const unsigned CCMASK_ICMP
MachineBasicBlock * splitBlockAfter(MachineBasicBlock::iterator MI, MachineBasicBlock *MBB)
const unsigned CCMASK_CMP_LT
const unsigned CCMASK_CMP_NE
bool isHighReg(unsigned int Reg)
const unsigned CCMASK_CMP_UO
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
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...
constexpr bool isShiftedMask_64(uint64_t Value)
Return true if the argument contains a non-empty sequence of ones with the remainder zero (64 bit ver...
constexpr size_t range_size(R &&Range)
Returns the size of the Range, i.e., the number of elements.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
FunctionAddr VTableAddr Count
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
unsigned getUndefRegState(bool B)
unsigned getKillRegState(bool B)
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.