68#define GET_INSTRINFO_CTOR_DTOR
69#include "AArch64GenInstrInfo.inc"
71#define DEBUG_TYPE "AArch64InstrInfo"
73STATISTIC(NumCopyInstrs,
"Number of COPY instructions expanded");
74STATISTIC(NumZCRegMoveInstrsGPR,
"Number of zero-cycle GPR register move "
75 "instructions expanded from canonical COPY");
76STATISTIC(NumZCRegMoveInstrsFPR,
"Number of zero-cycle FPR register move "
77 "instructions expanded from canonical COPY");
78STATISTIC(NumZCZeroingInstrsGPR,
"Number of zero-cycle GPR zeroing "
79 "instructions expanded from canonical COPY");
84 cl::desc(
"Restrict range of CB instructions (DEBUG)"));
88 cl::desc(
"Restrict range of TB[N]Z instructions (DEBUG)"));
92 cl::desc(
"Restrict range of CB[N]Z instructions (DEBUG)"));
96 cl::desc(
"Restrict range of Bcc instructions (DEBUG)"));
100 cl::desc(
"Restrict range of B instructions (DEBUG)"));
104 cl::desc(
"Restrict range of instructions to search for the "
105 "machine-combiner gather pattern optimization"));
109 cl::desc(
"Use a frame record for Mach-O non-leaf outlined functions"));
114 RI(STI.getTargetTriple(), STI.getHwMode()), Subtarget(STI) {}
124 switch (
MI.getOpcode()) {
135 if (
MI.getOperand(0).getReg() != AArch64::LR)
148 case AArch64::BLRAAZ:
150 case AArch64::BLRABZ:
154 case AArch64::AUTIASP:
155 case AArch64::AUTIBSP:
156 case AArch64::AUTIAZ:
157 case AArch64::AUTIBZ:
158 case AArch64::XPACLRI:
163 if (
MI.getOperand(0).getImm() == 3 &&
MI.getOperand(1).getImm() == 7 &&
164 MI.getOperand(3).getImm() == 1)
172 bool ModifiesLR =
false;
173 bool ModifiesSP =
false;
177 if (MO.getReg() == AArch64::LR)
179 else if (MO.getReg() == AArch64::SP)
188 if (
MI.mayLoadOrStore()) {
196 if (ModifiesSP || ModifiesLR)
214 auto Op =
MI.getOpcode();
215 if (
Op == AArch64::INLINEASM ||
Op == AArch64::INLINEASM_BR)
216 return getInlineAsmLength(
MI.getOperand(0).getSymbolName(), MAI);
220 if (
MI.isMetaInstruction())
225 unsigned NumBytes = 0;
235 NumBytes =
Desc.getSize() ?
Desc.getSize() : 4;
238 if (!MFI->shouldSignReturnAddress(*MF))
241 auto Method = STI.getAuthenticatedLRCheckMethod(*MF);
249 switch (
Desc.getOpcode()) {
252 return Desc.getSize();
259 case TargetOpcode::STACKMAP:
262 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
264 case TargetOpcode::PATCHPOINT:
267 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
269 case TargetOpcode::STATEPOINT:
271 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
276 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
281 F.getFnAttributeAsParsedInteger(
"patchable-function-entry", 9) * 4;
283 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
284 case TargetOpcode::PATCHABLE_TAIL_CALL:
285 case TargetOpcode::PATCHABLE_TYPED_EVENT_CALL:
289 case TargetOpcode::PATCHABLE_EVENT_CALL:
295 NumBytes =
MI.getOperand(1).getImm();
297 case AArch64::MOVaddr:
298 case AArch64::MOVaddrJT:
299 case AArch64::MOVaddrCP:
300 case AArch64::MOVaddrBA:
301 case AArch64::MOVaddrTLS:
302 case AArch64::MOVaddrEXT: {
306 MI.getOperand(1).getTargetFlags(),
307 Subtarget.isTargetMachO(), Insn);
308 NumBytes = Insn.
size() * 4;
312 case AArch64::MOVi32imm:
313 case AArch64::MOVi64imm: {
315 unsigned BitSize =
Desc.getOpcode() == AArch64::MOVi32imm ? 32 : 64;
318 NumBytes = Insn.
size() * 4;
322 case TargetOpcode::BUNDLE:
323 NumBytes = getInstBundleSize(
MI);
359 case AArch64::CBWPri:
360 case AArch64::CBXPri:
361 case AArch64::CBWPrr:
362 case AArch64::CBXPrr:
370 case AArch64::CBBAssertExt:
371 case AArch64::CBHAssertExt:
402 case AArch64::CBWPri:
403 case AArch64::CBXPri:
404 case AArch64::CBBAssertExt:
405 case AArch64::CBHAssertExt:
406 case AArch64::CBWPrr:
407 case AArch64::CBXPrr:
413 int64_t BrOffset)
const {
415 assert(Bits >= 3 &&
"max branch displacement must be enough to jump"
416 "over conditional branch expansion");
417 return isIntN(Bits, BrOffset / 4);
422 switch (
MI.getOpcode()) {
426 return MI.getOperand(0).getMBB();
431 return MI.getOperand(2).getMBB();
437 return MI.getOperand(1).getMBB();
438 case AArch64::CBWPri:
439 case AArch64::CBXPri:
440 case AArch64::CBBAssertExt:
441 case AArch64::CBHAssertExt:
442 case AArch64::CBWPrr:
443 case AArch64::CBXPrr:
444 return MI.getOperand(3).getMBB();
454 assert(RS &&
"RegScavenger required for long branching");
456 "new block should be inserted for expanding unconditional branch");
459 "restore block should be inserted for restoring clobbered registers");
466 "Branch offsets outside of the signed 33-bit range not supported");
477 RS->enterBasicBlockEnd(
MBB);
480 constexpr Register Reg = AArch64::X16;
481 if (!RS->isRegUsed(Reg)) {
482 insertUnconditionalBranch(
MBB, &NewDestBB,
DL);
493 Register Scavenged = RS->FindUnusedReg(&AArch64::GPR64RegClass);
494 if (Scavenged != AArch64::NoRegister) {
495 buildIndirectBranch(Scavenged, NewDestBB);
496 RS->setRegUsed(Scavenged);
505 "Unable to insert indirect branch inside function that has red zone");
528 bool AllowModify)
const {
535 if (
I->getOpcode() == AArch64::SpeculationBarrierISBDSBEndBB ||
536 I->getOpcode() == AArch64::SpeculationBarrierSBEndBB) {
540 if (!isUnpredicatedTerminator(*
I))
547 unsigned LastOpc = LastInst->
getOpcode();
548 if (
I ==
MBB.begin() || !isUnpredicatedTerminator(*--
I)) {
563 unsigned SecondLastOpc = SecondLastInst->
getOpcode();
570 LastInst = SecondLastInst;
572 if (
I ==
MBB.begin() || !isUnpredicatedTerminator(*--
I)) {
577 SecondLastInst = &*
I;
578 SecondLastOpc = SecondLastInst->
getOpcode();
589 LastInst = SecondLastInst;
591 if (
I ==
MBB.begin() || !isUnpredicatedTerminator(*--
I)) {
593 "unreachable unconditional branches removed above");
602 SecondLastInst = &*
I;
603 SecondLastOpc = SecondLastInst->
getOpcode();
607 if (SecondLastInst &&
I !=
MBB.begin() && isUnpredicatedTerminator(*--
I))
623 I->eraseFromParent();
632 I->eraseFromParent();
641 MachineBranchPredicate &MBP,
642 bool AllowModify)
const {
654 assert(MBP.TrueDest &&
"expected!");
655 MBP.FalseDest = FBB ? FBB :
MBB.getNextNode();
657 MBP.ConditionDef =
nullptr;
658 MBP.SingleUseCondition =
false;
668 if (
I ==
MBB.begin())
684 if (
MI.modifiesRegister(AArch64::NZCV,
nullptr)) {
685 MBP.ConditionDef = &
MI;
694 case AArch64::CBNZX: {
698 MBP.Predicate = (
Opc == AArch64::CBNZX ||
Opc == AArch64::CBNZW)
699 ? MachineBranchPredicate::PRED_NE
700 : MachineBranchPredicate::PRED_EQ;
701 Register CondReg = MBP.LHS.getReg();
710 case AArch64::TBNZX: {
731 Cond[1].setImm(AArch64::CBNZW);
734 Cond[1].setImm(AArch64::CBZW);
737 Cond[1].setImm(AArch64::CBNZX);
740 Cond[1].setImm(AArch64::CBZX);
743 Cond[1].setImm(AArch64::TBNZW);
746 Cond[1].setImm(AArch64::TBZW);
749 Cond[1].setImm(AArch64::TBNZX);
752 Cond[1].setImm(AArch64::TBZX);
756 case AArch64::CBWPri:
757 case AArch64::CBXPri:
758 case AArch64::CBBAssertExt:
759 case AArch64::CBHAssertExt:
760 case AArch64::CBWPrr:
761 case AArch64::CBXPrr: {
774 int *BytesRemoved)
const {
784 I->eraseFromParent();
788 if (
I ==
MBB.begin()) {
801 I->eraseFromParent();
808void AArch64InstrInfo::instantiateCondBranch(
833 if (
Cond.size() > 5) {
844 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
871 unsigned Opc =
MI.getOpcode();
878 if (
MI.getOperand(0).getReg() == AArch64::WZR ||
879 MI.getOperand(0).getReg() == AArch64::XZR) {
881 dbgs() <<
"Removing always taken branch: " <<
MI);
884 for (
auto *S : Succs)
886 MBB->removeSuccessor(S);
888 while (
MBB->rbegin() != &
MI)
889 MBB->rbegin()->eraseFromParent();
890 MI.eraseFromParent();
900 if (
MI.getOperand(0).getReg() == AArch64::WZR ||
901 MI.getOperand(0).getReg() == AArch64::XZR) {
903 dbgs() <<
"Removing never taken branch: " <<
MI);
905 MI.getParent()->removeSuccessor(
Target);
906 MI.eraseFromParent();
921 VReg =
DefMI->getOperand(1).getReg();
930 unsigned *NewReg =
nullptr) {
935 bool Is64Bit = AArch64::GPR64allRegClass.hasSubClassEq(MRI.
getRegClass(VReg));
941 switch (
DefMI->getOpcode()) {
942 case AArch64::SUBREG_TO_REG:
946 if (!
DefMI->getOperand(1).isReg())
948 if (!
DefMI->getOperand(2).isImm() ||
949 DefMI->getOperand(2).getImm() != AArch64::sub_32)
952 if (
DefMI->getOpcode() != AArch64::MOVi32imm)
954 if (!
DefMI->getOperand(1).isImm() ||
DefMI->getOperand(1).getImm() != 1)
957 SrcReg = AArch64::XZR;
958 Opc = AArch64::CSINCXr;
961 case AArch64::MOVi32imm:
962 case AArch64::MOVi64imm:
963 if (!
DefMI->getOperand(1).isImm() ||
DefMI->getOperand(1).getImm() != 1)
965 SrcReg = Is64Bit ? AArch64::XZR : AArch64::WZR;
966 Opc = Is64Bit ? AArch64::CSINCXr : AArch64::CSINCWr;
969 case AArch64::ADDSXri:
970 case AArch64::ADDSWri:
972 if (
DefMI->findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
977 case AArch64::ADDXri:
978 case AArch64::ADDWri:
980 if (!
DefMI->getOperand(2).isImm() ||
DefMI->getOperand(2).getImm() != 1 ||
981 DefMI->getOperand(3).getImm() != 0)
983 SrcReg =
DefMI->getOperand(1).getReg();
984 Opc = Is64Bit ? AArch64::CSINCXr : AArch64::CSINCWr;
987 case AArch64::ORNXrr:
988 case AArch64::ORNWrr: {
991 if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
993 SrcReg =
DefMI->getOperand(2).getReg();
994 Opc = Is64Bit ? AArch64::CSINVXr : AArch64::CSINVWr;
998 case AArch64::SUBSXrr:
999 case AArch64::SUBSWrr:
1001 if (
DefMI->findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
1006 case AArch64::SUBXrr:
1007 case AArch64::SUBWrr: {
1010 if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
1012 SrcReg =
DefMI->getOperand(2).getReg();
1013 Opc = Is64Bit ? AArch64::CSNEGXr : AArch64::CSNEGWr;
1019 assert(
Opc && SrcReg &&
"Missing parameters");
1029 Register FalseReg,
int &CondCycles,
1031 int &FalseCycles)
const {
1042 if (!RI.getCommonSubClass(RC, MRI.
getRegClass(DstReg)))
1046 unsigned ExtraCondLat =
Cond.size() != 1;
1050 if (AArch64::GPR64allRegClass.hasSubClassEq(RC) ||
1051 AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
1053 CondCycles = 1 + ExtraCondLat;
1054 TrueCycles = FalseCycles = 1;
1064 if (AArch64::FPR64RegClass.hasSubClassEq(RC) ||
1065 AArch64::FPR32RegClass.hasSubClassEq(RC)) {
1066 CondCycles = 5 + ExtraCondLat;
1067 TrueCycles = FalseCycles = 2;
1084 switch (
Cond.size()) {
1104 case AArch64::CBNZW:
1108 case AArch64::CBNZX:
1139 case AArch64::TBNZW:
1140 case AArch64::TBNZX:
1162 unsigned SubsOpc, SubsDestReg;
1168 case AArch64::CBWPri:
1169 SubsOpc = AArch64::SUBSWri;
1170 SubsDestReg = AArch64::WZR;
1173 case AArch64::CBXPri:
1174 SubsOpc = AArch64::SUBSXri;
1175 SubsDestReg = AArch64::XZR;
1178 case AArch64::CBWPrr:
1179 SubsOpc = AArch64::SUBSWrr;
1180 SubsDestReg = AArch64::WZR;
1183 case AArch64::CBXPrr:
1184 SubsOpc = AArch64::SUBSXrr;
1185 SubsDestReg = AArch64::XZR;
1214 switch (ExtendType) {
1220 "Unexpected compare-and-branch instruction for SXTB shift-extend");
1221 ExtOpc = AArch64::SBFMWri;
1227 "Unexpected compare-and-branch instruction for SXTH shift-extend");
1228 ExtOpc = AArch64::SBFMWri;
1234 "Unexpected compare-and-branch instruction for UXTB shift-extend");
1235 ExtOpc = AArch64::ANDWri;
1241 "Unexpected compare-and-branch instruction for UXTH shift-extend");
1242 ExtOpc = AArch64::ANDWri;
1251 if (ExtOpc != AArch64::ANDWri)
1253 MBBI.addImm(ExtBits);
1281 bool TryFold =
false;
1283 RC = &AArch64::GPR64RegClass;
1284 Opc = AArch64::CSELXr;
1287 RC = &AArch64::GPR32RegClass;
1288 Opc = AArch64::CSELWr;
1291 RC = &AArch64::FPR64RegClass;
1292 Opc = AArch64::FCSELDrrr;
1294 RC = &AArch64::FPR32RegClass;
1295 Opc = AArch64::FCSELSrrr;
1297 assert(RC &&
"Unsupported regclass");
1301 unsigned NewReg = 0;
1324 (FalseReg.
isVirtual() || FalseReg == AArch64::WZR ||
1325 FalseReg == AArch64::XZR) &&
1326 "FalseReg was folded into a non-virtual register other than WZR or XZR");
1343 assert(BitSize == 64 &&
"Only bit sizes of 32 or 64 allowed");
1348 return Is.
size() <= 2;
1353 assert(
MI.isCopy() &&
"Expected COPY instruction");
1359 if (
Reg.isVirtual())
1361 if (
Reg.isPhysical())
1362 return RI.getMinimalPhysRegClass(
Reg);
1367 if (DstRC && SrcRC && !RI.getCommonSubClass(DstRC, SrcRC))
1370 return MI.isAsCheapAsAMove();
1376 if (Subtarget.hasExynosCheapAsMoveHandling()) {
1377 if (isExynosCheapAsMove(
MI))
1379 return MI.isAsCheapAsAMove();
1382 switch (
MI.getOpcode()) {
1384 return MI.isAsCheapAsAMove();
1386 case TargetOpcode::COPY:
1389 case AArch64::ADDWrs:
1390 case AArch64::ADDXrs:
1391 case AArch64::SUBWrs:
1392 case AArch64::SUBXrs:
1393 return Subtarget.hasALULSLFast() &&
MI.getOperand(3).getImm() <= 4;
1398 case AArch64::MOVi32imm:
1400 case AArch64::MOVi64imm:
1405bool AArch64InstrInfo::isFalkorShiftExtFast(
const MachineInstr &
MI) {
1406 switch (
MI.getOpcode()) {
1410 case AArch64::ADDWrs:
1411 case AArch64::ADDXrs:
1412 case AArch64::ADDSWrs:
1413 case AArch64::ADDSXrs: {
1414 unsigned Imm =
MI.getOperand(3).getImm();
1421 case AArch64::ADDWrx:
1422 case AArch64::ADDXrx:
1423 case AArch64::ADDXrx64:
1424 case AArch64::ADDSWrx:
1425 case AArch64::ADDSXrx:
1426 case AArch64::ADDSXrx64: {
1427 unsigned Imm =
MI.getOperand(3).getImm();
1439 case AArch64::SUBWrs:
1440 case AArch64::SUBSWrs: {
1441 unsigned Imm =
MI.getOperand(3).getImm();
1443 return ShiftVal == 0 ||
1447 case AArch64::SUBXrs:
1448 case AArch64::SUBSXrs: {
1449 unsigned Imm =
MI.getOperand(3).getImm();
1451 return ShiftVal == 0 ||
1455 case AArch64::SUBWrx:
1456 case AArch64::SUBXrx:
1457 case AArch64::SUBXrx64:
1458 case AArch64::SUBSWrx:
1459 case AArch64::SUBSXrx:
1460 case AArch64::SUBSXrx64: {
1461 unsigned Imm =
MI.getOperand(3).getImm();
1473 case AArch64::LDRBBroW:
1474 case AArch64::LDRBBroX:
1475 case AArch64::LDRBroW:
1476 case AArch64::LDRBroX:
1477 case AArch64::LDRDroW:
1478 case AArch64::LDRDroX:
1479 case AArch64::LDRHHroW:
1480 case AArch64::LDRHHroX:
1481 case AArch64::LDRHroW:
1482 case AArch64::LDRHroX:
1483 case AArch64::LDRQroW:
1484 case AArch64::LDRQroX:
1485 case AArch64::LDRSBWroW:
1486 case AArch64::LDRSBWroX:
1487 case AArch64::LDRSBXroW:
1488 case AArch64::LDRSBXroX:
1489 case AArch64::LDRSHWroW:
1490 case AArch64::LDRSHWroX:
1491 case AArch64::LDRSHXroW:
1492 case AArch64::LDRSHXroX:
1493 case AArch64::LDRSWroW:
1494 case AArch64::LDRSWroX:
1495 case AArch64::LDRSroW:
1496 case AArch64::LDRSroX:
1497 case AArch64::LDRWroW:
1498 case AArch64::LDRWroX:
1499 case AArch64::LDRXroW:
1500 case AArch64::LDRXroX:
1501 case AArch64::PRFMroW:
1502 case AArch64::PRFMroX:
1503 case AArch64::STRBBroW:
1504 case AArch64::STRBBroX:
1505 case AArch64::STRBroW:
1506 case AArch64::STRBroX:
1507 case AArch64::STRDroW:
1508 case AArch64::STRDroX:
1509 case AArch64::STRHHroW:
1510 case AArch64::STRHHroX:
1511 case AArch64::STRHroW:
1512 case AArch64::STRHroX:
1513 case AArch64::STRQroW:
1514 case AArch64::STRQroX:
1515 case AArch64::STRSroW:
1516 case AArch64::STRSroX:
1517 case AArch64::STRWroW:
1518 case AArch64::STRWroX:
1519 case AArch64::STRXroW:
1520 case AArch64::STRXroX: {
1521 unsigned IsSigned =
MI.getOperand(3).getImm();
1528 unsigned Opc =
MI.getOpcode();
1532 case AArch64::SEH_StackAlloc:
1533 case AArch64::SEH_SaveFPLR:
1534 case AArch64::SEH_SaveFPLR_X:
1535 case AArch64::SEH_SaveReg:
1536 case AArch64::SEH_SaveReg_X:
1537 case AArch64::SEH_SaveRegP:
1538 case AArch64::SEH_SaveRegP_X:
1539 case AArch64::SEH_SaveFReg:
1540 case AArch64::SEH_SaveFReg_X:
1541 case AArch64::SEH_SaveFRegP:
1542 case AArch64::SEH_SaveFRegP_X:
1543 case AArch64::SEH_SetFP:
1544 case AArch64::SEH_AddFP:
1545 case AArch64::SEH_Nop:
1546 case AArch64::SEH_PrologEnd:
1547 case AArch64::SEH_EpilogStart:
1548 case AArch64::SEH_EpilogEnd:
1549 case AArch64::SEH_PACSignLR:
1550 case AArch64::SEH_SaveAnyRegI:
1551 case AArch64::SEH_SaveAnyRegIP:
1552 case AArch64::SEH_SaveAnyRegQP:
1553 case AArch64::SEH_SaveAnyRegQPX:
1554 case AArch64::SEH_AllocZ:
1555 case AArch64::SEH_SaveZReg:
1556 case AArch64::SEH_SavePReg:
1563 unsigned &SubIdx)
const {
1564 switch (
MI.getOpcode()) {
1567 case AArch64::SBFMXri:
1568 case AArch64::UBFMXri:
1571 if (
MI.getOperand(2).getImm() != 0 ||
MI.getOperand(3).getImm() != 31)
1574 SrcReg =
MI.getOperand(1).getReg();
1575 DstReg =
MI.getOperand(0).getReg();
1576 SubIdx = AArch64::sub_32;
1585 int64_t OffsetA = 0, OffsetB = 0;
1586 TypeSize WidthA(0,
false), WidthB(0,
false);
1587 bool OffsetAIsScalable =
false, OffsetBIsScalable =
false;
1608 OffsetAIsScalable == OffsetBIsScalable) {
1609 int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
1610 int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
1611 TypeSize LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
1612 if (LowWidth.
isScalable() == OffsetAIsScalable &&
1630 switch (
MI.getOpcode()) {
1633 if (
MI.getOperand(0).getImm() == 0x14)
1640 case AArch64::MSRpstatesvcrImm1:
1647 auto Next = std::next(
MI.getIterator());
1648 return Next !=
MBB->end() &&
Next->isCFIInstruction();
1655 Register &SrcReg2, int64_t &CmpMask,
1656 int64_t &CmpValue)
const {
1660 assert(
MI.getNumOperands() >= 2 &&
"All AArch64 cmps should have 2 operands");
1661 if (!
MI.getOperand(1).isReg() ||
MI.getOperand(1).getSubReg())
1664 switch (
MI.getOpcode()) {
1667 case AArch64::PTEST_PP:
1668 case AArch64::PTEST_PP_ANY:
1669 case AArch64::PTEST_PP_FIRST:
1670 SrcReg =
MI.getOperand(0).getReg();
1671 SrcReg2 =
MI.getOperand(1).getReg();
1672 if (
MI.getOperand(2).getSubReg())
1679 case AArch64::SUBSWrr:
1680 case AArch64::SUBSWrs:
1681 case AArch64::SUBSWrx:
1682 case AArch64::SUBSXrr:
1683 case AArch64::SUBSXrs:
1684 case AArch64::SUBSXrx:
1685 case AArch64::ADDSWrr:
1686 case AArch64::ADDSWrs:
1687 case AArch64::ADDSWrx:
1688 case AArch64::ADDSXrr:
1689 case AArch64::ADDSXrs:
1690 case AArch64::ADDSXrx:
1692 SrcReg =
MI.getOperand(1).getReg();
1693 SrcReg2 =
MI.getOperand(2).getReg();
1696 if (
MI.getOperand(2).getSubReg())
1702 case AArch64::SUBSWri:
1703 case AArch64::ADDSWri:
1704 case AArch64::SUBSXri:
1705 case AArch64::ADDSXri:
1706 SrcReg =
MI.getOperand(1).getReg();
1709 CmpValue =
MI.getOperand(2).getImm();
1711 case AArch64::ANDSWri:
1712 case AArch64::ANDSXri:
1715 SrcReg =
MI.getOperand(1).getReg();
1719 MI.getOperand(2).getImm(),
1720 MI.getOpcode() == AArch64::ANDSWri ? 32 : 64);
1729 assert(
MBB &&
"Can't get MachineBasicBlock here");
1731 assert(MF &&
"Can't get MachineFunction here");
1736 for (
unsigned OpIdx = 0, EndIdx = Instr.getNumOperands(); OpIdx < EndIdx;
1740 Instr.getRegClassConstraint(OpIdx,
TII,
TRI);
1743 if (!OpRegCstraints)
1751 "Operand has register constraints without being a register!");
1754 if (
Reg.isPhysical()) {
1771 bool MIDefinesZeroReg =
false;
1772 if (
MI.definesRegister(AArch64::WZR,
nullptr) ||
1773 MI.definesRegister(AArch64::XZR,
nullptr))
1774 MIDefinesZeroReg =
true;
1776 switch (
MI.getOpcode()) {
1778 return MI.getOpcode();
1779 case AArch64::ADDSWrr:
1780 return AArch64::ADDWrr;
1781 case AArch64::ADDSWri:
1782 return MIDefinesZeroReg ? AArch64::ADDSWri : AArch64::ADDWri;
1783 case AArch64::ADDSWrs:
1784 return MIDefinesZeroReg ? AArch64::ADDSWrs : AArch64::ADDWrs;
1785 case AArch64::ADDSWrx:
1786 return AArch64::ADDWrx;
1787 case AArch64::ADDSXrr:
1788 return AArch64::ADDXrr;
1789 case AArch64::ADDSXri:
1790 return MIDefinesZeroReg ? AArch64::ADDSXri : AArch64::ADDXri;
1791 case AArch64::ADDSXrs:
1792 return MIDefinesZeroReg ? AArch64::ADDSXrs : AArch64::ADDXrs;
1793 case AArch64::ADDSXrx:
1794 return AArch64::ADDXrx;
1795 case AArch64::SUBSWrr:
1796 return AArch64::SUBWrr;
1797 case AArch64::SUBSWri:
1798 return MIDefinesZeroReg ? AArch64::SUBSWri : AArch64::SUBWri;
1799 case AArch64::SUBSWrs:
1800 return MIDefinesZeroReg ? AArch64::SUBSWrs : AArch64::SUBWrs;
1801 case AArch64::SUBSWrx:
1802 return AArch64::SUBWrx;
1803 case AArch64::SUBSXrr:
1804 return AArch64::SUBXrr;
1805 case AArch64::SUBSXri:
1806 return MIDefinesZeroReg ? AArch64::SUBSXri : AArch64::SUBXri;
1807 case AArch64::SUBSXrs:
1808 return MIDefinesZeroReg ? AArch64::SUBSXrs : AArch64::SUBXrs;
1809 case AArch64::SUBSXrx:
1810 return AArch64::SUBXrx;
1825 if (To == To->getParent()->begin())
1830 if (To->getParent() != From->getParent())
1842 Instr.modifiesRegister(AArch64::NZCV,
TRI)) ||
1843 ((AccessToCheck &
AK_Read) && Instr.readsRegister(AArch64::NZCV,
TRI)))
1849std::optional<unsigned>
1853 unsigned MaskOpcode =
Mask->getOpcode();
1854 unsigned PredOpcode = Pred->
getOpcode();
1855 bool PredIsPTestLike = isPTestLikeOpcode(PredOpcode);
1856 bool PredIsWhileLike = isWhileOpcode(PredOpcode);
1858 if (PredIsWhileLike) {
1862 if ((Mask == Pred) && PTest->
getOpcode() == AArch64::PTEST_PP_ANY)
1869 getElementSizeForOpcode(MaskOpcode) ==
1870 getElementSizeForOpcode(PredOpcode))
1876 if (PTest->
getOpcode() == AArch64::PTEST_PP_FIRST &&
1883 if (PredIsPTestLike) {
1888 if ((Mask == Pred) && PTest->
getOpcode() == AArch64::PTEST_PP_ANY)
1896 if (Mask != PTestLikeMask && PTestLikeMask->isFullCopy() &&
1897 PTestLikeMask->getOperand(1).getReg().isVirtual())
1905 getElementSizeForOpcode(MaskOpcode) ==
1906 getElementSizeForOpcode(PredOpcode)) {
1907 if (Mask == PTestLikeMask || PTest->
getOpcode() == AArch64::PTEST_PP_ANY)
1933 uint64_t PredElementSize = getElementSizeForOpcode(PredOpcode);
1935 PTest->
getOpcode() == AArch64::PTEST_PP_ANY))
1943 switch (PredOpcode) {
1944 case AArch64::AND_PPzPP:
1945 case AArch64::BIC_PPzPP:
1946 case AArch64::EOR_PPzPP:
1947 case AArch64::NAND_PPzPP:
1948 case AArch64::NOR_PPzPP:
1949 case AArch64::ORN_PPzPP:
1950 case AArch64::ORR_PPzPP:
1951 case AArch64::BRKA_PPzP:
1952 case AArch64::BRKPA_PPzPP:
1953 case AArch64::BRKB_PPzP:
1954 case AArch64::BRKPB_PPzPP:
1955 case AArch64::RDFFR_PPz: {
1959 if (Mask != PredMask)
1963 case AArch64::BRKN_PPzP: {
1967 if ((MaskOpcode != AArch64::PTRUE_B) ||
1968 (
Mask->getOperand(1).getImm() != 31))
1972 case AArch64::PTRUE_B:
1985bool AArch64InstrInfo::optimizePTestInstr(
1986 MachineInstr *PTest,
unsigned MaskReg,
unsigned PredReg,
1991 if (Pred->
isCopy() && PTest->
getOpcode() == AArch64::PTEST_PP_FIRST) {
1995 if (
Op.isReg() &&
Op.getReg().isVirtual() &&
1996 Op.getSubReg() == AArch64::psub0)
2000 unsigned PredOpcode = Pred->
getOpcode();
2001 auto NewOp = canRemovePTestInstr(PTest, Mask, Pred, MRI);
2017 if (*NewOp != PredOpcode) {
2028 for (; i !=
e; ++i) {
2059 if (DeadNZCVIdx != -1) {
2078 if (CmpInstr.
getOpcode() == AArch64::PTEST_PP ||
2079 CmpInstr.
getOpcode() == AArch64::PTEST_PP_ANY ||
2080 CmpInstr.
getOpcode() == AArch64::PTEST_PP_FIRST)
2081 return optimizePTestInstr(&CmpInstr, SrcReg, SrcReg2, MRI);
2090 if (CmpValue == 0 && substituteCmpToZero(CmpInstr, SrcReg, *MRI))
2092 return (CmpValue == 0 || CmpValue == 1) &&
2093 removeCmpToZeroOrOne(CmpInstr, SrcReg, CmpValue, *MRI);
2101 switch (Instr.getOpcode()) {
2103 return AArch64::INSTRUCTION_LIST_END;
2105 case AArch64::ADDSWrr:
2106 case AArch64::ADDSWri:
2107 case AArch64::ADDSXrr:
2108 case AArch64::ADDSXri:
2109 case AArch64::ADDSWrx:
2110 case AArch64::ADDSXrx:
2111 case AArch64::ADDSWrs:
2112 case AArch64::ADDSXrs:
2113 case AArch64::SUBSWrr:
2114 case AArch64::SUBSWri:
2115 case AArch64::SUBSWrx:
2116 case AArch64::SUBSWrs:
2117 case AArch64::SUBSXrr:
2118 case AArch64::SUBSXri:
2119 case AArch64::SUBSXrx:
2120 case AArch64::SUBSXrs:
2121 case AArch64::ANDSWri:
2122 case AArch64::ANDSWrr:
2123 case AArch64::ANDSWrs:
2124 case AArch64::ANDSXri:
2125 case AArch64::ANDSXrr:
2126 case AArch64::ANDSXrs:
2127 case AArch64::BICSWrr:
2128 case AArch64::BICSXrr:
2129 case AArch64::BICSWrs:
2130 case AArch64::BICSXrs:
2131 case AArch64::ADCSWr:
2132 case AArch64::ADCSXr:
2133 case AArch64::SBCSWr:
2134 case AArch64::SBCSXr:
2135 return Instr.getOpcode();
2137 case AArch64::ADDWrr:
2138 return AArch64::ADDSWrr;
2139 case AArch64::ADDWri:
2140 return AArch64::ADDSWri;
2141 case AArch64::ADDXrr:
2142 return AArch64::ADDSXrr;
2143 case AArch64::ADDXri:
2144 return AArch64::ADDSXri;
2145 case AArch64::ADDWrx:
2146 return AArch64::ADDSWrx;
2147 case AArch64::ADDXrx:
2148 return AArch64::ADDSXrx;
2149 case AArch64::ADDWrs:
2150 return AArch64::ADDSWrs;
2151 case AArch64::ADDXrs:
2152 return AArch64::ADDSXrs;
2153 case AArch64::ADCWr:
2154 return AArch64::ADCSWr;
2155 case AArch64::ADCXr:
2156 return AArch64::ADCSXr;
2157 case AArch64::SUBWrr:
2158 return AArch64::SUBSWrr;
2159 case AArch64::SUBWri:
2160 return AArch64::SUBSWri;
2161 case AArch64::SUBXrr:
2162 return AArch64::SUBSXrr;
2163 case AArch64::SUBXri:
2164 return AArch64::SUBSXri;
2165 case AArch64::SUBWrx:
2166 return AArch64::SUBSWrx;
2167 case AArch64::SUBXrx:
2168 return AArch64::SUBSXrx;
2169 case AArch64::SUBWrs:
2170 return AArch64::SUBSWrs;
2171 case AArch64::SUBXrs:
2172 return AArch64::SUBSXrs;
2173 case AArch64::SBCWr:
2174 return AArch64::SBCSWr;
2175 case AArch64::SBCXr:
2176 return AArch64::SBCSXr;
2177 case AArch64::ANDWri:
2178 return AArch64::ANDSWri;
2179 case AArch64::ANDXri:
2180 return AArch64::ANDSXri;
2181 case AArch64::ANDWrr:
2182 return AArch64::ANDSWrr;
2183 case AArch64::ANDWrs:
2184 return AArch64::ANDSWrs;
2185 case AArch64::ANDXrr:
2186 return AArch64::ANDSXrr;
2187 case AArch64::ANDXrs:
2188 return AArch64::ANDSXrs;
2189 case AArch64::BICWrr:
2190 return AArch64::BICSWrr;
2191 case AArch64::BICXrr:
2192 return AArch64::BICSXrr;
2193 case AArch64::BICWrs:
2194 return AArch64::BICSWrs;
2195 case AArch64::BICXrs:
2196 return AArch64::BICSXrs;
2202 for (
auto *BB :
MBB->successors())
2203 if (BB->isLiveIn(AArch64::NZCV))
2210int AArch64InstrInfo::findCondCodeUseOperandIdxForBranchOrSelect(
2212 switch (
Instr.getOpcode()) {
2216 case AArch64::Bcc: {
2217 int Idx =
Instr.findRegisterUseOperandIdx(AArch64::NZCV,
nullptr);
2222 case AArch64::CSINVWr:
2223 case AArch64::CSINVXr:
2224 case AArch64::CSINCWr:
2225 case AArch64::CSINCXr:
2226 case AArch64::CSELWr:
2227 case AArch64::CSELXr:
2228 case AArch64::CSNEGWr:
2229 case AArch64::CSNEGXr:
2230 case AArch64::FCSELSrrr:
2231 case AArch64::FCSELDrrr: {
2232 int Idx =
Instr.findRegisterUseOperandIdx(AArch64::NZCV,
nullptr);
2244 AArch64InstrInfo::findCondCodeUseOperandIdxForBranchOrSelect(Instr);
2246 Instr.getOperand(CCIdx).
getImm())
2299std::optional<UsedNZCV>
2304 if (
MI.getParent() != CmpParent)
2305 return std::nullopt;
2308 return std::nullopt;
2313 if (Instr.readsRegister(AArch64::NZCV, &
TRI)) {
2316 return std::nullopt;
2321 if (Instr.modifiesRegister(AArch64::NZCV, &
TRI))
2324 return NZCVUsedAfterCmp;
2328 return Opcode == AArch64::ADDSWri || Opcode == AArch64::ADDSXri;
2332 return Opcode == AArch64::SUBSWri || Opcode == AArch64::SUBSXri;
2338 case AArch64::ANDSWri:
2339 case AArch64::ANDSWrr:
2340 case AArch64::ANDSWrs:
2341 case AArch64::ANDSXri:
2342 case AArch64::ANDSXrr:
2343 case AArch64::ANDSXrs:
2344 case AArch64::BICSWrr:
2345 case AArch64::BICSXrr:
2346 case AArch64::BICSWrs:
2347 case AArch64::BICSXrs:
2373 const unsigned CmpOpcode = CmpInstr.
getOpcode();
2379 "Caller guarantees that CmpInstr compares with constant 0");
2382 if (!NZVCUsed || NZVCUsed->C)
2403bool AArch64InstrInfo::substituteCmpToZero(
2414 if (NewOpc == AArch64::INSTRUCTION_LIST_END)
2421 MI->setDesc(
get(NewOpc));
2426 MI->addRegisterDefined(AArch64::NZCV, &
TRI);
2438 assert((CmpValue == 0 || CmpValue == 1) &&
2439 "Only comparisons to 0 or 1 considered for removal!");
2442 unsigned MIOpc =
MI.getOpcode();
2443 if (MIOpc == AArch64::CSINCWr) {
2444 if (
MI.getOperand(1).getReg() != AArch64::WZR ||
2445 MI.getOperand(2).getReg() != AArch64::WZR)
2447 }
else if (MIOpc == AArch64::CSINCXr) {
2448 if (
MI.getOperand(1).getReg() != AArch64::XZR ||
2449 MI.getOperand(2).getReg() != AArch64::XZR)
2459 if (
MI.findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
true) != -1)
2463 const unsigned CmpOpcode = CmpInstr.
getOpcode();
2465 if (CmpValue && !IsSubsRegImm)
2467 if (!CmpValue && !IsSubsRegImm && !
isADDSRegImm(CmpOpcode))
2472 if (MIUsedNZCV.
C || MIUsedNZCV.
V)
2475 std::optional<UsedNZCV> NZCVUsedAfterCmp =
2479 if (!NZCVUsedAfterCmp || NZCVUsedAfterCmp->C || NZCVUsedAfterCmp->V)
2482 if ((MIUsedNZCV.
Z && NZCVUsedAfterCmp->N) ||
2483 (MIUsedNZCV.
N && NZCVUsedAfterCmp->Z))
2486 if (MIUsedNZCV.
N && !CmpValue)
2528bool AArch64InstrInfo::removeCmpToZeroOrOne(
2535 SmallVector<MachineInstr *, 4> CCUseInstrs;
2536 bool IsInvertCC =
false;
2544 for (MachineInstr *CCUseInstr : CCUseInstrs) {
2545 int Idx = findCondCodeUseOperandIdxForBranchOrSelect(*CCUseInstr);
2546 assert(Idx >= 0 &&
"Unexpected instruction using CC.");
2547 MachineOperand &CCOperand = CCUseInstr->getOperand(Idx);
2556bool AArch64InstrInfo::expandPostRAPseudo(
MachineInstr &
MI)
const {
2557 if (
MI.getOpcode() != TargetOpcode::LOAD_STACK_GUARD &&
2558 MI.getOpcode() != AArch64::CATCHRET &&
2559 MI.getOpcode() != AArch64::STACK_GUARD_UNMIX)
2564 auto TRI = Subtarget.getRegisterInfo();
2567 if (
MI.getOpcode() == AArch64::STACK_GUARD_UNMIX) {
2581 if (
MI.getOpcode() == AArch64::CATCHRET) {
2583 const TargetInstrInfo *
TII =
2585 MachineBasicBlock *TargetMBB =
MI.getOperand(0).getMBB();
2590 FirstEpilogSEH = std::prev(FirstEpilogSEH);
2592 FirstEpilogSEH = std::next(FirstEpilogSEH);
2607 if (
M.getStackProtectorGuard() ==
"sysreg") {
2608 const AArch64SysReg::SysReg *SrcReg =
2609 AArch64SysReg::lookupSysRegByName(
M.getStackProtectorGuardReg());
2617 int Offset =
M.getStackProtectorGuardOffset();
2668 const GlobalValue *GV =
2671 unsigned OpFlags = Subtarget.ClassifyGlobalReference(GV, TM);
2674 unsigned GuardWidth =
M.getStackProtectorGuardValueWidth().value_or(
2675 Subtarget.isTargetILP32() ? 4 : 8);
2676 if (GuardWidth != 4 && GuardWidth != 8)
2681 if (GuardWidth == 4) {
2682 unsigned Reg32 =
TRI->getSubReg(
Reg, AArch64::sub_32);
2711 if (GuardWidth == 4) {
2712 unsigned Reg32 =
TRI->getSubReg(
Reg, AArch64::sub_32);
2729 if (GuardWidth == 4) {
2730 unsigned Reg32 =
TRI->getSubReg(
Reg, AArch64::sub_32);
2748 if (Subtarget.getTargetTriple().isOSMSVCRT())
2761 switch (
MI.getOpcode()) {
2764 case AArch64::MOVZWi:
2765 case AArch64::MOVZXi:
2766 if (
MI.getOperand(1).isImm() &&
MI.getOperand(1).getImm() == 0) {
2767 assert(
MI.getDesc().getNumOperands() == 3 &&
2768 MI.getOperand(2).getImm() == 0 &&
"invalid MOVZi operands");
2772 case AArch64::ANDWri:
2773 return MI.getOperand(1).getReg() == AArch64::WZR;
2774 case AArch64::ANDXri:
2775 return MI.getOperand(1).getReg() == AArch64::XZR;
2776 case TargetOpcode::COPY:
2777 return MI.getOperand(1).getReg() == AArch64::WZR;
2785 switch (
MI.getOpcode()) {
2788 case TargetOpcode::COPY: {
2791 return (AArch64::GPR32RegClass.
contains(DstReg) ||
2792 AArch64::GPR64RegClass.
contains(DstReg));
2794 case AArch64::ORRXrs:
2795 if (
MI.getOperand(1).getReg() == AArch64::XZR) {
2796 assert(
MI.getDesc().getNumOperands() == 4 &&
2797 MI.getOperand(3).getImm() == 0 &&
"invalid ORRrs operands");
2801 case AArch64::ADDXri:
2802 if (
MI.getOperand(2).getImm() == 0) {
2803 assert(
MI.getDesc().getNumOperands() == 4 &&
2804 MI.getOperand(3).getImm() == 0 &&
"invalid ADDXri operands");
2815 switch (
MI.getOpcode()) {
2818 case TargetOpcode::COPY: {
2820 return AArch64::FPR128RegClass.contains(DstReg);
2822 case AArch64::ORRv16i8:
2823 if (
MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg()) {
2824 assert(
MI.getDesc().getNumOperands() == 3 &&
MI.getOperand(0).isReg() &&
2825 "invalid ORRv16i8 operands");
2837 case AArch64::LDRWui:
2838 case AArch64::LDRXui:
2839 case AArch64::LDRBui:
2840 case AArch64::LDRHui:
2841 case AArch64::LDRSui:
2842 case AArch64::LDRDui:
2843 case AArch64::LDRQui:
2844 case AArch64::LDR_PXI:
2850 int &FrameIndex)
const {
2854 if (
MI.getOperand(0).getSubReg() == 0 &&
MI.getOperand(1).isFI() &&
2855 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) {
2856 FrameIndex =
MI.getOperand(1).getIndex();
2857 return MI.getOperand(0).getReg();
2866 case AArch64::STRWui:
2867 case AArch64::STRXui:
2868 case AArch64::STRBui:
2869 case AArch64::STRHui:
2870 case AArch64::STRSui:
2871 case AArch64::STRDui:
2872 case AArch64::STRQui:
2873 case AArch64::STR_PXI:
2879 int &FrameIndex)
const {
2883 if (
MI.getOperand(0).getSubReg() == 0 &&
MI.getOperand(1).isFI() &&
2884 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) {
2885 FrameIndex =
MI.getOperand(1).getIndex();
2886 return MI.getOperand(0).getReg();
2892 int &FrameIndex)
const {
2907 return MI.getOperand(0).getReg();
2913 int &FrameIndex)
const {
2928 return MI.getOperand(0).getReg();
2936 return MMO->getFlags() & MOSuppressPair;
2942 if (
MI.memoperands_empty())
2950 return MMO->getFlags() & MOStridedAccess;
2958 case AArch64::STURSi:
2959 case AArch64::STRSpre:
2960 case AArch64::STURDi:
2961 case AArch64::STRDpre:
2962 case AArch64::STURQi:
2963 case AArch64::STRQpre:
2964 case AArch64::STURBBi:
2965 case AArch64::STURHHi:
2966 case AArch64::STURWi:
2967 case AArch64::STRWpre:
2968 case AArch64::STURXi:
2969 case AArch64::STRXpre:
2970 case AArch64::LDURSi:
2971 case AArch64::LDRSpre:
2972 case AArch64::LDURDi:
2973 case AArch64::LDRDpre:
2974 case AArch64::LDURQi:
2975 case AArch64::LDRQpre:
2976 case AArch64::LDURWi:
2977 case AArch64::LDRWpre:
2978 case AArch64::LDURXi:
2979 case AArch64::LDRXpre:
2980 case AArch64::LDRSWpre:
2981 case AArch64::LDURSWi:
2982 case AArch64::LDURHHi:
2983 case AArch64::LDURBBi:
2984 case AArch64::LDURSBWi:
2985 case AArch64::LDURSHWi:
2993 case AArch64::PRFMui:
return AArch64::PRFUMi;
2994 case AArch64::LDRXui:
return AArch64::LDURXi;
2995 case AArch64::LDRWui:
return AArch64::LDURWi;
2996 case AArch64::LDRBui:
return AArch64::LDURBi;
2997 case AArch64::LDRHui:
return AArch64::LDURHi;
2998 case AArch64::LDRSui:
return AArch64::LDURSi;
2999 case AArch64::LDRDui:
return AArch64::LDURDi;
3000 case AArch64::LDRQui:
return AArch64::LDURQi;
3001 case AArch64::LDRBBui:
return AArch64::LDURBBi;
3002 case AArch64::LDRHHui:
return AArch64::LDURHHi;
3003 case AArch64::LDRSBXui:
return AArch64::LDURSBXi;
3004 case AArch64::LDRSBWui:
return AArch64::LDURSBWi;
3005 case AArch64::LDRSHXui:
return AArch64::LDURSHXi;
3006 case AArch64::LDRSHWui:
return AArch64::LDURSHWi;
3007 case AArch64::LDRSWui:
return AArch64::LDURSWi;
3008 case AArch64::STRXui:
return AArch64::STURXi;
3009 case AArch64::STRWui:
return AArch64::STURWi;
3010 case AArch64::STRBui:
return AArch64::STURBi;
3011 case AArch64::STRHui:
return AArch64::STURHi;
3012 case AArch64::STRSui:
return AArch64::STURSi;
3013 case AArch64::STRDui:
return AArch64::STURDi;
3014 case AArch64::STRQui:
return AArch64::STURQi;
3015 case AArch64::STRBBui:
return AArch64::STURBBi;
3016 case AArch64::STRHHui:
return AArch64::STURHHi;
3025 case AArch64::LDAPURBi:
3026 case AArch64::LDAPURHi:
3027 case AArch64::LDAPURi:
3028 case AArch64::LDAPURSBWi:
3029 case AArch64::LDAPURSBXi:
3030 case AArch64::LDAPURSHWi:
3031 case AArch64::LDAPURSHXi:
3032 case AArch64::LDAPURSWi:
3033 case AArch64::LDAPURXi:
3034 case AArch64::LDR_PPXI:
3035 case AArch64::LDR_PXI:
3036 case AArch64::LDR_ZXI:
3037 case AArch64::LDR_ZZXI:
3038 case AArch64::LDR_ZZXI_STRIDED_CONTIGUOUS:
3039 case AArch64::LDR_ZZZXI:
3040 case AArch64::LDR_ZZZZXI:
3041 case AArch64::LDR_ZZZZXI_STRIDED_CONTIGUOUS:
3042 case AArch64::LDRBBui:
3043 case AArch64::LDRBui:
3044 case AArch64::LDRDui:
3045 case AArch64::LDRHHui:
3046 case AArch64::LDRHui:
3047 case AArch64::LDRQui:
3048 case AArch64::LDRSBWui:
3049 case AArch64::LDRSBXui:
3050 case AArch64::LDRSHWui:
3051 case AArch64::LDRSHXui:
3052 case AArch64::LDRSui:
3053 case AArch64::LDRSWui:
3054 case AArch64::LDRWui:
3055 case AArch64::LDRXui:
3056 case AArch64::LDURBBi:
3057 case AArch64::LDURBi:
3058 case AArch64::LDURDi:
3059 case AArch64::LDURHHi:
3060 case AArch64::LDURHi:
3061 case AArch64::LDURQi:
3062 case AArch64::LDURSBWi:
3063 case AArch64::LDURSBXi:
3064 case AArch64::LDURSHWi:
3065 case AArch64::LDURSHXi:
3066 case AArch64::LDURSi:
3067 case AArch64::LDURSWi:
3068 case AArch64::LDURWi:
3069 case AArch64::LDURXi:
3070 case AArch64::PRFMui:
3071 case AArch64::PRFUMi:
3072 case AArch64::ST2Gi:
3074 case AArch64::STLURBi:
3075 case AArch64::STLURHi:
3076 case AArch64::STLURWi:
3077 case AArch64::STLURXi:
3078 case AArch64::StoreSwiftAsyncContext:
3079 case AArch64::STR_PPXI:
3080 case AArch64::STR_PXI:
3081 case AArch64::STR_ZXI:
3082 case AArch64::STR_ZZXI:
3083 case AArch64::STR_ZZXI_STRIDED_CONTIGUOUS:
3084 case AArch64::STR_ZZZXI:
3085 case AArch64::STR_ZZZZXI:
3086 case AArch64::STR_ZZZZXI_STRIDED_CONTIGUOUS:
3087 case AArch64::STRBBui:
3088 case AArch64::STRBui:
3089 case AArch64::STRDui:
3090 case AArch64::STRHHui:
3091 case AArch64::STRHui:
3092 case AArch64::STRQui:
3093 case AArch64::STRSui:
3094 case AArch64::STRWui:
3095 case AArch64::STRXui:
3096 case AArch64::STURBBi:
3097 case AArch64::STURBi:
3098 case AArch64::STURDi:
3099 case AArch64::STURHHi:
3100 case AArch64::STURHi:
3101 case AArch64::STURQi:
3102 case AArch64::STURSi:
3103 case AArch64::STURWi:
3104 case AArch64::STURXi:
3105 case AArch64::STZ2Gi:
3106 case AArch64::STZGi:
3107 case AArch64::TAGPstack:
3109 case AArch64::LD1B_D_IMM:
3110 case AArch64::LD1B_H_IMM:
3111 case AArch64::LD1B_IMM:
3112 case AArch64::LD1B_S_IMM:
3113 case AArch64::LD1D_IMM:
3114 case AArch64::LD1H_D_IMM:
3115 case AArch64::LD1H_IMM:
3116 case AArch64::LD1H_S_IMM:
3117 case AArch64::LD1RB_D_IMM:
3118 case AArch64::LD1RB_H_IMM:
3119 case AArch64::LD1RB_IMM:
3120 case AArch64::LD1RB_S_IMM:
3121 case AArch64::LD1RD_IMM:
3122 case AArch64::LD1RH_D_IMM:
3123 case AArch64::LD1RH_IMM:
3124 case AArch64::LD1RH_S_IMM:
3125 case AArch64::LD1RSB_D_IMM:
3126 case AArch64::LD1RSB_H_IMM:
3127 case AArch64::LD1RSB_S_IMM:
3128 case AArch64::LD1RSH_D_IMM:
3129 case AArch64::LD1RSH_S_IMM:
3130 case AArch64::LD1RSW_IMM:
3131 case AArch64::LD1RW_D_IMM:
3132 case AArch64::LD1RW_IMM:
3133 case AArch64::LD1SB_D_IMM:
3134 case AArch64::LD1SB_H_IMM:
3135 case AArch64::LD1SB_S_IMM:
3136 case AArch64::LD1SH_D_IMM:
3137 case AArch64::LD1SH_S_IMM:
3138 case AArch64::LD1SW_D_IMM:
3139 case AArch64::LD1W_D_IMM:
3140 case AArch64::LD1W_IMM:
3141 case AArch64::LD2B_IMM:
3142 case AArch64::LD2D_IMM:
3143 case AArch64::LD2H_IMM:
3144 case AArch64::LD2W_IMM:
3145 case AArch64::LD3B_IMM:
3146 case AArch64::LD3D_IMM:
3147 case AArch64::LD3H_IMM:
3148 case AArch64::LD3W_IMM:
3149 case AArch64::LD4B_IMM:
3150 case AArch64::LD4D_IMM:
3151 case AArch64::LD4H_IMM:
3152 case AArch64::LD4W_IMM:
3154 case AArch64::LDNF1B_D_IMM:
3155 case AArch64::LDNF1B_H_IMM:
3156 case AArch64::LDNF1B_IMM:
3157 case AArch64::LDNF1B_S_IMM:
3158 case AArch64::LDNF1D_IMM:
3159 case AArch64::LDNF1H_D_IMM:
3160 case AArch64::LDNF1H_IMM:
3161 case AArch64::LDNF1H_S_IMM:
3162 case AArch64::LDNF1SB_D_IMM:
3163 case AArch64::LDNF1SB_H_IMM:
3164 case AArch64::LDNF1SB_S_IMM:
3165 case AArch64::LDNF1SH_D_IMM:
3166 case AArch64::LDNF1SH_S_IMM:
3167 case AArch64::LDNF1SW_D_IMM:
3168 case AArch64::LDNF1W_D_IMM:
3169 case AArch64::LDNF1W_IMM:
3170 case AArch64::LDNPDi:
3171 case AArch64::LDNPQi:
3172 case AArch64::LDNPSi:
3173 case AArch64::LDNPWi:
3174 case AArch64::LDNPXi:
3175 case AArch64::LDNT1B_ZRI:
3176 case AArch64::LDNT1D_ZRI:
3177 case AArch64::LDNT1H_ZRI:
3178 case AArch64::LDNT1W_ZRI:
3179 case AArch64::LDPDi:
3180 case AArch64::LDPQi:
3181 case AArch64::LDPSi:
3182 case AArch64::LDPWi:
3183 case AArch64::LDPXi:
3184 case AArch64::LDRBBpost:
3185 case AArch64::LDRBBpre:
3186 case AArch64::LDRBpost:
3187 case AArch64::LDRBpre:
3188 case AArch64::LDRDpost:
3189 case AArch64::LDRDpre:
3190 case AArch64::LDRHHpost:
3191 case AArch64::LDRHHpre:
3192 case AArch64::LDRHpost:
3193 case AArch64::LDRHpre:
3194 case AArch64::LDRQpost:
3195 case AArch64::LDRQpre:
3196 case AArch64::LDRSpost:
3197 case AArch64::LDRSpre:
3198 case AArch64::LDRWpost:
3199 case AArch64::LDRWpre:
3200 case AArch64::LDRXpost:
3201 case AArch64::LDRXpre:
3202 case AArch64::ST1B_D_IMM:
3203 case AArch64::ST1B_H_IMM:
3204 case AArch64::ST1B_IMM:
3205 case AArch64::ST1B_S_IMM:
3206 case AArch64::ST1D_IMM:
3207 case AArch64::ST1H_D_IMM:
3208 case AArch64::ST1H_IMM:
3209 case AArch64::ST1H_S_IMM:
3210 case AArch64::ST1W_D_IMM:
3211 case AArch64::ST1W_IMM:
3212 case AArch64::ST2B_IMM:
3213 case AArch64::ST2D_IMM:
3214 case AArch64::ST2H_IMM:
3215 case AArch64::ST2W_IMM:
3216 case AArch64::ST3B_IMM:
3217 case AArch64::ST3D_IMM:
3218 case AArch64::ST3H_IMM:
3219 case AArch64::ST3W_IMM:
3220 case AArch64::ST4B_IMM:
3221 case AArch64::ST4D_IMM:
3222 case AArch64::ST4H_IMM:
3223 case AArch64::ST4W_IMM:
3224 case AArch64::STGPi:
3225 case AArch64::STGPreIndex:
3226 case AArch64::STZGPreIndex:
3227 case AArch64::ST2GPreIndex:
3228 case AArch64::STZ2GPreIndex:
3229 case AArch64::STGPostIndex:
3230 case AArch64::STZGPostIndex:
3231 case AArch64::ST2GPostIndex:
3232 case AArch64::STZ2GPostIndex:
3233 case AArch64::STNPDi:
3234 case AArch64::STNPQi:
3235 case AArch64::STNPSi:
3236 case AArch64::STNPWi:
3237 case AArch64::STNPXi:
3238 case AArch64::STNT1B_ZRI:
3239 case AArch64::STNT1D_ZRI:
3240 case AArch64::STNT1H_ZRI:
3241 case AArch64::STNT1W_ZRI:
3242 case AArch64::STPDi:
3243 case AArch64::STPQi:
3244 case AArch64::STPSi:
3245 case AArch64::STPWi:
3246 case AArch64::STPXi:
3247 case AArch64::STRBBpost:
3248 case AArch64::STRBBpre:
3249 case AArch64::STRBpost:
3250 case AArch64::STRBpre:
3251 case AArch64::STRDpost:
3252 case AArch64::STRDpre:
3253 case AArch64::STRHHpost:
3254 case AArch64::STRHHpre:
3255 case AArch64::STRHpost:
3256 case AArch64::STRHpre:
3257 case AArch64::STRQpost:
3258 case AArch64::STRQpre:
3259 case AArch64::STRSpost:
3260 case AArch64::STRSpre:
3261 case AArch64::STRWpost:
3262 case AArch64::STRWpre:
3263 case AArch64::STRXpost:
3264 case AArch64::STRXpre:
3265 case AArch64::LD1B_2Z_IMM:
3266 case AArch64::LD1B_2Z_STRIDED_IMM:
3267 case AArch64::LD1H_2Z_IMM:
3268 case AArch64::LD1H_2Z_STRIDED_IMM:
3269 case AArch64::LD1W_2Z_IMM:
3270 case AArch64::LD1W_2Z_STRIDED_IMM:
3271 case AArch64::LD1D_2Z_IMM:
3272 case AArch64::LD1D_2Z_STRIDED_IMM:
3273 case AArch64::LD1B_4Z_IMM:
3274 case AArch64::LD1B_4Z_STRIDED_IMM:
3275 case AArch64::LD1H_4Z_IMM:
3276 case AArch64::LD1H_4Z_STRIDED_IMM:
3277 case AArch64::LD1W_4Z_IMM:
3278 case AArch64::LD1W_4Z_STRIDED_IMM:
3279 case AArch64::LD1D_4Z_IMM:
3280 case AArch64::LD1D_4Z_STRIDED_IMM:
3281 case AArch64::LD1B_2Z_IMM_PSEUDO:
3282 case AArch64::LD1H_2Z_IMM_PSEUDO:
3283 case AArch64::LD1W_2Z_IMM_PSEUDO:
3284 case AArch64::LD1D_2Z_IMM_PSEUDO:
3285 case AArch64::LD1B_4Z_IMM_PSEUDO:
3286 case AArch64::LD1H_4Z_IMM_PSEUDO:
3287 case AArch64::LD1W_4Z_IMM_PSEUDO:
3288 case AArch64::LD1D_4Z_IMM_PSEUDO:
3289 case AArch64::ST1B_2Z_IMM:
3290 case AArch64::ST1B_2Z_STRIDED_IMM:
3291 case AArch64::ST1H_2Z_IMM:
3292 case AArch64::ST1H_2Z_STRIDED_IMM:
3293 case AArch64::ST1W_2Z_IMM:
3294 case AArch64::ST1W_2Z_STRIDED_IMM:
3295 case AArch64::ST1D_2Z_IMM:
3296 case AArch64::ST1D_2Z_STRIDED_IMM:
3297 case AArch64::LDNT1B_2Z_IMM_PSEUDO:
3298 case AArch64::LDNT1B_2Z_IMM:
3299 case AArch64::LDNT1B_2Z_STRIDED_IMM:
3300 case AArch64::LDNT1H_2Z_IMM_PSEUDO:
3301 case AArch64::LDNT1H_2Z_IMM:
3302 case AArch64::LDNT1H_2Z_STRIDED_IMM:
3303 case AArch64::LDNT1W_2Z_IMM_PSEUDO:
3304 case AArch64::LDNT1W_2Z_IMM:
3305 case AArch64::LDNT1W_2Z_STRIDED_IMM:
3306 case AArch64::LDNT1D_2Z_IMM_PSEUDO:
3307 case AArch64::LDNT1D_2Z_IMM:
3308 case AArch64::LDNT1D_2Z_STRIDED_IMM:
3309 case AArch64::STNT1B_2Z_IMM:
3310 case AArch64::STNT1B_2Z_STRIDED_IMM:
3311 case AArch64::STNT1H_2Z_IMM:
3312 case AArch64::STNT1H_2Z_STRIDED_IMM:
3313 case AArch64::STNT1W_2Z_IMM:
3314 case AArch64::STNT1W_2Z_STRIDED_IMM:
3315 case AArch64::STNT1D_2Z_IMM:
3316 case AArch64::STNT1D_2Z_STRIDED_IMM:
3317 case AArch64::ST1B_2Z_IMM_PSEUDO:
3318 case AArch64::ST1H_2Z_IMM_PSEUDO:
3319 case AArch64::ST1W_2Z_IMM_PSEUDO:
3320 case AArch64::ST1D_2Z_IMM_PSEUDO:
3321 case AArch64::STNT1B_2Z_IMM_PSEUDO:
3322 case AArch64::STNT1H_2Z_IMM_PSEUDO:
3323 case AArch64::STNT1W_2Z_IMM_PSEUDO:
3324 case AArch64::STNT1D_2Z_IMM_PSEUDO:
3325 case AArch64::ST1B_4Z_IMM:
3326 case AArch64::ST1B_4Z_STRIDED_IMM:
3327 case AArch64::ST1H_4Z_IMM:
3328 case AArch64::ST1H_4Z_STRIDED_IMM:
3329 case AArch64::ST1W_4Z_IMM:
3330 case AArch64::ST1W_4Z_STRIDED_IMM:
3331 case AArch64::ST1D_4Z_IMM:
3332 case AArch64::ST1D_4Z_STRIDED_IMM:
3333 case AArch64::LDNT1B_4Z_IMM_PSEUDO:
3334 case AArch64::LDNT1B_4Z_IMM:
3335 case AArch64::LDNT1B_4Z_STRIDED_IMM:
3336 case AArch64::LDNT1H_4Z_IMM_PSEUDO:
3337 case AArch64::LDNT1H_4Z_IMM:
3338 case AArch64::LDNT1H_4Z_STRIDED_IMM:
3339 case AArch64::LDNT1W_4Z_IMM_PSEUDO:
3340 case AArch64::LDNT1W_4Z_IMM:
3341 case AArch64::LDNT1W_4Z_STRIDED_IMM:
3342 case AArch64::LDNT1D_4Z_IMM_PSEUDO:
3343 case AArch64::LDNT1D_4Z_IMM:
3344 case AArch64::LDNT1D_4Z_STRIDED_IMM:
3345 case AArch64::STNT1B_4Z_IMM:
3346 case AArch64::STNT1B_4Z_STRIDED_IMM:
3347 case AArch64::STNT1H_4Z_IMM:
3348 case AArch64::STNT1H_4Z_STRIDED_IMM:
3349 case AArch64::STNT1W_4Z_IMM:
3350 case AArch64::STNT1W_4Z_STRIDED_IMM:
3351 case AArch64::STNT1D_4Z_IMM:
3352 case AArch64::STNT1D_4Z_STRIDED_IMM:
3353 case AArch64::ST1B_4Z_IMM_PSEUDO:
3354 case AArch64::ST1H_4Z_IMM_PSEUDO:
3355 case AArch64::ST1W_4Z_IMM_PSEUDO:
3356 case AArch64::ST1D_4Z_IMM_PSEUDO:
3357 case AArch64::STNT1B_4Z_IMM_PSEUDO:
3358 case AArch64::STNT1H_4Z_IMM_PSEUDO:
3359 case AArch64::STNT1W_4Z_IMM_PSEUDO:
3360 case AArch64::STNT1D_4Z_IMM_PSEUDO:
3362 case AArch64::LDPDpost:
3363 case AArch64::LDPDpre:
3364 case AArch64::LDPQpost:
3365 case AArch64::LDPQpre:
3366 case AArch64::LDPSpost:
3367 case AArch64::LDPSpre:
3368 case AArch64::LDPWpost:
3369 case AArch64::LDPWpre:
3370 case AArch64::LDPXpost:
3371 case AArch64::LDPXpre:
3372 case AArch64::STGPpre:
3373 case AArch64::STGPpost:
3374 case AArch64::STPDpost:
3375 case AArch64::STPDpre:
3376 case AArch64::STPQpost:
3377 case AArch64::STPQpre:
3378 case AArch64::STPSpost:
3379 case AArch64::STPSpre:
3380 case AArch64::STPWpost:
3381 case AArch64::STPWpre:
3382 case AArch64::STPXpost:
3383 case AArch64::STPXpre:
3389 switch (
MI.getOpcode()) {
3393 case AArch64::STRSui:
3394 case AArch64::STRDui:
3395 case AArch64::STRQui:
3396 case AArch64::STRXui:
3397 case AArch64::STRWui:
3398 case AArch64::LDRSui:
3399 case AArch64::LDRDui:
3400 case AArch64::LDRQui:
3401 case AArch64::LDRXui:
3402 case AArch64::LDRWui:
3403 case AArch64::LDRSWui:
3405 case AArch64::STURSi:
3406 case AArch64::STRSpre:
3407 case AArch64::STURDi:
3408 case AArch64::STRDpre:
3409 case AArch64::STURQi:
3410 case AArch64::STRQpre:
3411 case AArch64::STURWi:
3412 case AArch64::STRWpre:
3413 case AArch64::STURXi:
3414 case AArch64::STRXpre:
3415 case AArch64::LDURSi:
3416 case AArch64::LDRSpre:
3417 case AArch64::LDURDi:
3418 case AArch64::LDRDpre:
3419 case AArch64::LDURQi:
3420 case AArch64::LDRQpre:
3421 case AArch64::LDURWi:
3422 case AArch64::LDRWpre:
3423 case AArch64::LDURXi:
3424 case AArch64::LDRXpre:
3425 case AArch64::LDURSWi:
3426 case AArch64::LDRSWpre:
3428 case AArch64::LDR_ZXI:
3429 case AArch64::STR_ZXI:
3435 switch (
MI.getOpcode()) {
3438 "Unexpected instruction - was a new tail call opcode introduced?");
3440 case AArch64::TCRETURNdi:
3441 case AArch64::TCRETURNri:
3442 case AArch64::TCRETURNrix16x17:
3443 case AArch64::TCRETURNrix17:
3444 case AArch64::TCRETURNrinotx16:
3445 case AArch64::TCRETURNriALL:
3446 case AArch64::AUTH_TCRETURN:
3447 case AArch64::AUTH_TCRETURN_BTI:
3457 case AArch64::ADDWri:
3458 return AArch64::ADDSWri;
3459 case AArch64::ADDWrr:
3460 return AArch64::ADDSWrr;
3461 case AArch64::ADDWrs:
3462 return AArch64::ADDSWrs;
3463 case AArch64::ADDWrx:
3464 return AArch64::ADDSWrx;
3465 case AArch64::ANDWri:
3466 return AArch64::ANDSWri;
3467 case AArch64::ANDWrr:
3468 return AArch64::ANDSWrr;
3469 case AArch64::ANDWrs:
3470 return AArch64::ANDSWrs;
3471 case AArch64::BICWrr:
3472 return AArch64::BICSWrr;
3473 case AArch64::BICWrs:
3474 return AArch64::BICSWrs;
3475 case AArch64::SUBWri:
3476 return AArch64::SUBSWri;
3477 case AArch64::SUBWrr:
3478 return AArch64::SUBSWrr;
3479 case AArch64::SUBWrs:
3480 return AArch64::SUBSWrs;
3481 case AArch64::SUBWrx:
3482 return AArch64::SUBSWrx;
3484 case AArch64::ADDXri:
3485 return AArch64::ADDSXri;
3486 case AArch64::ADDXrr:
3487 return AArch64::ADDSXrr;
3488 case AArch64::ADDXrs:
3489 return AArch64::ADDSXrs;
3490 case AArch64::ADDXrx:
3491 return AArch64::ADDSXrx;
3492 case AArch64::ANDXri:
3493 return AArch64::ANDSXri;
3494 case AArch64::ANDXrr:
3495 return AArch64::ANDSXrr;
3496 case AArch64::ANDXrs:
3497 return AArch64::ANDSXrs;
3498 case AArch64::BICXrr:
3499 return AArch64::BICSXrr;
3500 case AArch64::BICXrs:
3501 return AArch64::BICSXrs;
3502 case AArch64::SUBXri:
3503 return AArch64::SUBSXri;
3504 case AArch64::SUBXrr:
3505 return AArch64::SUBSXrr;
3506 case AArch64::SUBXrs:
3507 return AArch64::SUBSXrs;
3508 case AArch64::SUBXrx:
3509 return AArch64::SUBSXrx;
3511 case AArch64::AND_PPzPP:
3512 return AArch64::ANDS_PPzPP;
3513 case AArch64::BIC_PPzPP:
3514 return AArch64::BICS_PPzPP;
3515 case AArch64::EOR_PPzPP:
3516 return AArch64::EORS_PPzPP;
3517 case AArch64::NAND_PPzPP:
3518 return AArch64::NANDS_PPzPP;
3519 case AArch64::NOR_PPzPP:
3520 return AArch64::NORS_PPzPP;
3521 case AArch64::ORN_PPzPP:
3522 return AArch64::ORNS_PPzPP;
3523 case AArch64::ORR_PPzPP:
3524 return AArch64::ORRS_PPzPP;
3525 case AArch64::BRKA_PPzP:
3526 return AArch64::BRKAS_PPzP;
3527 case AArch64::BRKPA_PPzPP:
3528 return AArch64::BRKPAS_PPzPP;
3529 case AArch64::BRKB_PPzP:
3530 return AArch64::BRKBS_PPzP;
3531 case AArch64::BRKPB_PPzPP:
3532 return AArch64::BRKPBS_PPzPP;
3533 case AArch64::BRKN_PPzP:
3534 return AArch64::BRKNS_PPzP;
3535 case AArch64::RDFFR_PPz:
3536 return AArch64::RDFFRS_PPz;
3537 case AArch64::PTRUE_B:
3538 return AArch64::PTRUES_B;
3549 if (
MI.hasOrderedMemoryRef())
3554 assert((
MI.getOperand(IsPreLdSt ? 2 : 1).isReg() ||
3555 MI.getOperand(IsPreLdSt ? 2 : 1).isFI()) &&
3556 "Expected a reg or frame index operand.");
3560 bool IsImmPreLdSt = IsPreLdSt &&
MI.getOperand(3).isImm();
3562 if (!
MI.getOperand(2).isImm() && !IsImmPreLdSt)
3575 if (
MI.getOperand(1).isReg() && !IsPreLdSt) {
3576 Register BaseReg =
MI.getOperand(1).getReg();
3578 if (
MI.modifiesRegister(BaseReg,
TRI))
3584 switch (
MI.getOpcode()) {
3587 case AArch64::LDR_ZXI:
3588 case AArch64::STR_ZXI:
3589 if (!Subtarget.isLittleEndian() ||
3590 Subtarget.getSVEVectorSizeInBits() != 128)
3603 const MCAsmInfo &MAI =
MI.getMF()->getTarget().getMCAsmInfo();
3611 if (Subtarget.isPaired128Slow()) {
3612 switch (
MI.getOpcode()) {
3615 case AArch64::LDURQi:
3616 case AArch64::STURQi:
3617 case AArch64::LDRQui:
3618 case AArch64::STRQui:
3645std::optional<ExtAddrMode>
3650 bool OffsetIsScalable;
3651 if (!getMemOperandWithOffset(MemI,
Base,
Offset, OffsetIsScalable,
TRI))
3652 return std::nullopt;
3655 return std::nullopt;
3670 int64_t OffsetScale = 1;
3675 case AArch64::LDURQi:
3676 case AArch64::STURQi:
3680 case AArch64::LDURDi:
3681 case AArch64::STURDi:
3682 case AArch64::LDURXi:
3683 case AArch64::STURXi:
3687 case AArch64::LDURWi:
3688 case AArch64::LDURSWi:
3689 case AArch64::STURWi:
3693 case AArch64::LDURHi:
3694 case AArch64::STURHi:
3695 case AArch64::LDURHHi:
3696 case AArch64::STURHHi:
3697 case AArch64::LDURSHXi:
3698 case AArch64::LDURSHWi:
3702 case AArch64::LDRBroX:
3703 case AArch64::LDRBBroX:
3704 case AArch64::LDRSBXroX:
3705 case AArch64::LDRSBWroX:
3706 case AArch64::STRBroX:
3707 case AArch64::STRBBroX:
3708 case AArch64::LDURBi:
3709 case AArch64::LDURBBi:
3710 case AArch64::LDURSBXi:
3711 case AArch64::LDURSBWi:
3712 case AArch64::STURBi:
3713 case AArch64::STURBBi:
3714 case AArch64::LDRBui:
3715 case AArch64::LDRBBui:
3716 case AArch64::LDRSBXui:
3717 case AArch64::LDRSBWui:
3718 case AArch64::STRBui:
3719 case AArch64::STRBBui:
3723 case AArch64::LDRQroX:
3724 case AArch64::STRQroX:
3725 case AArch64::LDRQui:
3726 case AArch64::STRQui:
3731 case AArch64::LDRDroX:
3732 case AArch64::STRDroX:
3733 case AArch64::LDRXroX:
3734 case AArch64::STRXroX:
3735 case AArch64::LDRDui:
3736 case AArch64::STRDui:
3737 case AArch64::LDRXui:
3738 case AArch64::STRXui:
3743 case AArch64::LDRWroX:
3744 case AArch64::LDRSWroX:
3745 case AArch64::STRWroX:
3746 case AArch64::LDRWui:
3747 case AArch64::LDRSWui:
3748 case AArch64::STRWui:
3753 case AArch64::LDRHroX:
3754 case AArch64::STRHroX:
3755 case AArch64::LDRHHroX:
3756 case AArch64::STRHHroX:
3757 case AArch64::LDRSHXroX:
3758 case AArch64::LDRSHWroX:
3759 case AArch64::LDRHui:
3760 case AArch64::STRHui:
3761 case AArch64::LDRHHui:
3762 case AArch64::STRHHui:
3763 case AArch64::LDRSHXui:
3764 case AArch64::LDRSHWui:
3772 if (BaseRegOp.
isReg() && BaseRegOp.
getReg() == Reg)
3796 case AArch64::SBFMXri:
3809 AM.
Scale = OffsetScale;
3814 case TargetOpcode::SUBREG_TO_REG: {
3830 if (
DefMI.getOpcode() != AArch64::ORRWrs ||
3831 DefMI.getOperand(1).getReg() != AArch64::WZR ||
3832 DefMI.getOperand(3).getImm() != 0)
3839 AM.
Scale = OffsetScale;
3850 auto validateOffsetForLDP = [](
unsigned NumBytes, int64_t OldOffset,
3851 int64_t NewOffset) ->
bool {
3852 int64_t MinOffset, MaxOffset;
3869 return OldOffset < MinOffset || OldOffset > MaxOffset ||
3870 (NewOffset >= MinOffset && NewOffset <= MaxOffset);
3872 auto canFoldAddSubImmIntoAddrMode = [&](int64_t Disp) ->
bool {
3874 int64_t NewOffset = OldOffset + Disp;
3875 if (!isLegalAddressingMode(NumBytes, NewOffset, 0))
3879 if (!validateOffsetForLDP(NumBytes, OldOffset, NewOffset))
3889 auto canFoldAddRegIntoAddrMode =
3894 if ((
unsigned)Scale != Scale)
3896 if (!isLegalAddressingMode(NumBytes, 0, Scale))
3908 return (Opcode == AArch64::STURQi || Opcode == AArch64::STRQui) &&
3909 Subtarget.isSTRQroSlow();
3918 case AArch64::ADDXri:
3924 return canFoldAddSubImmIntoAddrMode(Disp);
3926 case AArch64::SUBXri:
3932 return canFoldAddSubImmIntoAddrMode(-Disp);
3934 case AArch64::ADDXrs: {
3947 if (Shift != 2 && Shift != 3 && Subtarget.hasAddrLSLSlow14())
3949 if (avoidSlowSTRQ(MemI))
3952 return canFoldAddRegIntoAddrMode(1ULL << Shift);
3955 case AArch64::ADDXrr:
3963 if (!OptSize && avoidSlowSTRQ(MemI))
3965 return canFoldAddRegIntoAddrMode(1);
3967 case AArch64::ADDXrx:
3975 if (!OptSize && avoidSlowSTRQ(MemI))
3984 return canFoldAddRegIntoAddrMode(
3999 case AArch64::LDURQi:
4000 case AArch64::LDRQui:
4001 return AArch64::LDRQroX;
4002 case AArch64::STURQi:
4003 case AArch64::STRQui:
4004 return AArch64::STRQroX;
4005 case AArch64::LDURDi:
4006 case AArch64::LDRDui:
4007 return AArch64::LDRDroX;
4008 case AArch64::STURDi:
4009 case AArch64::STRDui:
4010 return AArch64::STRDroX;
4011 case AArch64::LDURXi:
4012 case AArch64::LDRXui:
4013 return AArch64::LDRXroX;
4014 case AArch64::STURXi:
4015 case AArch64::STRXui:
4016 return AArch64::STRXroX;
4017 case AArch64::LDURWi:
4018 case AArch64::LDRWui:
4019 return AArch64::LDRWroX;
4020 case AArch64::LDURSWi:
4021 case AArch64::LDRSWui:
4022 return AArch64::LDRSWroX;
4023 case AArch64::STURWi:
4024 case AArch64::STRWui:
4025 return AArch64::STRWroX;
4026 case AArch64::LDURHi:
4027 case AArch64::LDRHui:
4028 return AArch64::LDRHroX;
4029 case AArch64::STURHi:
4030 case AArch64::STRHui:
4031 return AArch64::STRHroX;
4032 case AArch64::LDURHHi:
4033 case AArch64::LDRHHui:
4034 return AArch64::LDRHHroX;
4035 case AArch64::STURHHi:
4036 case AArch64::STRHHui:
4037 return AArch64::STRHHroX;
4038 case AArch64::LDURSHXi:
4039 case AArch64::LDRSHXui:
4040 return AArch64::LDRSHXroX;
4041 case AArch64::LDURSHWi:
4042 case AArch64::LDRSHWui:
4043 return AArch64::LDRSHWroX;
4044 case AArch64::LDURBi:
4045 case AArch64::LDRBui:
4046 return AArch64::LDRBroX;
4047 case AArch64::LDURBBi:
4048 case AArch64::LDRBBui:
4049 return AArch64::LDRBBroX;
4050 case AArch64::LDURSBXi:
4051 case AArch64::LDRSBXui:
4052 return AArch64::LDRSBXroX;
4053 case AArch64::LDURSBWi:
4054 case AArch64::LDRSBWui:
4055 return AArch64::LDRSBWroX;
4056 case AArch64::STURBi:
4057 case AArch64::STRBui:
4058 return AArch64::STRBroX;
4059 case AArch64::STURBBi:
4060 case AArch64::STRBBui:
4061 return AArch64::STRBBroX;
4073 case AArch64::LDURQi:
4075 return AArch64::LDRQui;
4076 case AArch64::STURQi:
4078 return AArch64::STRQui;
4079 case AArch64::LDURDi:
4081 return AArch64::LDRDui;
4082 case AArch64::STURDi:
4084 return AArch64::STRDui;
4085 case AArch64::LDURXi:
4087 return AArch64::LDRXui;
4088 case AArch64::STURXi:
4090 return AArch64::STRXui;
4091 case AArch64::LDURWi:
4093 return AArch64::LDRWui;
4094 case AArch64::LDURSWi:
4096 return AArch64::LDRSWui;
4097 case AArch64::STURWi:
4099 return AArch64::STRWui;
4100 case AArch64::LDURHi:
4102 return AArch64::LDRHui;
4103 case AArch64::STURHi:
4105 return AArch64::STRHui;
4106 case AArch64::LDURHHi:
4108 return AArch64::LDRHHui;
4109 case AArch64::STURHHi:
4111 return AArch64::STRHHui;
4112 case AArch64::LDURSHXi:
4114 return AArch64::LDRSHXui;
4115 case AArch64::LDURSHWi:
4117 return AArch64::LDRSHWui;
4118 case AArch64::LDURBi:
4120 return AArch64::LDRBui;
4121 case AArch64::LDURBBi:
4123 return AArch64::LDRBBui;
4124 case AArch64::LDURSBXi:
4126 return AArch64::LDRSBXui;
4127 case AArch64::LDURSBWi:
4129 return AArch64::LDRSBWui;
4130 case AArch64::STURBi:
4132 return AArch64::STRBui;
4133 case AArch64::STURBBi:
4135 return AArch64::STRBBui;
4136 case AArch64::LDRQui:
4137 case AArch64::STRQui:
4140 case AArch64::LDRDui:
4141 case AArch64::STRDui:
4142 case AArch64::LDRXui:
4143 case AArch64::STRXui:
4146 case AArch64::LDRWui:
4147 case AArch64::LDRSWui:
4148 case AArch64::STRWui:
4151 case AArch64::LDRHui:
4152 case AArch64::STRHui:
4153 case AArch64::LDRHHui:
4154 case AArch64::STRHHui:
4155 case AArch64::LDRSHXui:
4156 case AArch64::LDRSHWui:
4159 case AArch64::LDRBui:
4160 case AArch64::LDRBBui:
4161 case AArch64::LDRSBXui:
4162 case AArch64::LDRSBWui:
4163 case AArch64::STRBui:
4164 case AArch64::STRBBui:
4178 case AArch64::LDURQi:
4179 case AArch64::STURQi:
4180 case AArch64::LDURDi:
4181 case AArch64::STURDi:
4182 case AArch64::LDURXi:
4183 case AArch64::STURXi:
4184 case AArch64::LDURWi:
4185 case AArch64::LDURSWi:
4186 case AArch64::STURWi:
4187 case AArch64::LDURHi:
4188 case AArch64::STURHi:
4189 case AArch64::LDURHHi:
4190 case AArch64::STURHHi:
4191 case AArch64::LDURSHXi:
4192 case AArch64::LDURSHWi:
4193 case AArch64::LDURBi:
4194 case AArch64::STURBi:
4195 case AArch64::LDURBBi:
4196 case AArch64::STURBBi:
4197 case AArch64::LDURSBWi:
4198 case AArch64::LDURSBXi:
4200 case AArch64::LDRQui:
4201 return AArch64::LDURQi;
4202 case AArch64::STRQui:
4203 return AArch64::STURQi;
4204 case AArch64::LDRDui:
4205 return AArch64::LDURDi;
4206 case AArch64::STRDui:
4207 return AArch64::STURDi;
4208 case AArch64::LDRXui:
4209 return AArch64::LDURXi;
4210 case AArch64::STRXui:
4211 return AArch64::STURXi;
4212 case AArch64::LDRWui:
4213 return AArch64::LDURWi;
4214 case AArch64::LDRSWui:
4215 return AArch64::LDURSWi;
4216 case AArch64::STRWui:
4217 return AArch64::STURWi;
4218 case AArch64::LDRHui:
4219 return AArch64::LDURHi;
4220 case AArch64::STRHui:
4221 return AArch64::STURHi;
4222 case AArch64::LDRHHui:
4223 return AArch64::LDURHHi;
4224 case AArch64::STRHHui:
4225 return AArch64::STURHHi;
4226 case AArch64::LDRSHXui:
4227 return AArch64::LDURSHXi;
4228 case AArch64::LDRSHWui:
4229 return AArch64::LDURSHWi;
4230 case AArch64::LDRBBui:
4231 return AArch64::LDURBBi;
4232 case AArch64::LDRBui:
4233 return AArch64::LDURBi;
4234 case AArch64::STRBBui:
4235 return AArch64::STURBBi;
4236 case AArch64::STRBui:
4237 return AArch64::STURBi;
4238 case AArch64::LDRSBWui:
4239 return AArch64::LDURSBWi;
4240 case AArch64::LDRSBXui:
4241 return AArch64::LDURSBXi;
4254 case AArch64::LDRQroX:
4255 case AArch64::LDURQi:
4256 case AArch64::LDRQui:
4257 return AArch64::LDRQroW;
4258 case AArch64::STRQroX:
4259 case AArch64::STURQi:
4260 case AArch64::STRQui:
4261 return AArch64::STRQroW;
4262 case AArch64::LDRDroX:
4263 case AArch64::LDURDi:
4264 case AArch64::LDRDui:
4265 return AArch64::LDRDroW;
4266 case AArch64::STRDroX:
4267 case AArch64::STURDi:
4268 case AArch64::STRDui:
4269 return AArch64::STRDroW;
4270 case AArch64::LDRXroX:
4271 case AArch64::LDURXi:
4272 case AArch64::LDRXui:
4273 return AArch64::LDRXroW;
4274 case AArch64::STRXroX:
4275 case AArch64::STURXi:
4276 case AArch64::STRXui:
4277 return AArch64::STRXroW;
4278 case AArch64::LDRWroX:
4279 case AArch64::LDURWi:
4280 case AArch64::LDRWui:
4281 return AArch64::LDRWroW;
4282 case AArch64::LDRSWroX:
4283 case AArch64::LDURSWi:
4284 case AArch64::LDRSWui:
4285 return AArch64::LDRSWroW;
4286 case AArch64::STRWroX:
4287 case AArch64::STURWi:
4288 case AArch64::STRWui:
4289 return AArch64::STRWroW;
4290 case AArch64::LDRHroX:
4291 case AArch64::LDURHi:
4292 case AArch64::LDRHui:
4293 return AArch64::LDRHroW;
4294 case AArch64::STRHroX:
4295 case AArch64::STURHi:
4296 case AArch64::STRHui:
4297 return AArch64::STRHroW;
4298 case AArch64::LDRHHroX:
4299 case AArch64::LDURHHi:
4300 case AArch64::LDRHHui:
4301 return AArch64::LDRHHroW;
4302 case AArch64::STRHHroX:
4303 case AArch64::STURHHi:
4304 case AArch64::STRHHui:
4305 return AArch64::STRHHroW;
4306 case AArch64::LDRSHXroX:
4307 case AArch64::LDURSHXi:
4308 case AArch64::LDRSHXui:
4309 return AArch64::LDRSHXroW;
4310 case AArch64::LDRSHWroX:
4311 case AArch64::LDURSHWi:
4312 case AArch64::LDRSHWui:
4313 return AArch64::LDRSHWroW;
4314 case AArch64::LDRBroX:
4315 case AArch64::LDURBi:
4316 case AArch64::LDRBui:
4317 return AArch64::LDRBroW;
4318 case AArch64::LDRBBroX:
4319 case AArch64::LDURBBi:
4320 case AArch64::LDRBBui:
4321 return AArch64::LDRBBroW;
4322 case AArch64::LDRSBXroX:
4323 case AArch64::LDURSBXi:
4324 case AArch64::LDRSBXui:
4325 return AArch64::LDRSBXroW;
4326 case AArch64::LDRSBWroX:
4327 case AArch64::LDURSBWi:
4328 case AArch64::LDRSBWui:
4329 return AArch64::LDRSBWroW;
4330 case AArch64::STRBroX:
4331 case AArch64::STURBi:
4332 case AArch64::STRBui:
4333 return AArch64::STRBroW;
4334 case AArch64::STRBBroX:
4335 case AArch64::STURBBi:
4336 case AArch64::STRBBui:
4337 return AArch64::STRBBroW;
4362 return B.getInstr();
4366 "Addressing mode not supported for folding");
4383 return B.getInstr();
4390 "Address offset can be a register or an immediate, but not both");
4411 return B.getInstr();
4415 "Function must not be called with an addressing mode it can't handle");
4424 case AArch64::LD1Fourv16b_POST:
4425 case AArch64::LD1Fourv1d_POST:
4426 case AArch64::LD1Fourv2d_POST:
4427 case AArch64::LD1Fourv2s_POST:
4428 case AArch64::LD1Fourv4h_POST:
4429 case AArch64::LD1Fourv4s_POST:
4430 case AArch64::LD1Fourv8b_POST:
4431 case AArch64::LD1Fourv8h_POST:
4432 case AArch64::LD1Onev16b_POST:
4433 case AArch64::LD1Onev1d_POST:
4434 case AArch64::LD1Onev2d_POST:
4435 case AArch64::LD1Onev2s_POST:
4436 case AArch64::LD1Onev4h_POST:
4437 case AArch64::LD1Onev4s_POST:
4438 case AArch64::LD1Onev8b_POST:
4439 case AArch64::LD1Onev8h_POST:
4440 case AArch64::LD1Rv16b_POST:
4441 case AArch64::LD1Rv1d_POST:
4442 case AArch64::LD1Rv2d_POST:
4443 case AArch64::LD1Rv2s_POST:
4444 case AArch64::LD1Rv4h_POST:
4445 case AArch64::LD1Rv4s_POST:
4446 case AArch64::LD1Rv8b_POST:
4447 case AArch64::LD1Rv8h_POST:
4448 case AArch64::LD1Threev16b_POST:
4449 case AArch64::LD1Threev1d_POST:
4450 case AArch64::LD1Threev2d_POST:
4451 case AArch64::LD1Threev2s_POST:
4452 case AArch64::LD1Threev4h_POST:
4453 case AArch64::LD1Threev4s_POST:
4454 case AArch64::LD1Threev8b_POST:
4455 case AArch64::LD1Threev8h_POST:
4456 case AArch64::LD1Twov16b_POST:
4457 case AArch64::LD1Twov1d_POST:
4458 case AArch64::LD1Twov2d_POST:
4459 case AArch64::LD1Twov2s_POST:
4460 case AArch64::LD1Twov4h_POST:
4461 case AArch64::LD1Twov4s_POST:
4462 case AArch64::LD1Twov8b_POST:
4463 case AArch64::LD1Twov8h_POST:
4464 case AArch64::LD1i16_POST:
4465 case AArch64::LD1i32_POST:
4466 case AArch64::LD1i64_POST:
4467 case AArch64::LD1i8_POST:
4468 case AArch64::LD2Rv16b_POST:
4469 case AArch64::LD2Rv1d_POST:
4470 case AArch64::LD2Rv2d_POST:
4471 case AArch64::LD2Rv2s_POST:
4472 case AArch64::LD2Rv4h_POST:
4473 case AArch64::LD2Rv4s_POST:
4474 case AArch64::LD2Rv8b_POST:
4475 case AArch64::LD2Rv8h_POST:
4476 case AArch64::LD2Twov16b_POST:
4477 case AArch64::LD2Twov2d_POST:
4478 case AArch64::LD2Twov2s_POST:
4479 case AArch64::LD2Twov4h_POST:
4480 case AArch64::LD2Twov4s_POST:
4481 case AArch64::LD2Twov8b_POST:
4482 case AArch64::LD2Twov8h_POST:
4483 case AArch64::LD2i16_POST:
4484 case AArch64::LD2i32_POST:
4485 case AArch64::LD2i64_POST:
4486 case AArch64::LD2i8_POST:
4487 case AArch64::LD3Rv16b_POST:
4488 case AArch64::LD3Rv1d_POST:
4489 case AArch64::LD3Rv2d_POST:
4490 case AArch64::LD3Rv2s_POST:
4491 case AArch64::LD3Rv4h_POST:
4492 case AArch64::LD3Rv4s_POST:
4493 case AArch64::LD3Rv8b_POST:
4494 case AArch64::LD3Rv8h_POST:
4495 case AArch64::LD3Threev16b_POST:
4496 case AArch64::LD3Threev2d_POST:
4497 case AArch64::LD3Threev2s_POST:
4498 case AArch64::LD3Threev4h_POST:
4499 case AArch64::LD3Threev4s_POST:
4500 case AArch64::LD3Threev8b_POST:
4501 case AArch64::LD3Threev8h_POST:
4502 case AArch64::LD3i16_POST:
4503 case AArch64::LD3i32_POST:
4504 case AArch64::LD3i64_POST:
4505 case AArch64::LD3i8_POST:
4506 case AArch64::LD4Fourv16b_POST:
4507 case AArch64::LD4Fourv2d_POST:
4508 case AArch64::LD4Fourv2s_POST:
4509 case AArch64::LD4Fourv4h_POST:
4510 case AArch64::LD4Fourv4s_POST:
4511 case AArch64::LD4Fourv8b_POST:
4512 case AArch64::LD4Fourv8h_POST:
4513 case AArch64::LD4Rv16b_POST:
4514 case AArch64::LD4Rv1d_POST:
4515 case AArch64::LD4Rv2d_POST:
4516 case AArch64::LD4Rv2s_POST:
4517 case AArch64::LD4Rv4h_POST:
4518 case AArch64::LD4Rv4s_POST:
4519 case AArch64::LD4Rv8b_POST:
4520 case AArch64::LD4Rv8h_POST:
4521 case AArch64::LD4i16_POST:
4522 case AArch64::LD4i32_POST:
4523 case AArch64::LD4i64_POST:
4524 case AArch64::LD4i8_POST:
4525 case AArch64::LDAPRWpost:
4526 case AArch64::LDAPRXpost:
4527 case AArch64::LDIAPPWpost:
4528 case AArch64::LDIAPPXpost:
4529 case AArch64::LDPDpost:
4530 case AArch64::LDPQpost:
4531 case AArch64::LDPSWpost:
4532 case AArch64::LDPSpost:
4533 case AArch64::LDPWpost:
4534 case AArch64::LDPXpost:
4535 case AArch64::LDRBBpost:
4536 case AArch64::LDRBpost:
4537 case AArch64::LDRDpost:
4538 case AArch64::LDRHHpost:
4539 case AArch64::LDRHpost:
4540 case AArch64::LDRQpost:
4541 case AArch64::LDRSBWpost:
4542 case AArch64::LDRSBXpost:
4543 case AArch64::LDRSHWpost:
4544 case AArch64::LDRSHXpost:
4545 case AArch64::LDRSWpost:
4546 case AArch64::LDRSpost:
4547 case AArch64::LDRWpost:
4548 case AArch64::LDRXpost:
4549 case AArch64::ST1Fourv16b_POST:
4550 case AArch64::ST1Fourv1d_POST:
4551 case AArch64::ST1Fourv2d_POST:
4552 case AArch64::ST1Fourv2s_POST:
4553 case AArch64::ST1Fourv4h_POST:
4554 case AArch64::ST1Fourv4s_POST:
4555 case AArch64::ST1Fourv8b_POST:
4556 case AArch64::ST1Fourv8h_POST:
4557 case AArch64::ST1Onev16b_POST:
4558 case AArch64::ST1Onev1d_POST:
4559 case AArch64::ST1Onev2d_POST:
4560 case AArch64::ST1Onev2s_POST:
4561 case AArch64::ST1Onev4h_POST:
4562 case AArch64::ST1Onev4s_POST:
4563 case AArch64::ST1Onev8b_POST:
4564 case AArch64::ST1Onev8h_POST:
4565 case AArch64::ST1Threev16b_POST:
4566 case AArch64::ST1Threev1d_POST:
4567 case AArch64::ST1Threev2d_POST:
4568 case AArch64::ST1Threev2s_POST:
4569 case AArch64::ST1Threev4h_POST:
4570 case AArch64::ST1Threev4s_POST:
4571 case AArch64::ST1Threev8b_POST:
4572 case AArch64::ST1Threev8h_POST:
4573 case AArch64::ST1Twov16b_POST:
4574 case AArch64::ST1Twov1d_POST:
4575 case AArch64::ST1Twov2d_POST:
4576 case AArch64::ST1Twov2s_POST:
4577 case AArch64::ST1Twov4h_POST:
4578 case AArch64::ST1Twov4s_POST:
4579 case AArch64::ST1Twov8b_POST:
4580 case AArch64::ST1Twov8h_POST:
4581 case AArch64::ST1i16_POST:
4582 case AArch64::ST1i32_POST:
4583 case AArch64::ST1i64_POST:
4584 case AArch64::ST1i8_POST:
4585 case AArch64::ST2GPostIndex:
4586 case AArch64::ST2Twov16b_POST:
4587 case AArch64::ST2Twov2d_POST:
4588 case AArch64::ST2Twov2s_POST:
4589 case AArch64::ST2Twov4h_POST:
4590 case AArch64::ST2Twov4s_POST:
4591 case AArch64::ST2Twov8b_POST:
4592 case AArch64::ST2Twov8h_POST:
4593 case AArch64::ST2i16_POST:
4594 case AArch64::ST2i32_POST:
4595 case AArch64::ST2i64_POST:
4596 case AArch64::ST2i8_POST:
4597 case AArch64::ST3Threev16b_POST:
4598 case AArch64::ST3Threev2d_POST:
4599 case AArch64::ST3Threev2s_POST:
4600 case AArch64::ST3Threev4h_POST:
4601 case AArch64::ST3Threev4s_POST:
4602 case AArch64::ST3Threev8b_POST:
4603 case AArch64::ST3Threev8h_POST:
4604 case AArch64::ST3i16_POST:
4605 case AArch64::ST3i32_POST:
4606 case AArch64::ST3i64_POST:
4607 case AArch64::ST3i8_POST:
4608 case AArch64::ST4Fourv16b_POST:
4609 case AArch64::ST4Fourv2d_POST:
4610 case AArch64::ST4Fourv2s_POST:
4611 case AArch64::ST4Fourv4h_POST:
4612 case AArch64::ST4Fourv4s_POST:
4613 case AArch64::ST4Fourv8b_POST:
4614 case AArch64::ST4Fourv8h_POST:
4615 case AArch64::ST4i16_POST:
4616 case AArch64::ST4i32_POST:
4617 case AArch64::ST4i64_POST:
4618 case AArch64::ST4i8_POST:
4619 case AArch64::STGPostIndex:
4620 case AArch64::STGPpost:
4621 case AArch64::STPDpost:
4622 case AArch64::STPQpost:
4623 case AArch64::STPSpost:
4624 case AArch64::STPWpost:
4625 case AArch64::STPXpost:
4626 case AArch64::STRBBpost:
4627 case AArch64::STRBpost:
4628 case AArch64::STRDpost:
4629 case AArch64::STRHHpost:
4630 case AArch64::STRHpost:
4631 case AArch64::STRQpost:
4632 case AArch64::STRSpost:
4633 case AArch64::STRWpost:
4634 case AArch64::STRXpost:
4635 case AArch64::STZ2GPostIndex:
4636 case AArch64::STZGPostIndex:
4643 bool &OffsetIsScalable,
TypeSize &Width,
4664 int64_t Dummy1, Dummy2;
4686 return BaseOp->
isReg() || BaseOp->
isFI();
4693 assert(OfsOp.
isImm() &&
"Offset operand wasn't immediate.");
4698 TypeSize &Width, int64_t &MinOffset,
4699 int64_t &MaxOffset) {
4704 MinOffset = MaxOffset = 0;
4707 case AArch64::LDRQui:
4708 case AArch64::STRQui:
4713 case AArch64::LDRXui:
4714 case AArch64::LDRDui:
4715 case AArch64::STRXui:
4716 case AArch64::STRDui:
4717 case AArch64::PRFMui:
4722 case AArch64::LDRWui:
4723 case AArch64::LDRSui:
4724 case AArch64::LDRSWui:
4725 case AArch64::STRWui:
4726 case AArch64::STRSui:
4731 case AArch64::LDRHui:
4732 case AArch64::LDRHHui:
4733 case AArch64::LDRSHWui:
4734 case AArch64::LDRSHXui:
4735 case AArch64::STRHui:
4736 case AArch64::STRHHui:
4741 case AArch64::LDRBui:
4742 case AArch64::LDRBBui:
4743 case AArch64::LDRSBWui:
4744 case AArch64::LDRSBXui:
4745 case AArch64::STRBui:
4746 case AArch64::STRBBui:
4752 case AArch64::STRQpre:
4753 case AArch64::LDRQpost:
4759 case AArch64::LDRDpost:
4760 case AArch64::LDRDpre:
4761 case AArch64::LDRXpost:
4762 case AArch64::LDRXpre:
4763 case AArch64::STRDpost:
4764 case AArch64::STRDpre:
4765 case AArch64::STRXpost:
4766 case AArch64::STRXpre:
4772 case AArch64::STRWpost:
4773 case AArch64::STRWpre:
4774 case AArch64::LDRWpost:
4775 case AArch64::LDRWpre:
4776 case AArch64::STRSpost:
4777 case AArch64::STRSpre:
4778 case AArch64::LDRSpost:
4779 case AArch64::LDRSpre:
4785 case AArch64::LDRHpost:
4786 case AArch64::LDRHpre:
4787 case AArch64::STRHpost:
4788 case AArch64::STRHpre:
4789 case AArch64::LDRHHpost:
4790 case AArch64::LDRHHpre:
4791 case AArch64::STRHHpost:
4792 case AArch64::STRHHpre:
4798 case AArch64::LDRBpost:
4799 case AArch64::LDRBpre:
4800 case AArch64::STRBpost:
4801 case AArch64::STRBpre:
4802 case AArch64::LDRBBpost:
4803 case AArch64::LDRBBpre:
4804 case AArch64::STRBBpost:
4805 case AArch64::STRBBpre:
4811 case AArch64::LDURQi:
4812 case AArch64::STURQi:
4818 case AArch64::LDURXi:
4819 case AArch64::LDURDi:
4820 case AArch64::LDAPURXi:
4821 case AArch64::STURXi:
4822 case AArch64::STURDi:
4823 case AArch64::STLURXi:
4824 case AArch64::PRFUMi:
4830 case AArch64::LDURWi:
4831 case AArch64::LDURSi:
4832 case AArch64::LDURSWi:
4833 case AArch64::LDAPURi:
4834 case AArch64::LDAPURSWi:
4835 case AArch64::STURWi:
4836 case AArch64::STURSi:
4837 case AArch64::STLURWi:
4843 case AArch64::LDURHi:
4844 case AArch64::LDURHHi:
4845 case AArch64::LDURSHXi:
4846 case AArch64::LDURSHWi:
4847 case AArch64::LDAPURHi:
4848 case AArch64::LDAPURSHWi:
4849 case AArch64::LDAPURSHXi:
4850 case AArch64::STURHi:
4851 case AArch64::STURHHi:
4852 case AArch64::STLURHi:
4858 case AArch64::LDURBi:
4859 case AArch64::LDURBBi:
4860 case AArch64::LDURSBXi:
4861 case AArch64::LDURSBWi:
4862 case AArch64::LDAPURBi:
4863 case AArch64::LDAPURSBWi:
4864 case AArch64::LDAPURSBXi:
4865 case AArch64::STURBi:
4866 case AArch64::STURBBi:
4867 case AArch64::STLURBi:
4873 case AArch64::LDPQi:
4874 case AArch64::LDNPQi:
4875 case AArch64::STPQi:
4876 case AArch64::STNPQi:
4877 case AArch64::LDPQpost:
4878 case AArch64::LDPQpre:
4879 case AArch64::STPQpost:
4880 case AArch64::STPQpre:
4886 case AArch64::LDPXi:
4887 case AArch64::LDPDi:
4888 case AArch64::LDNPXi:
4889 case AArch64::LDNPDi:
4890 case AArch64::STPXi:
4891 case AArch64::STPDi:
4892 case AArch64::STNPXi:
4893 case AArch64::STNPDi:
4894 case AArch64::LDPDpost:
4895 case AArch64::LDPDpre:
4896 case AArch64::LDPXpost:
4897 case AArch64::LDPXpre:
4898 case AArch64::STPDpost:
4899 case AArch64::STPDpre:
4900 case AArch64::STPXpost:
4901 case AArch64::STPXpre:
4907 case AArch64::LDPWi:
4908 case AArch64::LDPSi:
4909 case AArch64::LDNPWi:
4910 case AArch64::LDNPSi:
4911 case AArch64::STPWi:
4912 case AArch64::STPSi:
4913 case AArch64::STNPWi:
4914 case AArch64::STNPSi:
4915 case AArch64::LDPSpost:
4916 case AArch64::LDPSpre:
4917 case AArch64::LDPWpost:
4918 case AArch64::LDPWpre:
4919 case AArch64::STPSpost:
4920 case AArch64::STPSpre:
4921 case AArch64::STPWpost:
4922 case AArch64::STPWpre:
4928 case AArch64::StoreSwiftAsyncContext:
4941 case AArch64::TAGPstack:
4951 case AArch64::STGPreIndex:
4952 case AArch64::STGPostIndex:
4953 case AArch64::STZGi:
4954 case AArch64::STZGPreIndex:
4955 case AArch64::STZGPostIndex:
4961 case AArch64::STR_ZZZZXI:
4962 case AArch64::STR_ZZZZXI_STRIDED_CONTIGUOUS:
4963 case AArch64::LDR_ZZZZXI:
4964 case AArch64::LDR_ZZZZXI_STRIDED_CONTIGUOUS:
4970 case AArch64::STR_ZZZXI:
4971 case AArch64::LDR_ZZZXI:
4977 case AArch64::STR_ZZXI:
4978 case AArch64::STR_ZZXI_STRIDED_CONTIGUOUS:
4979 case AArch64::LDR_ZZXI:
4980 case AArch64::LDR_ZZXI_STRIDED_CONTIGUOUS:
4986 case AArch64::LDR_PXI:
4987 case AArch64::STR_PXI:
4992 case AArch64::LDR_PPXI:
4993 case AArch64::STR_PPXI:
4999 case AArch64::LDR_ZXI:
5000 case AArch64::STR_ZXI:
5005 case AArch64::LD1B_IMM:
5006 case AArch64::LD1H_IMM:
5007 case AArch64::LD1W_IMM:
5008 case AArch64::LD1D_IMM:
5009 case AArch64::LDNT1B_ZRI:
5010 case AArch64::LDNT1H_ZRI:
5011 case AArch64::LDNT1W_ZRI:
5012 case AArch64::LDNT1D_ZRI:
5013 case AArch64::ST1B_IMM:
5014 case AArch64::ST1H_IMM:
5015 case AArch64::ST1W_IMM:
5016 case AArch64::ST1D_IMM:
5017 case AArch64::STNT1B_ZRI:
5018 case AArch64::STNT1H_ZRI:
5019 case AArch64::STNT1W_ZRI:
5020 case AArch64::STNT1D_ZRI:
5021 case AArch64::LDNF1B_IMM:
5022 case AArch64::LDNF1H_IMM:
5023 case AArch64::LDNF1W_IMM:
5024 case AArch64::LDNF1D_IMM:
5031 case AArch64::LD2B_IMM:
5032 case AArch64::LD2H_IMM:
5033 case AArch64::LD2W_IMM:
5034 case AArch64::LD2D_IMM:
5035 case AArch64::ST2B_IMM:
5036 case AArch64::ST2H_IMM:
5037 case AArch64::ST2W_IMM:
5038 case AArch64::ST2D_IMM:
5039 case AArch64::LD1B_2Z_IMM:
5040 case AArch64::LD1B_2Z_STRIDED_IMM:
5041 case AArch64::LD1H_2Z_IMM:
5042 case AArch64::LD1H_2Z_STRIDED_IMM:
5043 case AArch64::LD1W_2Z_IMM:
5044 case AArch64::LD1W_2Z_STRIDED_IMM:
5045 case AArch64::LD1D_2Z_IMM:
5046 case AArch64::LD1D_2Z_STRIDED_IMM:
5047 case AArch64::LD1B_2Z_IMM_PSEUDO:
5048 case AArch64::LD1H_2Z_IMM_PSEUDO:
5049 case AArch64::LD1W_2Z_IMM_PSEUDO:
5050 case AArch64::LD1D_2Z_IMM_PSEUDO:
5051 case AArch64::ST1B_2Z_IMM:
5052 case AArch64::ST1B_2Z_STRIDED_IMM:
5053 case AArch64::ST1H_2Z_IMM:
5054 case AArch64::ST1H_2Z_STRIDED_IMM:
5055 case AArch64::ST1W_2Z_IMM:
5056 case AArch64::ST1W_2Z_STRIDED_IMM:
5057 case AArch64::ST1D_2Z_IMM:
5058 case AArch64::ST1D_2Z_STRIDED_IMM:
5059 case AArch64::LDNT1B_2Z_IMM_PSEUDO:
5060 case AArch64::LDNT1B_2Z_IMM:
5061 case AArch64::LDNT1B_2Z_STRIDED_IMM:
5062 case AArch64::LDNT1H_2Z_IMM_PSEUDO:
5063 case AArch64::LDNT1H_2Z_IMM:
5064 case AArch64::LDNT1H_2Z_STRIDED_IMM:
5065 case AArch64::LDNT1W_2Z_IMM_PSEUDO:
5066 case AArch64::LDNT1W_2Z_IMM:
5067 case AArch64::LDNT1W_2Z_STRIDED_IMM:
5068 case AArch64::LDNT1D_2Z_IMM_PSEUDO:
5069 case AArch64::LDNT1D_2Z_IMM:
5070 case AArch64::LDNT1D_2Z_STRIDED_IMM:
5071 case AArch64::STNT1B_2Z_IMM:
5072 case AArch64::STNT1B_2Z_STRIDED_IMM:
5073 case AArch64::STNT1H_2Z_IMM:
5074 case AArch64::STNT1H_2Z_STRIDED_IMM:
5075 case AArch64::STNT1W_2Z_IMM:
5076 case AArch64::STNT1W_2Z_STRIDED_IMM:
5077 case AArch64::STNT1D_2Z_IMM:
5078 case AArch64::STNT1D_2Z_STRIDED_IMM:
5079 case AArch64::ST1B_2Z_IMM_PSEUDO:
5080 case AArch64::ST1H_2Z_IMM_PSEUDO:
5081 case AArch64::ST1W_2Z_IMM_PSEUDO:
5082 case AArch64::ST1D_2Z_IMM_PSEUDO:
5083 case AArch64::STNT1B_2Z_IMM_PSEUDO:
5084 case AArch64::STNT1H_2Z_IMM_PSEUDO:
5085 case AArch64::STNT1W_2Z_IMM_PSEUDO:
5086 case AArch64::STNT1D_2Z_IMM_PSEUDO:
5091 case AArch64::LD3B_IMM:
5092 case AArch64::LD3H_IMM:
5093 case AArch64::LD3W_IMM:
5094 case AArch64::LD3D_IMM:
5095 case AArch64::ST3B_IMM:
5096 case AArch64::ST3H_IMM:
5097 case AArch64::ST3W_IMM:
5098 case AArch64::ST3D_IMM:
5103 case AArch64::LD4B_IMM:
5104 case AArch64::LD4H_IMM:
5105 case AArch64::LD4W_IMM:
5106 case AArch64::LD4D_IMM:
5107 case AArch64::ST4B_IMM:
5108 case AArch64::ST4H_IMM:
5109 case AArch64::ST4W_IMM:
5110 case AArch64::ST4D_IMM:
5111 case AArch64::LD1B_4Z_IMM:
5112 case AArch64::LD1B_4Z_STRIDED_IMM:
5113 case AArch64::LD1H_4Z_IMM:
5114 case AArch64::LD1H_4Z_STRIDED_IMM:
5115 case AArch64::LD1W_4Z_IMM:
5116 case AArch64::LD1W_4Z_STRIDED_IMM:
5117 case AArch64::LD1D_4Z_IMM:
5118 case AArch64::LD1D_4Z_STRIDED_IMM:
5119 case AArch64::LD1B_4Z_IMM_PSEUDO:
5120 case AArch64::LD1H_4Z_IMM_PSEUDO:
5121 case AArch64::LD1W_4Z_IMM_PSEUDO:
5122 case AArch64::LD1D_4Z_IMM_PSEUDO:
5123 case AArch64::ST1B_4Z_IMM:
5124 case AArch64::ST1B_4Z_STRIDED_IMM:
5125 case AArch64::ST1H_4Z_IMM:
5126 case AArch64::ST1H_4Z_STRIDED_IMM:
5127 case AArch64::ST1W_4Z_IMM:
5128 case AArch64::ST1W_4Z_STRIDED_IMM:
5129 case AArch64::ST1D_4Z_IMM:
5130 case AArch64::ST1D_4Z_STRIDED_IMM:
5131 case AArch64::LDNT1B_4Z_IMM_PSEUDO:
5132 case AArch64::LDNT1B_4Z_IMM:
5133 case AArch64::LDNT1B_4Z_STRIDED_IMM:
5134 case AArch64::LDNT1H_4Z_IMM_PSEUDO:
5135 case AArch64::LDNT1H_4Z_IMM:
5136 case AArch64::LDNT1H_4Z_STRIDED_IMM:
5137 case AArch64::LDNT1W_4Z_IMM_PSEUDO:
5138 case AArch64::LDNT1W_4Z_IMM:
5139 case AArch64::LDNT1W_4Z_STRIDED_IMM:
5140 case AArch64::LDNT1D_4Z_IMM_PSEUDO:
5141 case AArch64::LDNT1D_4Z_IMM:
5142 case AArch64::LDNT1D_4Z_STRIDED_IMM:
5143 case AArch64::STNT1B_4Z_IMM:
5144 case AArch64::STNT1B_4Z_STRIDED_IMM:
5145 case AArch64::STNT1H_4Z_IMM:
5146 case AArch64::STNT1H_4Z_STRIDED_IMM:
5147 case AArch64::STNT1W_4Z_IMM:
5148 case AArch64::STNT1W_4Z_STRIDED_IMM:
5149 case AArch64::STNT1D_4Z_IMM:
5150 case AArch64::STNT1D_4Z_STRIDED_IMM:
5151 case AArch64::ST1B_4Z_IMM_PSEUDO:
5152 case AArch64::ST1H_4Z_IMM_PSEUDO:
5153 case AArch64::ST1W_4Z_IMM_PSEUDO:
5154 case AArch64::ST1D_4Z_IMM_PSEUDO:
5155 case AArch64::STNT1B_4Z_IMM_PSEUDO:
5156 case AArch64::STNT1H_4Z_IMM_PSEUDO:
5157 case AArch64::STNT1W_4Z_IMM_PSEUDO:
5158 case AArch64::STNT1D_4Z_IMM_PSEUDO:
5163 case AArch64::LD1B_H_IMM:
5164 case AArch64::LD1SB_H_IMM:
5165 case AArch64::LD1H_S_IMM:
5166 case AArch64::LD1SH_S_IMM:
5167 case AArch64::LD1W_D_IMM:
5168 case AArch64::LD1SW_D_IMM:
5169 case AArch64::ST1B_H_IMM:
5170 case AArch64::ST1H_S_IMM:
5171 case AArch64::ST1W_D_IMM:
5172 case AArch64::LDNF1B_H_IMM:
5173 case AArch64::LDNF1SB_H_IMM:
5174 case AArch64::LDNF1H_S_IMM:
5175 case AArch64::LDNF1SH_S_IMM:
5176 case AArch64::LDNF1W_D_IMM:
5177 case AArch64::LDNF1SW_D_IMM:
5184 case AArch64::LD1B_S_IMM:
5185 case AArch64::LD1SB_S_IMM:
5186 case AArch64::LD1H_D_IMM:
5187 case AArch64::LD1SH_D_IMM:
5188 case AArch64::ST1B_S_IMM:
5189 case AArch64::ST1H_D_IMM:
5190 case AArch64::LDNF1B_S_IMM:
5191 case AArch64::LDNF1SB_S_IMM:
5192 case AArch64::LDNF1H_D_IMM:
5193 case AArch64::LDNF1SH_D_IMM:
5200 case AArch64::LD1B_D_IMM:
5201 case AArch64::LD1SB_D_IMM:
5202 case AArch64::ST1B_D_IMM:
5203 case AArch64::LDNF1B_D_IMM:
5204 case AArch64::LDNF1SB_D_IMM:
5211 case AArch64::ST2Gi:
5212 case AArch64::ST2GPreIndex:
5213 case AArch64::ST2GPostIndex:
5214 case AArch64::STZ2Gi:
5215 case AArch64::STZ2GPreIndex:
5216 case AArch64::STZ2GPostIndex:
5222 case AArch64::STGPi:
5223 case AArch64::STGPpost:
5224 case AArch64::STGPpre:
5229 case AArch64::LD1RB_IMM:
5230 case AArch64::LD1RB_H_IMM:
5231 case AArch64::LD1RB_S_IMM:
5232 case AArch64::LD1RB_D_IMM:
5233 case AArch64::LD1RSB_H_IMM:
5234 case AArch64::LD1RSB_S_IMM:
5235 case AArch64::LD1RSB_D_IMM:
5240 case AArch64::LD1RH_IMM:
5241 case AArch64::LD1RH_S_IMM:
5242 case AArch64::LD1RH_D_IMM:
5243 case AArch64::LD1RSH_S_IMM:
5244 case AArch64::LD1RSH_D_IMM:
5249 case AArch64::LD1RW_IMM:
5250 case AArch64::LD1RW_D_IMM:
5251 case AArch64::LD1RSW_IMM:
5256 case AArch64::LD1RD_IMM:
5271 case AArch64::LDRBui:
5272 case AArch64::LDRBBui:
5273 case AArch64::LDURBBi:
5274 case AArch64::LDRSBWui:
5275 case AArch64::LDURSBWi:
5276 case AArch64::STRBui:
5277 case AArch64::STRBBui:
5278 case AArch64::STURBBi:
5280 case AArch64::LDRHui:
5281 case AArch64::LDRHHui:
5282 case AArch64::LDURHHi:
5283 case AArch64::LDRSHWui:
5284 case AArch64::LDURSHWi:
5285 case AArch64::STRHui:
5286 case AArch64::STRHHui:
5287 case AArch64::STURHHi:
5289 case AArch64::LDRSui:
5290 case AArch64::LDURSi:
5291 case AArch64::LDRSpre:
5292 case AArch64::LDRSWui:
5293 case AArch64::LDURSWi:
5294 case AArch64::LDRSWpre:
5295 case AArch64::LDRWpre:
5296 case AArch64::LDRWui:
5297 case AArch64::LDURWi:
5298 case AArch64::STRSui:
5299 case AArch64::STURSi:
5300 case AArch64::STRSpre:
5301 case AArch64::STRWui:
5302 case AArch64::STURWi:
5303 case AArch64::STRWpre:
5304 case AArch64::LDPSi:
5305 case AArch64::LDPSWi:
5306 case AArch64::LDPWi:
5307 case AArch64::STPSi:
5308 case AArch64::STPWi:
5310 case AArch64::LDRDui:
5311 case AArch64::LDURDi:
5312 case AArch64::LDRDpre:
5313 case AArch64::LDRXui:
5314 case AArch64::LDURXi:
5315 case AArch64::LDRXpre:
5316 case AArch64::STRDui:
5317 case AArch64::STURDi:
5318 case AArch64::STRDpre:
5319 case AArch64::STRXui:
5320 case AArch64::STURXi:
5321 case AArch64::STRXpre:
5322 case AArch64::LDPDi:
5323 case AArch64::LDPXi:
5324 case AArch64::STPDi:
5325 case AArch64::STPXi:
5327 case AArch64::LDRQui:
5328 case AArch64::LDURQi:
5329 case AArch64::STRQui:
5330 case AArch64::STURQi:
5331 case AArch64::STRQpre:
5332 case AArch64::LDPQi:
5333 case AArch64::LDRQpre:
5334 case AArch64::STPQi:
5336 case AArch64::STZGi:
5337 case AArch64::ST2Gi:
5338 case AArch64::STZ2Gi:
5339 case AArch64::STGPi:
5345 switch (
MI.getOpcode()) {
5348 case AArch64::LDRWpre:
5349 case AArch64::LDRXpre:
5350 case AArch64::LDRSWpre:
5351 case AArch64::LDRSpre:
5352 case AArch64::LDRDpre:
5353 case AArch64::LDRQpre:
5359 switch (
MI.getOpcode()) {
5362 case AArch64::STRWpre:
5363 case AArch64::STRXpre:
5364 case AArch64::STRSpre:
5365 case AArch64::STRDpre:
5366 case AArch64::STRQpre:
5376 switch (
MI.getOpcode()) {
5379 case AArch64::LDURBBi:
5380 case AArch64::LDURHHi:
5381 case AArch64::LDURWi:
5382 case AArch64::LDRBBui:
5383 case AArch64::LDRHHui:
5384 case AArch64::LDRWui:
5385 case AArch64::LDRBBroX:
5386 case AArch64::LDRHHroX:
5387 case AArch64::LDRWroX:
5388 case AArch64::LDRBBroW:
5389 case AArch64::LDRHHroW:
5390 case AArch64::LDRWroW:
5396 switch (
MI.getOpcode()) {
5399 case AArch64::LDURSBWi:
5400 case AArch64::LDURSHWi:
5401 case AArch64::LDURSBXi:
5402 case AArch64::LDURSHXi:
5403 case AArch64::LDURSWi:
5404 case AArch64::LDRSBWui:
5405 case AArch64::LDRSHWui:
5406 case AArch64::LDRSBXui:
5407 case AArch64::LDRSHXui:
5408 case AArch64::LDRSWui:
5409 case AArch64::LDRSBWroX:
5410 case AArch64::LDRSHWroX:
5411 case AArch64::LDRSBXroX:
5412 case AArch64::LDRSHXroX:
5413 case AArch64::LDRSWroX:
5414 case AArch64::LDRSBWroW:
5415 case AArch64::LDRSHWroW:
5416 case AArch64::LDRSBXroW:
5417 case AArch64::LDRSHXroW:
5418 case AArch64::LDRSWroW:
5424 switch (
MI.getOpcode()) {
5427 case AArch64::LDPSi:
5428 case AArch64::LDPSWi:
5429 case AArch64::LDPDi:
5430 case AArch64::LDPQi:
5431 case AArch64::LDPWi:
5432 case AArch64::LDPXi:
5433 case AArch64::STPSi:
5434 case AArch64::STPDi:
5435 case AArch64::STPQi:
5436 case AArch64::STPWi:
5437 case AArch64::STPXi:
5438 case AArch64::STGPi:
5444 assert(
MI.mayLoadOrStore() &&
"Load or store instruction expected");
5448 return MI.getOperand(Idx);
5453 assert(
MI.mayLoadOrStore() &&
"Load or store instruction expected");
5457 return MI.getOperand(Idx);
5462 switch (
MI.getOpcode()) {
5465 case AArch64::LDRBroX:
5466 case AArch64::LDRBBroX:
5467 case AArch64::LDRSBXroX:
5468 case AArch64::LDRSBWroX:
5469 case AArch64::LDRHroX:
5470 case AArch64::LDRHHroX:
5471 case AArch64::LDRSHXroX:
5472 case AArch64::LDRSHWroX:
5473 case AArch64::LDRWroX:
5474 case AArch64::LDRSroX:
5475 case AArch64::LDRSWroX:
5476 case AArch64::LDRDroX:
5477 case AArch64::LDRXroX:
5478 case AArch64::LDRQroX:
5479 return MI.getOperand(4);
5485 if (
MI.getParent() ==
nullptr)
5495 auto Reg =
Op.getReg();
5496 if (Reg.isPhysical())
5497 return AArch64::FPR16RegClass.contains(Reg);
5499 return TRC == &AArch64::FPR16RegClass ||
5500 TRC == &AArch64::FPR16_loRegClass;
5509 auto Reg =
Op.getReg();
5510 if (Reg.isPhysical())
5511 return AArch64::FPR128RegClass.contains(Reg);
5513 return TRC == &AArch64::FPR128RegClass ||
5514 TRC == &AArch64::FPR128_loRegClass;
5520 switch (
MI.getOpcode()) {
5523 case AArch64::PACIASP:
5524 case AArch64::PACIBSP:
5527 case AArch64::PAUTH_PROLOGUE:
5530 case AArch64::HINT: {
5531 unsigned Imm =
MI.getOperand(0).getImm();
5536 if (
Imm == 25 ||
Imm == 27)
5548 assert(Reg.isPhysical() &&
"Expected physical register in isFpOrNEON");
5549 return AArch64::FPR128RegClass.contains(Reg) ||
5550 AArch64::FPR64RegClass.contains(Reg) ||
5551 AArch64::FPR32RegClass.contains(Reg) ||
5552 AArch64::FPR16RegClass.contains(Reg) ||
5553 AArch64::FPR8RegClass.contains(Reg);
5560 auto Reg =
Op.getReg();
5561 if (Reg.isPhysical())
5565 return TRC == &AArch64::FPR128RegClass ||
5566 TRC == &AArch64::FPR128_loRegClass ||
5567 TRC == &AArch64::FPR64RegClass ||
5568 TRC == &AArch64::FPR64_loRegClass ||
5569 TRC == &AArch64::FPR32RegClass || TRC == &AArch64::FPR16RegClass ||
5570 TRC == &AArch64::FPR8RegClass;
5592 if (FirstOpc == SecondOpc)
5598 case AArch64::STRSui:
5599 case AArch64::STURSi:
5600 return SecondOpc == AArch64::STRSui || SecondOpc == AArch64::STURSi;
5601 case AArch64::STRDui:
5602 case AArch64::STURDi:
5603 return SecondOpc == AArch64::STRDui || SecondOpc == AArch64::STURDi;
5604 case AArch64::STRQui:
5605 case AArch64::STURQi:
5606 return SecondOpc == AArch64::STRQui || SecondOpc == AArch64::STURQi;
5607 case AArch64::STRWui:
5608 case AArch64::STURWi:
5609 return SecondOpc == AArch64::STRWui || SecondOpc == AArch64::STURWi;
5610 case AArch64::STRXui:
5611 case AArch64::STURXi:
5612 return SecondOpc == AArch64::STRXui || SecondOpc == AArch64::STURXi;
5613 case AArch64::LDRSui:
5614 case AArch64::LDURSi:
5615 return SecondOpc == AArch64::LDRSui || SecondOpc == AArch64::LDURSi;
5616 case AArch64::LDRDui:
5617 case AArch64::LDURDi:
5618 return SecondOpc == AArch64::LDRDui || SecondOpc == AArch64::LDURDi;
5619 case AArch64::LDRQui:
5620 case AArch64::LDURQi:
5621 return SecondOpc == AArch64::LDRQui || SecondOpc == AArch64::LDURQi;
5622 case AArch64::LDRWui:
5623 case AArch64::LDURWi:
5624 return SecondOpc == AArch64::LDRSWui || SecondOpc == AArch64::LDURSWi;
5625 case AArch64::LDRSWui:
5626 case AArch64::LDURSWi:
5627 return SecondOpc == AArch64::LDRWui || SecondOpc == AArch64::LDURWi;
5628 case AArch64::LDRXui:
5629 case AArch64::LDURXi:
5630 return SecondOpc == AArch64::LDRXui || SecondOpc == AArch64::LDURXi;
5637 int64_t Offset1,
unsigned Opcode1,
int FI2,
5638 int64_t Offset2,
unsigned Opcode2) {
5644 assert(ObjectOffset1 <= ObjectOffset2 &&
"Object offsets are not ordered.");
5647 if (ObjectOffset1 % Scale1 != 0)
5649 ObjectOffset1 /= Scale1;
5651 if (ObjectOffset2 % Scale2 != 0)
5653 ObjectOffset2 /= Scale2;
5654 ObjectOffset1 += Offset1;
5655 ObjectOffset2 += Offset2;
5656 return ObjectOffset1 + 1 == ObjectOffset2;
5668 int64_t OpOffset2,
bool OffsetIsScalable2,
unsigned ClusterSize,
5669 unsigned NumBytes)
const {
5679 "Only base registers and frame indices are supported.");
5686 if (ClusterSize > 2)
5693 unsigned FirstOpc = FirstLdSt.
getOpcode();
5694 unsigned SecondOpc = SecondLdSt.
getOpcode();
5714 if (Offset1 > 63 || Offset1 < -64)
5719 if (BaseOp1.
isFI()) {
5721 "Caller should have ordered offsets.");
5726 BaseOp2.
getIndex(), Offset2, SecondOpc);
5729 assert(Offset1 <= Offset2 &&
"Caller should have ordered offsets.");
5731 return Offset1 + 1 == Offset2;
5741 if (
Reg.isPhysical())
5751 assert(Subtarget.hasNEON() &&
"Unexpected register copy without NEON");
5753 uint16_t DestEncoding =
TRI->getEncodingValue(DestReg);
5754 uint16_t SrcEncoding =
TRI->getEncodingValue(SrcReg);
5755 unsigned NumRegs = Indices.
size();
5756 MCRegister DestSubReg =
TRI->getSubReg(DestReg, Indices[0]);
5758 "Unexpected predicate tuple copy");
5759 unsigned MaxRegs = AArch64::PPRRegClass.contains(DestSubReg) ? 15 : 31;
5761 int SubReg = 0, End = NumRegs, Incr = 1;
5763 if (((DestEncoding - SrcEncoding) & MaxRegs) < NumRegs) {
5764 SubReg = NumRegs - 1;
5769 for (; SubReg != End; SubReg += Incr) {
5770 DestSubReg =
TRI->getSubReg(DestReg, Indices[SubReg]);
5771 MCRegister SrcSubReg =
TRI->getSubReg(SrcReg, Indices[SubReg]);
5780 unsigned Opcode,
unsigned ZeroReg,
5783 unsigned NumRegs = Indices.
size();
5786 uint16_t DestEncoding =
TRI->getEncodingValue(DestReg);
5787 uint16_t SrcEncoding =
TRI->getEncodingValue(SrcReg);
5788 assert(DestEncoding % NumRegs == 0 && SrcEncoding % NumRegs == 0 &&
5789 "GPR reg sequences should not be able to overlap");
5792 for (
unsigned SubReg = 0; SubReg != NumRegs; ++SubReg) {
5813 unsigned Opc =
MI.getOpcode();
5814 if (
Opc == AArch64::MSRpstatesvcrImm1 ||
Opc == AArch64::MSRpstatePseudo) {
5816 int64_t PState =
MI.getOperand(0).getImm();
5817 if (PState == AArch64SVCR::SVCRSM || PState == AArch64SVCR::SVCRSMZA) {
5819 return MI.getOperand(1).getImm() == 1;
5838 bool RenamableSrc)
const {
5839 if (AArch64::GPR32spRegClass.
contains(DestReg) &&
5840 AArch64::GPR32spRegClass.
contains(SrcReg)) {
5841 if (DestReg == AArch64::WSP || SrcReg == AArch64::WSP) {
5843 if (Subtarget.hasZeroCycleRegMoveGPR64() &&
5844 !Subtarget.hasZeroCycleRegMoveGPR32()) {
5846 MCRegister DestRegX = RI.getMatchingSuperReg(DestReg, AArch64::sub_32,
5847 &AArch64::GPR64spRegClass);
5848 MCRegister SrcRegX = RI.getMatchingSuperReg(SrcReg, AArch64::sub_32,
5849 &AArch64::GPR64spRegClass);
5859 ++NumZCRegMoveInstrsGPR;
5865 if (Subtarget.hasZeroCycleRegMoveGPR32())
5866 ++NumZCRegMoveInstrsGPR;
5868 }
else if (Subtarget.hasZeroCycleRegMoveGPR64() &&
5869 !Subtarget.hasZeroCycleRegMoveGPR32()) {
5871 MCRegister DestRegX = RI.getMatchingSuperReg(DestReg, AArch64::sub_32,
5872 &AArch64::GPR64spRegClass);
5873 assert(DestRegX.
isValid() &&
"Destination super-reg not valid");
5874 MCRegister SrcRegX = RI.getMatchingSuperReg(SrcReg, AArch64::sub_32,
5875 &AArch64::GPR64spRegClass);
5885 ++NumZCRegMoveInstrsGPR;
5891 if (Subtarget.hasZeroCycleRegMoveGPR32())
5892 ++NumZCRegMoveInstrsGPR;
5898 if (AArch64::GPR32spRegClass.
contains(DestReg) && SrcReg == AArch64::WZR) {
5899 if (Subtarget.hasZeroCycleZeroingGPR64() &&
5900 !Subtarget.hasZeroCycleZeroingGPR32()) {
5901 MCRegister DestRegX = RI.getMatchingSuperReg(DestReg, AArch64::sub_32,
5902 &AArch64::GPR64spRegClass);
5903 assert(DestRegX.
isValid() &&
"Destination super-reg not valid");
5907 ++NumZCZeroingInstrsGPR;
5908 }
else if (Subtarget.hasZeroCycleZeroingGPR32()) {
5912 ++NumZCZeroingInstrsGPR;
5921 if (AArch64::GPR64spRegClass.
contains(DestReg) &&
5922 AArch64::GPR64spRegClass.
contains(SrcReg)) {
5923 if (DestReg == AArch64::SP || SrcReg == AArch64::SP) {
5929 if (Subtarget.hasZeroCycleRegMoveGPR64())
5930 ++NumZCRegMoveInstrsGPR;
5936 if (Subtarget.hasZeroCycleRegMoveGPR64())
5937 ++NumZCRegMoveInstrsGPR;
5943 if (AArch64::GPR64spRegClass.
contains(DestReg) && SrcReg == AArch64::XZR) {
5944 if (Subtarget.hasZeroCycleZeroingGPR64()) {
5948 ++NumZCZeroingInstrsGPR;
5958 if (AArch64::PPRRegClass.
contains(DestReg) &&
5959 AArch64::PPRRegClass.
contains(SrcReg)) {
5960 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
5961 "Unexpected SVE register.");
5971 bool DestIsPNR = AArch64::PNRRegClass.contains(DestReg);
5972 bool SrcIsPNR = AArch64::PNRRegClass.contains(SrcReg);
5973 if (DestIsPNR || SrcIsPNR) {
5975 return (R - AArch64::PN0) + AArch64::P0;
5980 if (PPRSrcReg != PPRDestReg) {
5992 if (AArch64::PPR2RegClass.
contains(DestReg) &&
5993 AArch64::PPR2RegClass.
contains(SrcReg)) {
5994 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
5995 "Unexpected SVE predicate register.");
5996 static const unsigned Indices[] = {AArch64::psub0, AArch64::psub1};
6002 if (AArch64::ZPRRegClass.
contains(DestReg) &&
6003 AArch64::ZPRRegClass.
contains(SrcReg)) {
6004 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6005 "Unexpected SVE register.");
6013 if ((AArch64::ZPR2RegClass.
contains(DestReg) ||
6014 AArch64::ZPR2StridedOrContiguousRegClass.
contains(DestReg)) &&
6015 (AArch64::ZPR2RegClass.
contains(SrcReg) ||
6016 AArch64::ZPR2StridedOrContiguousRegClass.
contains(SrcReg))) {
6017 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6018 "Unexpected SVE register.");
6019 static const unsigned Indices[] = {AArch64::zsub0, AArch64::zsub1};
6025 if (AArch64::ZPR3RegClass.
contains(DestReg) &&
6026 AArch64::ZPR3RegClass.
contains(SrcReg)) {
6027 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6028 "Unexpected SVE register.");
6029 static const unsigned Indices[] = {AArch64::zsub0, AArch64::zsub1,
6036 if ((AArch64::ZPR4RegClass.
contains(DestReg) ||
6037 AArch64::ZPR4StridedOrContiguousRegClass.
contains(DestReg)) &&
6038 (AArch64::ZPR4RegClass.
contains(SrcReg) ||
6039 AArch64::ZPR4StridedOrContiguousRegClass.
contains(SrcReg))) {
6040 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6041 "Unexpected SVE register.");
6042 static const unsigned Indices[] = {AArch64::zsub0, AArch64::zsub1,
6043 AArch64::zsub2, AArch64::zsub3};
6049 if (AArch64::DDDDRegClass.
contains(DestReg) &&
6050 AArch64::DDDDRegClass.
contains(SrcReg)) {
6051 static const unsigned Indices[] = {AArch64::dsub0, AArch64::dsub1,
6052 AArch64::dsub2, AArch64::dsub3};
6058 if (AArch64::DDDRegClass.
contains(DestReg) &&
6059 AArch64::DDDRegClass.
contains(SrcReg)) {
6060 static const unsigned Indices[] = {AArch64::dsub0, AArch64::dsub1,
6067 if (AArch64::DDRegClass.
contains(DestReg) &&
6068 AArch64::DDRegClass.
contains(SrcReg)) {
6069 static const unsigned Indices[] = {AArch64::dsub0, AArch64::dsub1};
6075 if (AArch64::QQQQRegClass.
contains(DestReg) &&
6076 AArch64::QQQQRegClass.
contains(SrcReg)) {
6077 static const unsigned Indices[] = {AArch64::qsub0, AArch64::qsub1,
6078 AArch64::qsub2, AArch64::qsub3};
6084 if (AArch64::QQQRegClass.
contains(DestReg) &&
6085 AArch64::QQQRegClass.
contains(SrcReg)) {
6086 static const unsigned Indices[] = {AArch64::qsub0, AArch64::qsub1,
6093 if (AArch64::QQRegClass.
contains(DestReg) &&
6094 AArch64::QQRegClass.
contains(SrcReg)) {
6095 static const unsigned Indices[] = {AArch64::qsub0, AArch64::qsub1};
6100 if (AArch64::XSeqPairsClassRegClass.
contains(DestReg) &&
6101 AArch64::XSeqPairsClassRegClass.
contains(SrcReg)) {
6102 static const unsigned Indices[] = {AArch64::sube64, AArch64::subo64};
6104 AArch64::XZR, Indices);
6108 if (AArch64::WSeqPairsClassRegClass.
contains(DestReg) &&
6109 AArch64::WSeqPairsClassRegClass.
contains(SrcReg)) {
6110 static const unsigned Indices[] = {AArch64::sube32, AArch64::subo32};
6112 AArch64::WZR, Indices);
6116 if (AArch64::FPR128RegClass.
contains(DestReg) &&
6117 AArch64::FPR128RegClass.
contains(SrcReg)) {
6121 if ((Subtarget.isSVEorStreamingSVEAvailable() &&
6122 !Subtarget.isNeonAvailable()) ||
6126 .
addReg(AArch64::Z0 + (SrcReg - AArch64::Q0))
6127 .
addReg(AArch64::Z0 + (SrcReg - AArch64::Q0));
6128 }
else if (Subtarget.isNeonAvailable()) {
6132 if (Subtarget.hasZeroCycleRegMoveFPR128())
6133 ++NumZCRegMoveInstrsFPR;
6149 if (AArch64::FPR64RegClass.
contains(DestReg) &&
6150 AArch64::FPR64RegClass.
contains(SrcReg)) {
6151 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6152 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6153 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6155 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::dsub,
6156 &AArch64::FPR128RegClass);
6157 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::dsub,
6158 &AArch64::FPR128RegClass);
6167 ++NumZCRegMoveInstrsFPR;
6171 if (Subtarget.hasZeroCycleRegMoveFPR64())
6172 ++NumZCRegMoveInstrsFPR;
6177 if (AArch64::FPR32RegClass.
contains(DestReg) &&
6178 AArch64::FPR32RegClass.
contains(SrcReg)) {
6179 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6180 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6181 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6183 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::ssub,
6184 &AArch64::FPR128RegClass);
6185 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::ssub,
6186 &AArch64::FPR128RegClass);
6195 ++NumZCRegMoveInstrsFPR;
6196 }
else if (Subtarget.hasZeroCycleRegMoveFPR64() &&
6197 !Subtarget.hasZeroCycleRegMoveFPR32()) {
6198 MCRegister DestRegD = RI.getMatchingSuperReg(DestReg, AArch64::ssub,
6199 &AArch64::FPR64RegClass);
6200 MCRegister SrcRegD = RI.getMatchingSuperReg(SrcReg, AArch64::ssub,
6201 &AArch64::FPR64RegClass);
6209 ++NumZCRegMoveInstrsFPR;
6213 if (Subtarget.hasZeroCycleRegMoveFPR32())
6214 ++NumZCRegMoveInstrsFPR;
6219 if (AArch64::FPR16RegClass.
contains(DestReg) &&
6220 AArch64::FPR16RegClass.
contains(SrcReg)) {
6221 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6222 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6223 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6225 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
6226 &AArch64::FPR128RegClass);
6227 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
6228 &AArch64::FPR128RegClass);
6237 }
else if (Subtarget.hasZeroCycleRegMoveFPR64() &&
6238 !Subtarget.hasZeroCycleRegMoveFPR32()) {
6239 MCRegister DestRegD = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
6240 &AArch64::FPR64RegClass);
6241 MCRegister SrcRegD = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
6242 &AArch64::FPR64RegClass);
6251 DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
6252 &AArch64::FPR32RegClass);
6253 SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
6254 &AArch64::FPR32RegClass);
6261 if (AArch64::FPR8RegClass.
contains(DestReg) &&
6262 AArch64::FPR8RegClass.
contains(SrcReg)) {
6263 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6264 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6265 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6267 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
6268 &AArch64::FPR128RegClass);
6269 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
6270 &AArch64::FPR128RegClass);
6279 }
else if (Subtarget.hasZeroCycleRegMoveFPR64() &&
6280 !Subtarget.hasZeroCycleRegMoveFPR32()) {
6281 MCRegister DestRegD = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
6282 &AArch64::FPR64RegClass);
6283 MCRegister SrcRegD = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
6284 &AArch64::FPR64RegClass);
6293 DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
6294 &AArch64::FPR32RegClass);
6295 SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
6296 &AArch64::FPR32RegClass);
6304 if (AArch64::FPR64RegClass.
contains(DestReg) &&
6305 AArch64::GPR64RegClass.
contains(SrcReg)) {
6306 if (AArch64::XZR == SrcReg) {
6314 if (AArch64::GPR64RegClass.
contains(DestReg) &&
6315 AArch64::FPR64RegClass.
contains(SrcReg)) {
6321 if (AArch64::FPR32RegClass.
contains(DestReg) &&
6322 AArch64::GPR32RegClass.
contains(SrcReg)) {
6323 if (AArch64::WZR == SrcReg) {
6331 if (AArch64::GPR32RegClass.
contains(DestReg) &&
6332 AArch64::FPR32RegClass.
contains(SrcReg)) {
6338 if (DestReg == AArch64::NZCV) {
6339 assert(AArch64::GPR64RegClass.
contains(SrcReg) &&
"Invalid NZCV copy");
6341 .
addImm(AArch64SysReg::NZCV)
6347 if (SrcReg == AArch64::NZCV) {
6348 assert(AArch64::GPR64RegClass.
contains(DestReg) &&
"Invalid NZCV copy");
6350 .
addImm(AArch64SysReg::NZCV)
6356 errs() << RI.getRegAsmName(DestReg) <<
" = COPY " << RI.getRegAsmName(SrcReg)
6367 bool RenamableSrc)
const {
6379 unsigned SubIdx0,
unsigned SubIdx1,
int FI,
6384 SrcReg0 =
TRI.getSubReg(SrcReg, SubIdx0);
6386 SrcReg1 =
TRI.getSubReg(SrcReg, SubIdx1);
6399 Register SrcReg,
bool isKill,
int FI,
6414 switch (RI.getSpillSize(*RC)) {
6416 if (AArch64::FPR8RegClass.hasSubClassEq(RC))
6417 Opc = AArch64::STRBui;
6420 if (AArch64::FPR16RegClass.hasSubClassEq(RC))
6421 Opc = AArch64::STRHui;
6422 else if (AArch64::PNRRegClass.hasSubClassEq(RC) ||
6423 AArch64::PPRRegClass.hasSubClassEq(RC)) {
6424 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6425 "Unexpected register store without SVE store instructions");
6426 Opc = AArch64::STR_PXI;
6432 if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
6433 Opc = AArch64::STRWui;
6437 assert(SrcReg != AArch64::WSP);
6438 }
else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
6439 Opc = AArch64::STRSui;
6440 else if (AArch64::PPR2RegClass.hasSubClassEq(RC)) {
6441 Opc = AArch64::STR_PPXI;
6446 if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
6447 Opc = AArch64::STRXui;
6451 assert(SrcReg != AArch64::SP);
6452 }
else if (AArch64::FPR64RegClass.hasSubClassEq(RC)) {
6453 Opc = AArch64::STRDui;
6454 }
else if (AArch64::WSeqPairsClassRegClass.hasSubClassEq(RC)) {
6456 get(AArch64::STPWi), SrcReg, isKill,
6457 AArch64::sube32, AArch64::subo32, FI, MMO);
6462 if (AArch64::FPR128RegClass.hasSubClassEq(RC))
6463 Opc = AArch64::STRQui;
6464 else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
6465 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6466 Opc = AArch64::ST1Twov1d;
6468 }
else if (AArch64::XSeqPairsClassRegClass.hasSubClassEq(RC)) {
6470 get(AArch64::STPXi), SrcReg, isKill,
6471 AArch64::sube64, AArch64::subo64, FI, MMO);
6473 }
else if (AArch64::ZPRRegClass.hasSubClassEq(RC)) {
6474 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6475 "Unexpected register store without SVE store instructions");
6476 Opc = AArch64::STR_ZXI;
6481 if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
6482 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6483 Opc = AArch64::ST1Threev1d;
6488 if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
6489 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6490 Opc = AArch64::ST1Fourv1d;
6492 }
else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
6493 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6494 Opc = AArch64::ST1Twov2d;
6496 }
else if (AArch64::ZPR2StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6497 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6498 "Unexpected register store without SVE store instructions");
6499 Opc = AArch64::STR_ZZXI_STRIDED_CONTIGUOUS;
6501 }
else if (AArch64::ZPR2RegClass.hasSubClassEq(RC)) {
6502 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6503 "Unexpected register store without SVE store instructions");
6504 Opc = AArch64::STR_ZZXI;
6509 if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
6510 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6511 Opc = AArch64::ST1Threev2d;
6513 }
else if (AArch64::ZPR3RegClass.hasSubClassEq(RC)) {
6514 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6515 "Unexpected register store without SVE store instructions");
6516 Opc = AArch64::STR_ZZZXI;
6521 if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
6522 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6523 Opc = AArch64::ST1Fourv2d;
6525 }
else if (AArch64::ZPR4StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6526 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6527 "Unexpected register store without SVE store instructions");
6528 Opc = AArch64::STR_ZZZZXI_STRIDED_CONTIGUOUS;
6530 }
else if (AArch64::ZPR4RegClass.hasSubClassEq(RC)) {
6531 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6532 "Unexpected register store without SVE store instructions");
6533 Opc = AArch64::STR_ZZZZXI;
6538 assert(
Opc &&
"Unknown register class");
6549 MI.addMemOperand(MMO);
6556 Register DestReg,
unsigned SubIdx0,
6557 unsigned SubIdx1,
int FI,
6561 bool IsUndef =
true;
6563 DestReg0 =
TRI.getSubReg(DestReg, SubIdx0);
6565 DestReg1 =
TRI.getSubReg(DestReg, SubIdx1);
6594 switch (
TRI.getSpillSize(*RC)) {
6596 if (AArch64::FPR8RegClass.hasSubClassEq(RC))
6597 Opc = AArch64::LDRBui;
6600 bool IsPNR = AArch64::PNRRegClass.hasSubClassEq(RC);
6601 if (AArch64::FPR16RegClass.hasSubClassEq(RC))
6602 Opc = AArch64::LDRHui;
6603 else if (IsPNR || AArch64::PPRRegClass.hasSubClassEq(RC)) {
6604 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6605 "Unexpected register load without SVE load instructions");
6608 Opc = AArch64::LDR_PXI;
6614 if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
6615 Opc = AArch64::LDRWui;
6619 assert(DestReg != AArch64::WSP);
6620 }
else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
6621 Opc = AArch64::LDRSui;
6622 else if (AArch64::PPR2RegClass.hasSubClassEq(RC)) {
6623 Opc = AArch64::LDR_PPXI;
6628 if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
6629 Opc = AArch64::LDRXui;
6633 assert(DestReg != AArch64::SP);
6634 }
else if (AArch64::FPR64RegClass.hasSubClassEq(RC)) {
6635 Opc = AArch64::LDRDui;
6636 }
else if (AArch64::WSeqPairsClassRegClass.hasSubClassEq(RC)) {
6638 get(AArch64::LDPWi), DestReg, AArch64::sube32,
6639 AArch64::subo32, FI, MMO);
6644 if (AArch64::FPR128RegClass.hasSubClassEq(RC))
6645 Opc = AArch64::LDRQui;
6646 else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
6647 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6648 Opc = AArch64::LD1Twov1d;
6650 }
else if (AArch64::XSeqPairsClassRegClass.hasSubClassEq(RC)) {
6652 get(AArch64::LDPXi), DestReg, AArch64::sube64,
6653 AArch64::subo64, FI, MMO);
6655 }
else if (AArch64::ZPRRegClass.hasSubClassEq(RC)) {
6656 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6657 "Unexpected register load without SVE load instructions");
6658 Opc = AArch64::LDR_ZXI;
6663 if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
6664 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6665 Opc = AArch64::LD1Threev1d;
6670 if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
6671 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6672 Opc = AArch64::LD1Fourv1d;
6674 }
else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
6675 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6676 Opc = AArch64::LD1Twov2d;
6678 }
else if (AArch64::ZPR2StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6679 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6680 "Unexpected register load without SVE load instructions");
6681 Opc = AArch64::LDR_ZZXI_STRIDED_CONTIGUOUS;
6683 }
else if (AArch64::ZPR2RegClass.hasSubClassEq(RC)) {
6684 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6685 "Unexpected register load without SVE load instructions");
6686 Opc = AArch64::LDR_ZZXI;
6691 if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
6692 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6693 Opc = AArch64::LD1Threev2d;
6695 }
else if (AArch64::ZPR3RegClass.hasSubClassEq(RC)) {
6696 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6697 "Unexpected register load without SVE load instructions");
6698 Opc = AArch64::LDR_ZZZXI;
6703 if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
6704 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6705 Opc = AArch64::LD1Fourv2d;
6707 }
else if (AArch64::ZPR4StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6708 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6709 "Unexpected register load without SVE load instructions");
6710 Opc = AArch64::LDR_ZZZZXI_STRIDED_CONTIGUOUS;
6712 }
else if (AArch64::ZPR4RegClass.hasSubClassEq(RC)) {
6713 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6714 "Unexpected register load without SVE load instructions");
6715 Opc = AArch64::LDR_ZZZZXI;
6721 assert(
Opc &&
"Unknown register class");
6731 MI.addMemOperand(MMO);
6738 UseMI.getIterator()),
6740 return I.modifiesRegister(AArch64::NZCV, TRI) ||
6741 I.readsRegister(AArch64::NZCV, TRI);
6745void AArch64InstrInfo::decomposeStackOffsetForDwarfOffsets(
6750 assert(
Offset.getScalable() % 2 == 0 &&
"Invalid frame offset");
6757 ByteSized =
Offset.getFixed();
6758 VGSized =
Offset.getScalable() / 2;
6764void AArch64InstrInfo::decomposeStackOffsetForFrameOffsets(
6766 int64_t &NumDataVectors) {
6770 assert(
Offset.getScalable() % 2 == 0 &&
"Invalid frame offset");
6772 NumBytes =
Offset.getFixed();
6774 NumPredicateVectors =
Offset.getScalable() / 2;
6779 if (NumPredicateVectors % 8 == 0 || NumPredicateVectors < -64 ||
6780 NumPredicateVectors > 62) {
6781 NumDataVectors = NumPredicateVectors / 8;
6782 NumPredicateVectors -= NumDataVectors * 8;
6808 Expr.
push_back((
char)dwarf::DW_OP_bregx);
6816 int64_t OffsetFromDefCFA) {
6830 Comment << (NumBytes < 0 ?
" - " :
" + ") << std::abs(NumBytes);
6831 if (!RegScale.empty())
6841 int64_t NumBytes, NumVGScaledBytes;
6842 AArch64InstrInfo::decomposeStackOffsetForDwarfOffsets(
Offset, NumBytes,
6844 std::string CommentBuffer;
6847 if (
Reg == AArch64::SP)
6849 else if (
Reg == AArch64::FP)
6856 unsigned DwarfReg =
TRI.getDwarfRegNum(
Reg,
true);
6857 assert(DwarfReg <= 31 &&
"DwarfReg out of bounds (0..31)");
6859 Expr.
push_back(dwarf::DW_OP_breg0 + DwarfReg);
6862 if (NumVGScaledBytes) {
6872 DefCfaExpr.
push_back(dwarf::DW_CFA_def_cfa_expression);
6880 unsigned FrameReg,
unsigned Reg,
6882 bool LastAdjustmentWasScalable) {
6883 if (
Offset.getScalable())
6886 if (FrameReg == Reg && !LastAdjustmentWasScalable)
6889 unsigned DwarfReg =
TRI.getDwarfRegNum(Reg,
true);
6896 std::optional<int64_t> IncomingVGOffsetFromDefCFA) {
6897 int64_t NumBytes, NumVGScaledBytes;
6898 AArch64InstrInfo::decomposeStackOffsetForDwarfOffsets(
6899 OffsetFromDefCFA, NumBytes, NumVGScaledBytes);
6901 unsigned DwarfReg =
TRI.getDwarfRegNum(Reg,
true);
6904 if (!NumVGScaledBytes)
6907 std::string CommentBuffer;
6912 assert(NumVGScaledBytes &&
"Expected scalable offset");
6916 if (IncomingVGOffsetFromDefCFA) {
6918 VGRegScale =
"* IncomingVG";
6921 VGRegScale =
"* VG";
6925 OffsetExpr.
push_back(dwarf::DW_OP_plus);
6934 CfaExpr.
push_back(dwarf::DW_CFA_expression);
6949 unsigned SrcReg, int64_t
Offset,
unsigned Opc,
6952 bool *HasWinCFI,
bool EmitCFAOffset,
6955 unsigned MaxEncoding, ShiftSize;
6957 case AArch64::ADDXri:
6958 case AArch64::ADDSXri:
6959 case AArch64::SUBXri:
6960 case AArch64::SUBSXri:
6961 MaxEncoding = 0xfff;
6964 case AArch64::ADDVL_XXI:
6965 case AArch64::ADDPL_XXI:
6966 case AArch64::ADDSVL_XXI:
6967 case AArch64::ADDSPL_XXI:
6982 if (
Opc == AArch64::ADDVL_XXI ||
Opc == AArch64::ADDSVL_XXI)
6984 else if (
Opc == AArch64::ADDPL_XXI ||
Opc == AArch64::ADDSPL_XXI)
6998 const unsigned MaxEncodableValue = MaxEncoding << ShiftSize;
7000 if (TmpReg == AArch64::XZR)
7001 TmpReg =
MBB.getParent()->getRegInfo().createVirtualRegister(
7002 &AArch64::GPR64RegClass);
7004 uint64_t ThisVal = std::min<uint64_t>(
Offset, MaxEncodableValue);
7005 unsigned LocalShiftSize = 0;
7006 if (ThisVal > MaxEncoding) {
7007 ThisVal = ThisVal >> ShiftSize;
7008 LocalShiftSize = ShiftSize;
7010 assert((ThisVal >> ShiftSize) <= MaxEncoding &&
7011 "Encoding cannot handle value that big");
7013 Offset -= ThisVal << LocalShiftSize;
7018 .
addImm(Sign * (
int)ThisVal);
7028 if (Sign == -1 ||
Opc == AArch64::SUBXri ||
Opc == AArch64::SUBSXri)
7029 CFAOffset += Change;
7031 CFAOffset -= Change;
7032 if (EmitCFAOffset && DestReg == TmpReg) {
7045 int Imm = (int)(ThisVal << LocalShiftSize);
7046 if (VScale != 1 && DestReg == AArch64::SP) {
7052 }
else if ((DestReg == AArch64::FP && SrcReg == AArch64::SP) ||
7053 (SrcReg == AArch64::FP && DestReg == AArch64::SP)) {
7054 assert(VScale == 1 &&
"Expected non-scalable operation");
7063 assert(
Offset == 0 &&
"Expected remaining offset to be zero to "
7064 "emit a single SEH directive");
7065 }
else if (DestReg == AArch64::SP) {
7066 assert(VScale == 1 &&
"Expected non-scalable operation");
7069 assert(SrcReg == AArch64::SP &&
"Unexpected SrcReg for SEH_StackAlloc");
7082 unsigned DestReg,
unsigned SrcReg,
7085 bool NeedsWinCFI,
bool *HasWinCFI,
7087 unsigned FrameReg) {
7094 bool UseSVL =
F.hasFnAttribute(
"aarch64_pstate_sm_body");
7096 int64_t Bytes, NumPredicateVectors, NumDataVectors;
7097 AArch64InstrInfo::decomposeStackOffsetForFrameOffsets(
7098 Offset, Bytes, NumPredicateVectors, NumDataVectors);
7101 bool NeedsFinalDefNZCV = SetNZCV && (NumPredicateVectors || NumDataVectors);
7102 if (NeedsFinalDefNZCV)
7106 if (Bytes || (!
Offset && SrcReg != DestReg)) {
7107 assert((DestReg != AArch64::SP || Bytes % 8 == 0) &&
7108 "SP increment/decrement not 8-byte aligned");
7109 unsigned Opc = SetNZCV ? AArch64::ADDSXri : AArch64::ADDXri;
7112 Opc = SetNZCV ? AArch64::SUBSXri : AArch64::SUBXri;
7115 NeedsWinCFI, HasWinCFI, EmitCFAOffset, CFAOffset,
7117 CFAOffset += (
Opc == AArch64::ADDXri ||
Opc == AArch64::ADDSXri)
7124 assert(!(NeedsWinCFI && NumPredicateVectors) &&
7125 "WinCFI can't allocate fractions of an SVE data vector");
7127 if (NumDataVectors) {
7129 UseSVL ? AArch64::ADDSVL_XXI : AArch64::ADDVL_XXI,
TII,
7130 Flag, NeedsWinCFI, HasWinCFI, EmitCFAOffset, CFAOffset,
7136 if (NumPredicateVectors) {
7137 assert(DestReg != AArch64::SP &&
"Unaligned access to SP");
7139 UseSVL ? AArch64::ADDSPL_XXI : AArch64::ADDPL_XXI,
TII,
7140 Flag, NeedsWinCFI, HasWinCFI, EmitCFAOffset, CFAOffset,
7144 if (NeedsFinalDefNZCV)
7166 if (
MI.isFullCopy()) {
7169 if (SrcReg == AArch64::SP && DstReg.
isVirtual()) {
7173 if (DstReg == AArch64::SP && SrcReg.
isVirtual()) {
7178 if (SrcReg == AArch64::NZCV || DstReg == AArch64::NZCV)
7206 if (
MI.isCopy() &&
Ops.size() == 1 &&
7208 (
Ops[0] == 0 ||
Ops[0] == 1)) {
7209 bool IsSpill =
Ops[0] == 0;
7210 bool IsFill = !IsSpill;
7222 :
TRI.getMinimalPhysRegClass(Reg);
7228 "Mismatched register size in non subreg COPY");
7235 return &*--InsertPt;
7247 if (IsSpill && DstMO.
isUndef() && SrcReg == AArch64::WZR &&
7250 "Unexpected subreg on physical register");
7252 FrameIndex, &AArch64::GPR64RegClass,
Register());
7253 return &*--InsertPt;
7270 case AArch64::sub_32:
7271 if (AArch64::GPR64RegClass.hasSubClassEq(
getRegClass(DstReg)))
7272 FillRC = &AArch64::GPR32RegClass;
7275 FillRC = &AArch64::FPR32RegClass;
7278 FillRC = &AArch64::FPR64RegClass;
7284 TRI.getRegSizeInBits(*FillRC) &&
7285 "Mismatched regclass size on folded subreg COPY");
7304 bool *OutUseUnscaledOp,
7305 unsigned *OutUnscaledOp,
7306 int64_t *EmittableOffset) {
7308 if (EmittableOffset)
7309 *EmittableOffset = 0;
7310 if (OutUseUnscaledOp)
7311 *OutUseUnscaledOp =
false;
7317 switch (
MI.getOpcode()) {
7320 case AArch64::LD1Rv1d:
7321 case AArch64::LD1Rv2s:
7322 case AArch64::LD1Rv2d:
7323 case AArch64::LD1Rv4h:
7324 case AArch64::LD1Rv4s:
7325 case AArch64::LD1Rv8b:
7326 case AArch64::LD1Rv8h:
7327 case AArch64::LD1Rv16b:
7328 case AArch64::LD1Twov2d:
7329 case AArch64::LD1Threev2d:
7330 case AArch64::LD1Fourv2d:
7331 case AArch64::LD1Twov1d:
7332 case AArch64::LD1Threev1d:
7333 case AArch64::LD1Fourv1d:
7334 case AArch64::ST1Twov2d:
7335 case AArch64::ST1Threev2d:
7336 case AArch64::ST1Fourv2d:
7337 case AArch64::ST1Twov1d:
7338 case AArch64::ST1Threev1d:
7339 case AArch64::ST1Fourv1d:
7340 case AArch64::ST1i8:
7341 case AArch64::ST1i16:
7342 case AArch64::ST1i32:
7343 case AArch64::ST1i64:
7345 case AArch64::IRGstack:
7346 case AArch64::STGloop:
7347 case AArch64::STZGloop:
7352 TypeSize ScaleValue(0U,
false), Width(0U,
false);
7353 int64_t MinOff, MaxOff;
7359 bool IsMulVL = ScaleValue.isScalable();
7360 unsigned Scale = ScaleValue.getKnownMinValue();
7370 std::optional<unsigned> UnscaledOp =
7372 bool useUnscaledOp = UnscaledOp && (
Offset % Scale ||
Offset < 0);
7373 if (useUnscaledOp &&
7378 Scale = ScaleValue.getKnownMinValue();
7379 assert(IsMulVL == ScaleValue.isScalable() &&
7380 "Unscaled opcode has different value for scalable");
7382 int64_t Remainder =
Offset % Scale;
7383 assert(!(Remainder && useUnscaledOp) &&
7384 "Cannot have remainder when using unscaled op");
7386 assert(MinOff < MaxOff &&
"Unexpected Min/Max offsets");
7387 int64_t NewOffset =
Offset / Scale;
7388 if (MinOff <= NewOffset && NewOffset <= MaxOff)
7396 int64_t HighPart =
Offset & ~0xFFF;
7397 int64_t LowPart =
Offset & 0xFFF;
7398 int64_t LowScaled = LowPart / Scale;
7399 if (!IsMulVL && NewOffset >= 0 && LowPart % Scale == 0 &&
7400 MinOff <= LowScaled && LowScaled <= MaxOff &&
7402 NewOffset = LowScaled;
7407 NewOffset = NewOffset < 0 ? MinOff : MaxOff;
7412 if (EmittableOffset)
7413 *EmittableOffset = NewOffset;
7414 if (OutUseUnscaledOp)
7415 *OutUseUnscaledOp = useUnscaledOp;
7416 if (OutUnscaledOp && UnscaledOp)
7417 *OutUnscaledOp = *UnscaledOp;
7430 unsigned Opcode =
MI.getOpcode();
7431 unsigned ImmIdx = FrameRegIdx + 1;
7433 if (Opcode == AArch64::ADDSXri || Opcode == AArch64::ADDXri) {
7438 MI.eraseFromParent();
7444 unsigned UnscaledOp;
7447 &UnscaledOp, &NewOffset);
7451 MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg,
false);
7453 MI.setDesc(
TII->get(UnscaledOp));
7455 MI.getOperand(ImmIdx).ChangeToImmediate(NewOffset);
7471bool AArch64InstrInfo::useMachineCombiner()
const {
return true; }
7476 case AArch64::ADDSWrr:
7477 case AArch64::ADDSWri:
7478 case AArch64::ADDSXrr:
7479 case AArch64::ADDSXri:
7480 case AArch64::SUBSWrr:
7481 case AArch64::SUBSXrr:
7483 case AArch64::SUBSWri:
7484 case AArch64::SUBSXri:
7495 case AArch64::ADDWrr:
7496 case AArch64::ADDWri:
7497 case AArch64::SUBWrr:
7498 case AArch64::ADDSWrr:
7499 case AArch64::ADDSWri:
7500 case AArch64::SUBSWrr:
7502 case AArch64::SUBWri:
7503 case AArch64::SUBSWri:
7514 case AArch64::ADDXrr:
7515 case AArch64::ADDXri:
7516 case AArch64::SUBXrr:
7517 case AArch64::ADDSXrr:
7518 case AArch64::ADDSXri:
7519 case AArch64::SUBSXrr:
7521 case AArch64::SUBXri:
7522 case AArch64::SUBSXri:
7523 case AArch64::ADDv8i8:
7524 case AArch64::ADDv16i8:
7525 case AArch64::ADDv4i16:
7526 case AArch64::ADDv8i16:
7527 case AArch64::ADDv2i32:
7528 case AArch64::ADDv4i32:
7529 case AArch64::SUBv8i8:
7530 case AArch64::SUBv16i8:
7531 case AArch64::SUBv4i16:
7532 case AArch64::SUBv8i16:
7533 case AArch64::SUBv2i32:
7534 case AArch64::SUBv4i32:
7547 case AArch64::FADDHrr:
7548 case AArch64::FADDSrr:
7549 case AArch64::FADDDrr:
7550 case AArch64::FADDv4f16:
7551 case AArch64::FADDv8f16:
7552 case AArch64::FADDv2f32:
7553 case AArch64::FADDv2f64:
7554 case AArch64::FADDv4f32:
7555 case AArch64::FSUBHrr:
7556 case AArch64::FSUBSrr:
7557 case AArch64::FSUBDrr:
7558 case AArch64::FSUBv4f16:
7559 case AArch64::FSUBv8f16:
7560 case AArch64::FSUBv2f32:
7561 case AArch64::FSUBv2f64:
7562 case AArch64::FSUBv4f32:
7581 unsigned CombineOpc,
unsigned ZeroReg = 0,
7582 bool CheckZeroReg =
false) {
7589 if (!
MI ||
MI->getParent() != &
MBB ||
MI->getOpcode() != CombineOpc)
7596 assert(
MI->getNumOperands() >= 4 &&
MI->getOperand(0).isReg() &&
7597 MI->getOperand(1).isReg() &&
MI->getOperand(2).isReg() &&
7598 MI->getOperand(3).isReg() &&
"MAdd/MSub must have a least 4 regs");
7600 if (
MI->getOperand(3).getReg() != ZeroReg)
7605 MI->findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
true) == -1)
7614 unsigned MulOpc,
unsigned ZeroReg) {
7629bool AArch64InstrInfo::isAssociativeAndCommutative(
const MachineInstr &Inst,
7630 bool Invert)
const {
7636 case AArch64::FADDHrr:
7637 case AArch64::FADDSrr:
7638 case AArch64::FADDDrr:
7639 case AArch64::FMULHrr:
7640 case AArch64::FMULSrr:
7641 case AArch64::FMULDrr:
7642 case AArch64::FMULX16:
7643 case AArch64::FMULX32:
7644 case AArch64::FMULX64:
7646 case AArch64::FADDv4f16:
7647 case AArch64::FADDv8f16:
7648 case AArch64::FADDv2f32:
7649 case AArch64::FADDv4f32:
7650 case AArch64::FADDv2f64:
7651 case AArch64::FMULv4f16:
7652 case AArch64::FMULv8f16:
7653 case AArch64::FMULv2f32:
7654 case AArch64::FMULv4f32:
7655 case AArch64::FMULv2f64:
7656 case AArch64::FMULXv4f16:
7657 case AArch64::FMULXv8f16:
7658 case AArch64::FMULXv2f32:
7659 case AArch64::FMULXv4f32:
7660 case AArch64::FMULXv2f64:
7664 case AArch64::FADD_ZZZ_H:
7665 case AArch64::FADD_ZZZ_S:
7666 case AArch64::FADD_ZZZ_D:
7667 case AArch64::FMUL_ZZZ_H:
7668 case AArch64::FMUL_ZZZ_S:
7669 case AArch64::FMUL_ZZZ_D:
7680 case AArch64::ADDWrr:
7681 case AArch64::ADDXrr:
7682 case AArch64::ANDWrr:
7683 case AArch64::ANDXrr:
7684 case AArch64::ORRWrr:
7685 case AArch64::ORRXrr:
7686 case AArch64::EORWrr:
7687 case AArch64::EORXrr:
7688 case AArch64::EONWrr:
7689 case AArch64::EONXrr:
7693 case AArch64::ADDv8i8:
7694 case AArch64::ADDv16i8:
7695 case AArch64::ADDv4i16:
7696 case AArch64::ADDv8i16:
7697 case AArch64::ADDv2i32:
7698 case AArch64::ADDv4i32:
7699 case AArch64::ADDv1i64:
7700 case AArch64::ADDv2i64:
7701 case AArch64::MULv8i8:
7702 case AArch64::MULv16i8:
7703 case AArch64::MULv4i16:
7704 case AArch64::MULv8i16:
7705 case AArch64::MULv2i32:
7706 case AArch64::MULv4i32:
7707 case AArch64::ANDv8i8:
7708 case AArch64::ANDv16i8:
7709 case AArch64::ORRv8i8:
7710 case AArch64::ORRv16i8:
7711 case AArch64::EORv8i8:
7712 case AArch64::EORv16i8:
7714 case AArch64::ADD_ZZZ_B:
7715 case AArch64::ADD_ZZZ_H:
7716 case AArch64::ADD_ZZZ_S:
7717 case AArch64::ADD_ZZZ_D:
7718 case AArch64::MUL_ZZZ_B:
7719 case AArch64::MUL_ZZZ_H:
7720 case AArch64::MUL_ZZZ_S:
7721 case AArch64::MUL_ZZZ_D:
7722 case AArch64::AND_ZZZ:
7723 case AArch64::ORR_ZZZ:
7724 case AArch64::EOR_ZZZ:
7755 auto setFound = [&](
int Opcode,
int Operand,
unsigned ZeroReg,
7763 auto setVFound = [&](
int Opcode,
int Operand,
unsigned Pattern) {
7775 case AArch64::ADDWrr:
7777 "ADDWrr does not have register operands");
7778 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULADDW_OP1);
7779 setFound(AArch64::MADDWrrr, 2, AArch64::WZR, MCP::MULADDW_OP2);
7781 case AArch64::ADDXrr:
7782 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULADDX_OP1);
7783 setFound(AArch64::MADDXrrr, 2, AArch64::XZR, MCP::MULADDX_OP2);
7785 case AArch64::SUBWrr:
7786 setFound(AArch64::MADDWrrr, 2, AArch64::WZR, MCP::MULSUBW_OP2);
7787 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULSUBW_OP1);
7789 case AArch64::SUBXrr:
7790 setFound(AArch64::MADDXrrr, 2, AArch64::XZR, MCP::MULSUBX_OP2);
7791 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULSUBX_OP1);
7793 case AArch64::ADDWri:
7794 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULADDWI_OP1);
7796 case AArch64::ADDXri:
7797 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULADDXI_OP1);
7799 case AArch64::SUBWri:
7800 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULSUBWI_OP1);
7802 case AArch64::SUBXri:
7803 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULSUBXI_OP1);
7805 case AArch64::ADDv8i8:
7806 setVFound(AArch64::MULv8i8, 1, MCP::MULADDv8i8_OP1);
7807 setVFound(AArch64::MULv8i8, 2, MCP::MULADDv8i8_OP2);
7809 case AArch64::ADDv16i8:
7810 setVFound(AArch64::MULv16i8, 1, MCP::MULADDv16i8_OP1);
7811 setVFound(AArch64::MULv16i8, 2, MCP::MULADDv16i8_OP2);
7813 case AArch64::ADDv4i16:
7814 setVFound(AArch64::MULv4i16, 1, MCP::MULADDv4i16_OP1);
7815 setVFound(AArch64::MULv4i16, 2, MCP::MULADDv4i16_OP2);
7816 setVFound(AArch64::MULv4i16_indexed, 1, MCP::MULADDv4i16_indexed_OP1);
7817 setVFound(AArch64::MULv4i16_indexed, 2, MCP::MULADDv4i16_indexed_OP2);
7819 case AArch64::ADDv8i16:
7820 setVFound(AArch64::MULv8i16, 1, MCP::MULADDv8i16_OP1);
7821 setVFound(AArch64::MULv8i16, 2, MCP::MULADDv8i16_OP2);
7822 setVFound(AArch64::MULv8i16_indexed, 1, MCP::MULADDv8i16_indexed_OP1);
7823 setVFound(AArch64::MULv8i16_indexed, 2, MCP::MULADDv8i16_indexed_OP2);
7825 case AArch64::ADDv2i32:
7826 setVFound(AArch64::MULv2i32, 1, MCP::MULADDv2i32_OP1);
7827 setVFound(AArch64::MULv2i32, 2, MCP::MULADDv2i32_OP2);
7828 setVFound(AArch64::MULv2i32_indexed, 1, MCP::MULADDv2i32_indexed_OP1);
7829 setVFound(AArch64::MULv2i32_indexed, 2, MCP::MULADDv2i32_indexed_OP2);
7831 case AArch64::ADDv4i32:
7832 setVFound(AArch64::MULv4i32, 1, MCP::MULADDv4i32_OP1);
7833 setVFound(AArch64::MULv4i32, 2, MCP::MULADDv4i32_OP2);
7834 setVFound(AArch64::MULv4i32_indexed, 1, MCP::MULADDv4i32_indexed_OP1);
7835 setVFound(AArch64::MULv4i32_indexed, 2, MCP::MULADDv4i32_indexed_OP2);
7837 case AArch64::SUBv8i8:
7838 setVFound(AArch64::MULv8i8, 1, MCP::MULSUBv8i8_OP1);
7839 setVFound(AArch64::MULv8i8, 2, MCP::MULSUBv8i8_OP2);
7841 case AArch64::SUBv16i8:
7842 setVFound(AArch64::MULv16i8, 1, MCP::MULSUBv16i8_OP1);
7843 setVFound(AArch64::MULv16i8, 2, MCP::MULSUBv16i8_OP2);
7845 case AArch64::SUBv4i16:
7846 setVFound(AArch64::MULv4i16, 1, MCP::MULSUBv4i16_OP1);
7847 setVFound(AArch64::MULv4i16, 2, MCP::MULSUBv4i16_OP2);
7848 setVFound(AArch64::MULv4i16_indexed, 1, MCP::MULSUBv4i16_indexed_OP1);
7849 setVFound(AArch64::MULv4i16_indexed, 2, MCP::MULSUBv4i16_indexed_OP2);
7851 case AArch64::SUBv8i16:
7852 setVFound(AArch64::MULv8i16, 1, MCP::MULSUBv8i16_OP1);
7853 setVFound(AArch64::MULv8i16, 2, MCP::MULSUBv8i16_OP2);
7854 setVFound(AArch64::MULv8i16_indexed, 1, MCP::MULSUBv8i16_indexed_OP1);
7855 setVFound(AArch64::MULv8i16_indexed, 2, MCP::MULSUBv8i16_indexed_OP2);
7857 case AArch64::SUBv2i32:
7858 setVFound(AArch64::MULv2i32, 1, MCP::MULSUBv2i32_OP1);
7859 setVFound(AArch64::MULv2i32, 2, MCP::MULSUBv2i32_OP2);
7860 setVFound(AArch64::MULv2i32_indexed, 1, MCP::MULSUBv2i32_indexed_OP1);
7861 setVFound(AArch64::MULv2i32_indexed, 2, MCP::MULSUBv2i32_indexed_OP2);
7863 case AArch64::SUBv4i32:
7864 setVFound(AArch64::MULv4i32, 1, MCP::MULSUBv4i32_OP1);
7865 setVFound(AArch64::MULv4i32, 2, MCP::MULSUBv4i32_OP2);
7866 setVFound(AArch64::MULv4i32_indexed, 1, MCP::MULSUBv4i32_indexed_OP1);
7867 setVFound(AArch64::MULv4i32_indexed, 2, MCP::MULSUBv4i32_indexed_OP2);
7873bool AArch64InstrInfo::isAccumulationOpcode(
unsigned Opcode)
const {
7877 case AArch64::UABALB_ZZZ_D:
7878 case AArch64::UABALB_ZZZ_H:
7879 case AArch64::UABALB_ZZZ_S:
7880 case AArch64::UABALT_ZZZ_D:
7881 case AArch64::UABALT_ZZZ_H:
7882 case AArch64::UABALT_ZZZ_S:
7883 case AArch64::SABALB_ZZZ_D:
7884 case AArch64::SABALB_ZZZ_S:
7885 case AArch64::SABALB_ZZZ_H:
7886 case AArch64::SABALT_ZZZ_D:
7887 case AArch64::SABALT_ZZZ_S:
7888 case AArch64::SABALT_ZZZ_H:
7889 case AArch64::UABALv16i8_v8i16:
7890 case AArch64::UABALv2i32_v2i64:
7891 case AArch64::UABALv4i16_v4i32:
7892 case AArch64::UABALv4i32_v2i64:
7893 case AArch64::UABALv8i16_v4i32:
7894 case AArch64::UABALv8i8_v8i16:
7895 case AArch64::UABAv16i8:
7896 case AArch64::UABAv2i32:
7897 case AArch64::UABAv4i16:
7898 case AArch64::UABAv4i32:
7899 case AArch64::UABAv8i16:
7900 case AArch64::UABAv8i8:
7901 case AArch64::SABALv16i8_v8i16:
7902 case AArch64::SABALv2i32_v2i64:
7903 case AArch64::SABALv4i16_v4i32:
7904 case AArch64::SABALv4i32_v2i64:
7905 case AArch64::SABALv8i16_v4i32:
7906 case AArch64::SABALv8i8_v8i16:
7907 case AArch64::SABAv16i8:
7908 case AArch64::SABAv2i32:
7909 case AArch64::SABAv4i16:
7910 case AArch64::SABAv4i32:
7911 case AArch64::SABAv8i16:
7912 case AArch64::SABAv8i8:
7919unsigned AArch64InstrInfo::getAccumulationStartOpcode(
7920 unsigned AccumulationOpcode)
const {
7921 switch (AccumulationOpcode) {
7924 case AArch64::UABALB_ZZZ_D:
7925 return AArch64::UABDLB_ZZZ_D;
7926 case AArch64::UABALB_ZZZ_H:
7927 return AArch64::UABDLB_ZZZ_H;
7928 case AArch64::UABALB_ZZZ_S:
7929 return AArch64::UABDLB_ZZZ_S;
7930 case AArch64::UABALT_ZZZ_D:
7931 return AArch64::UABDLT_ZZZ_D;
7932 case AArch64::UABALT_ZZZ_H:
7933 return AArch64::UABDLT_ZZZ_H;
7934 case AArch64::UABALT_ZZZ_S:
7935 return AArch64::UABDLT_ZZZ_S;
7936 case AArch64::UABALv16i8_v8i16:
7937 return AArch64::UABDLv16i8_v8i16;
7938 case AArch64::UABALv2i32_v2i64:
7939 return AArch64::UABDLv2i32_v2i64;
7940 case AArch64::UABALv4i16_v4i32:
7941 return AArch64::UABDLv4i16_v4i32;
7942 case AArch64::UABALv4i32_v2i64:
7943 return AArch64::UABDLv4i32_v2i64;
7944 case AArch64::UABALv8i16_v4i32:
7945 return AArch64::UABDLv8i16_v4i32;
7946 case AArch64::UABALv8i8_v8i16:
7947 return AArch64::UABDLv8i8_v8i16;
7948 case AArch64::UABAv16i8:
7949 return AArch64::UABDv16i8;
7950 case AArch64::UABAv2i32:
7951 return AArch64::UABDv2i32;
7952 case AArch64::UABAv4i16:
7953 return AArch64::UABDv4i16;
7954 case AArch64::UABAv4i32:
7955 return AArch64::UABDv4i32;
7956 case AArch64::UABAv8i16:
7957 return AArch64::UABDv8i16;
7958 case AArch64::UABAv8i8:
7959 return AArch64::UABDv8i8;
7960 case AArch64::SABALB_ZZZ_D:
7961 return AArch64::SABDLB_ZZZ_D;
7962 case AArch64::SABALB_ZZZ_S:
7963 return AArch64::SABDLB_ZZZ_S;
7964 case AArch64::SABALB_ZZZ_H:
7965 return AArch64::SABDLB_ZZZ_H;
7966 case AArch64::SABALT_ZZZ_D:
7967 return AArch64::SABDLT_ZZZ_D;
7968 case AArch64::SABALT_ZZZ_S:
7969 return AArch64::SABDLT_ZZZ_S;
7970 case AArch64::SABALT_ZZZ_H:
7971 return AArch64::SABDLT_ZZZ_H;
7972 case AArch64::SABALv16i8_v8i16:
7973 return AArch64::SABDLv16i8_v8i16;
7974 case AArch64::SABALv2i32_v2i64:
7975 return AArch64::SABDLv2i32_v2i64;
7976 case AArch64::SABALv4i16_v4i32:
7977 return AArch64::SABDLv4i16_v4i32;
7978 case AArch64::SABALv4i32_v2i64:
7979 return AArch64::SABDLv4i32_v2i64;
7980 case AArch64::SABALv8i16_v4i32:
7981 return AArch64::SABDLv8i16_v4i32;
7982 case AArch64::SABALv8i8_v8i16:
7983 return AArch64::SABDLv8i8_v8i16;
7984 case AArch64::SABAv16i8:
7985 return AArch64::SABDv16i8;
7986 case AArch64::SABAv2i32:
7987 return AArch64::SABAv2i32;
7988 case AArch64::SABAv4i16:
7989 return AArch64::SABDv4i16;
7990 case AArch64::SABAv4i32:
7991 return AArch64::SABDv4i32;
7992 case AArch64::SABAv8i16:
7993 return AArch64::SABDv8i16;
7994 case AArch64::SABAv8i8:
7995 return AArch64::SABDv8i8;
8011 auto Match = [&](
int Opcode,
int Operand,
unsigned Pattern) ->
bool {
8023 assert(
false &&
"Unsupported FP instruction in combiner\n");
8025 case AArch64::FADDHrr:
8027 "FADDHrr does not have register operands");
8029 Found = Match(AArch64::FMULHrr, 1, MCP::FMULADDH_OP1);
8030 Found |= Match(AArch64::FMULHrr, 2, MCP::FMULADDH_OP2);
8032 case AArch64::FADDSrr:
8034 "FADDSrr does not have register operands");
8036 Found |= Match(AArch64::FMULSrr, 1, MCP::FMULADDS_OP1) ||
8037 Match(AArch64::FMULv1i32_indexed, 1, MCP::FMLAv1i32_indexed_OP1);
8039 Found |= Match(AArch64::FMULSrr, 2, MCP::FMULADDS_OP2) ||
8040 Match(AArch64::FMULv1i32_indexed, 2, MCP::FMLAv1i32_indexed_OP2);
8042 case AArch64::FADDDrr:
8043 Found |= Match(AArch64::FMULDrr, 1, MCP::FMULADDD_OP1) ||
8044 Match(AArch64::FMULv1i64_indexed, 1, MCP::FMLAv1i64_indexed_OP1);
8046 Found |= Match(AArch64::FMULDrr, 2, MCP::FMULADDD_OP2) ||
8047 Match(AArch64::FMULv1i64_indexed, 2, MCP::FMLAv1i64_indexed_OP2);
8049 case AArch64::FADDv4f16:
8050 Found |= Match(AArch64::FMULv4i16_indexed, 1, MCP::FMLAv4i16_indexed_OP1) ||
8051 Match(AArch64::FMULv4f16, 1, MCP::FMLAv4f16_OP1);
8053 Found |= Match(AArch64::FMULv4i16_indexed, 2, MCP::FMLAv4i16_indexed_OP2) ||
8054 Match(AArch64::FMULv4f16, 2, MCP::FMLAv4f16_OP2);
8056 case AArch64::FADDv8f16:
8057 Found |= Match(AArch64::FMULv8i16_indexed, 1, MCP::FMLAv8i16_indexed_OP1) ||
8058 Match(AArch64::FMULv8f16, 1, MCP::FMLAv8f16_OP1);
8060 Found |= Match(AArch64::FMULv8i16_indexed, 2, MCP::FMLAv8i16_indexed_OP2) ||
8061 Match(AArch64::FMULv8f16, 2, MCP::FMLAv8f16_OP2);
8063 case AArch64::FADDv2f32:
8064 Found |= Match(AArch64::FMULv2i32_indexed, 1, MCP::FMLAv2i32_indexed_OP1) ||
8065 Match(AArch64::FMULv2f32, 1, MCP::FMLAv2f32_OP1);
8067 Found |= Match(AArch64::FMULv2i32_indexed, 2, MCP::FMLAv2i32_indexed_OP2) ||
8068 Match(AArch64::FMULv2f32, 2, MCP::FMLAv2f32_OP2);
8070 case AArch64::FADDv2f64:
8071 Found |= Match(AArch64::FMULv2i64_indexed, 1, MCP::FMLAv2i64_indexed_OP1) ||
8072 Match(AArch64::FMULv2f64, 1, MCP::FMLAv2f64_OP1);
8074 Found |= Match(AArch64::FMULv2i64_indexed, 2, MCP::FMLAv2i64_indexed_OP2) ||
8075 Match(AArch64::FMULv2f64, 2, MCP::FMLAv2f64_OP2);
8077 case AArch64::FADDv4f32:
8078 Found |= Match(AArch64::FMULv4i32_indexed, 1, MCP::FMLAv4i32_indexed_OP1) ||
8079 Match(AArch64::FMULv4f32, 1, MCP::FMLAv4f32_OP1);
8081 Found |= Match(AArch64::FMULv4i32_indexed, 2, MCP::FMLAv4i32_indexed_OP2) ||
8082 Match(AArch64::FMULv4f32, 2, MCP::FMLAv4f32_OP2);
8084 case AArch64::FSUBHrr:
8085 Found = Match(AArch64::FMULHrr, 1, MCP::FMULSUBH_OP1);
8086 Found |= Match(AArch64::FMULHrr, 2, MCP::FMULSUBH_OP2);
8087 Found |= Match(AArch64::FNMULHrr, 1, MCP::FNMULSUBH_OP1);
8089 case AArch64::FSUBSrr:
8090 Found = Match(AArch64::FMULSrr, 1, MCP::FMULSUBS_OP1);
8092 Found |= Match(AArch64::FMULSrr, 2, MCP::FMULSUBS_OP2) ||
8093 Match(AArch64::FMULv1i32_indexed, 2, MCP::FMLSv1i32_indexed_OP2);
8095 Found |= Match(AArch64::FNMULSrr, 1, MCP::FNMULSUBS_OP1);
8097 case AArch64::FSUBDrr:
8098 Found = Match(AArch64::FMULDrr, 1, MCP::FMULSUBD_OP1);
8100 Found |= Match(AArch64::FMULDrr, 2, MCP::FMULSUBD_OP2) ||
8101 Match(AArch64::FMULv1i64_indexed, 2, MCP::FMLSv1i64_indexed_OP2);
8103 Found |= Match(AArch64::FNMULDrr, 1, MCP::FNMULSUBD_OP1);
8105 case AArch64::FSUBv4f16:
8106 Found |= Match(AArch64::FMULv4i16_indexed, 2, MCP::FMLSv4i16_indexed_OP2) ||
8107 Match(AArch64::FMULv4f16, 2, MCP::FMLSv4f16_OP2);
8109 Found |= Match(AArch64::FMULv4i16_indexed, 1, MCP::FMLSv4i16_indexed_OP1) ||
8110 Match(AArch64::FMULv4f16, 1, MCP::FMLSv4f16_OP1);
8112 case AArch64::FSUBv8f16:
8113 Found |= Match(AArch64::FMULv8i16_indexed, 2, MCP::FMLSv8i16_indexed_OP2) ||
8114 Match(AArch64::FMULv8f16, 2, MCP::FMLSv8f16_OP2);
8116 Found |= Match(AArch64::FMULv8i16_indexed, 1, MCP::FMLSv8i16_indexed_OP1) ||
8117 Match(AArch64::FMULv8f16, 1, MCP::FMLSv8f16_OP1);
8119 case AArch64::FSUBv2f32:
8120 Found |= Match(AArch64::FMULv2i32_indexed, 2, MCP::FMLSv2i32_indexed_OP2) ||
8121 Match(AArch64::FMULv2f32, 2, MCP::FMLSv2f32_OP2);
8123 Found |= Match(AArch64::FMULv2i32_indexed, 1, MCP::FMLSv2i32_indexed_OP1) ||
8124 Match(AArch64::FMULv2f32, 1, MCP::FMLSv2f32_OP1);
8126 case AArch64::FSUBv2f64:
8127 Found |= Match(AArch64::FMULv2i64_indexed, 2, MCP::FMLSv2i64_indexed_OP2) ||
8128 Match(AArch64::FMULv2f64, 2, MCP::FMLSv2f64_OP2);
8130 Found |= Match(AArch64::FMULv2i64_indexed, 1, MCP::FMLSv2i64_indexed_OP1) ||
8131 Match(AArch64::FMULv2f64, 1, MCP::FMLSv2f64_OP1);
8133 case AArch64::FSUBv4f32:
8134 Found |= Match(AArch64::FMULv4i32_indexed, 2, MCP::FMLSv4i32_indexed_OP2) ||
8135 Match(AArch64::FMULv4f32, 2, MCP::FMLSv4f32_OP2);
8137 Found |= Match(AArch64::FMULv4i32_indexed, 1, MCP::FMLSv4i32_indexed_OP1) ||
8138 Match(AArch64::FMULv4f32, 1, MCP::FMLSv4f32_OP1);
8149 auto Match = [&](
unsigned Opcode,
int Operand,
unsigned Pattern) ->
bool {
8156 if (
MI &&
MI->getOpcode() == TargetOpcode::COPY &&
8157 MI->getOperand(1).getReg().isVirtual())
8159 if (
MI &&
MI->getOpcode() == Opcode) {
8171 case AArch64::FMULv2f32:
8172 Found = Match(AArch64::DUPv2i32lane, 1, MCP::FMULv2i32_indexed_OP1);
8173 Found |= Match(AArch64::DUPv2i32lane, 2, MCP::FMULv2i32_indexed_OP2);
8175 case AArch64::FMULv2f64:
8176 Found = Match(AArch64::DUPv2i64lane, 1, MCP::FMULv2i64_indexed_OP1);
8177 Found |= Match(AArch64::DUPv2i64lane, 2, MCP::FMULv2i64_indexed_OP2);
8179 case AArch64::FMULv4f16:
8180 Found = Match(AArch64::DUPv4i16lane, 1, MCP::FMULv4i16_indexed_OP1);
8181 Found |= Match(AArch64::DUPv4i16lane, 2, MCP::FMULv4i16_indexed_OP2);
8183 case AArch64::FMULv4f32:
8184 Found = Match(AArch64::DUPv4i32lane, 1, MCP::FMULv4i32_indexed_OP1);
8185 Found |= Match(AArch64::DUPv4i32lane, 2, MCP::FMULv4i32_indexed_OP2);
8187 case AArch64::FMULv8f16:
8188 Found = Match(AArch64::DUPv8i16lane, 1, MCP::FMULv8i16_indexed_OP1);
8189 Found |= Match(AArch64::DUPv8i16lane, 2, MCP::FMULv8i16_indexed_OP2);
8202 auto Match = [&](
unsigned Opcode,
unsigned Pattern) ->
bool {
8205 if (
MI !=
nullptr && (
MI->getOpcode() == Opcode) &&
8220 case AArch64::FNEGDr:
8222 case AArch64::FNEGSr:
8354 case AArch64::SUBWrr:
8355 case AArch64::SUBSWrr:
8356 case AArch64::SUBXrr:
8357 case AArch64::SUBSXrr:
8402 unsigned LoadLaneOpCode,
unsigned NumLanes) {
8425 while (!RemainingLanes.
empty() && CurrInstr &&
8426 CurrInstr->getOpcode() == LoadLaneOpCode &&
8428 CurrInstr->getNumOperands() == 4) {
8429 RemainingLanes.
erase(CurrInstr->getOperand(2).getImm());
8435 if (!RemainingLanes.
empty())
8439 if (CurrInstr->getOpcode() != TargetOpcode::SUBREG_TO_REG)
8443 auto Lane0LoadReg = CurrInstr->getOperand(1).getReg();
8444 unsigned SingleLaneSizeInBits = 128 / NumLanes;
8445 if (
TRI->getRegSizeInBits(Lane0LoadReg, MRI) != SingleLaneSizeInBits)
8461 RemainingLoadInstrs.
insert(LoadInstrs.
begin(), LoadInstrs.
end());
8464 for (; MBBItr !=
MBB->begin() && RemainingSteps > 0 &&
8465 !RemainingLoadInstrs.
empty();
8466 --MBBItr, --RemainingSteps) {
8470 RemainingLoadInstrs.
erase(&CurrInstr);
8480 if (RemainingSteps == 0 && !RemainingLoadInstrs.
empty())
8506 case AArch64::LD1i32:
8508 case AArch64::LD1i16:
8510 case AArch64::LD1i8:
8526 unsigned Pattern,
unsigned NumLanes) {
8534 for (
unsigned i = 0; i < NumLanes - 1; ++i) {
8542 return A->getOperand(2).getImm() >
B->getOperand(2).getImm();
8548 auto LoadToLaneInstrsAscending =
llvm::reverse(LoadToLaneInstrs);
8554 auto CreateLD1Instruction = [&](
MachineInstr *OriginalInstr,
8555 Register SrcRegister,
unsigned Lane,
8557 bool OffsetRegisterKillState) {
8566 InstrIdxForVirtReg.
insert(std::make_pair(NewRegister, InsInstrs.
size()));
8567 InsInstrs.
push_back(LoadIndexIntoRegister);
8573 auto CreateLDRInstruction =
8579 Opcode = AArch64::LDRSui;
8582 Opcode = AArch64::LDRHui;
8585 Opcode = AArch64::LDRBui;
8589 "Got unsupported number of lanes in machine-combiner gather pattern");
8599 auto LanesToLoadToReg0 =
8601 LoadToLaneInstrsAscending.begin() + NumLanes / 2);
8602 Register PrevReg = SubregToReg->getOperand(0).getReg();
8604 const MachineOperand &OffsetRegOperand = LoadInstr->getOperand(3);
8605 PrevReg = CreateLD1Instruction(LoadInstr, PrevReg, Index + 1,
8606 OffsetRegOperand.
getReg(),
8607 OffsetRegOperand.
isKill());
8614 MachineInstr *Lane0Load = *LoadToLaneInstrsAscending.begin();
8616 *std::next(LoadToLaneInstrsAscending.begin(), NumLanes / 2);
8623 CreateLDRInstruction(NumLanes, DestRegForMiddleIndex,
8624 OriginalSplitToLoadOffsetOperand.
getReg(),
8627 InstrIdxForVirtReg.
insert(
8628 std::make_pair(DestRegForMiddleIndex, InsInstrs.
size()));
8629 InsInstrs.
push_back(MiddleIndexLoadInstr);
8634 unsigned SubregType;
8637 SubregType = AArch64::ssub;
8640 SubregType = AArch64::hsub;
8643 SubregType = AArch64::bsub;
8647 "Got invalid NumLanes for machine-combiner gather pattern");
8650 auto SubRegToRegInstr =
8652 DestRegForSubregToReg)
8655 InstrIdxForVirtReg.
insert(
8656 std::make_pair(DestRegForSubregToReg, InsInstrs.
size()));
8660 auto LanesToLoadToReg1 =
8662 LoadToLaneInstrsAscending.end());
8663 PrevReg = SubRegToRegInstr->getOperand(0).getReg();
8665 const MachineOperand &OffsetRegOperand = LoadInstr->getOperand(3);
8666 PrevReg = CreateLD1Instruction(LoadInstr, PrevReg, Index + 1,
8667 OffsetRegOperand.
getReg(),
8668 OffsetRegOperand.
isKill());
8671 if (Index == NumLanes / 2 - 2) {
8706bool AArch64InstrInfo::getMachineCombinerPatterns(
8708 bool DoRegPressureReduce)
const {
8729 DoRegPressureReduce);
8758 const Register *ReplacedAddend =
nullptr) {
8759 assert(IdxMulOpd == 1 || IdxMulOpd == 2);
8761 unsigned IdxOtherOpd = IdxMulOpd == 1 ? 2 : 1;
8764 Register SrcReg0 = MUL->getOperand(1).getReg();
8765 bool Src0IsKill = MUL->getOperand(1).isKill();
8766 Register SrcReg1 = MUL->getOperand(2).getReg();
8767 bool Src1IsKill = MUL->getOperand(2).isKill();
8771 if (ReplacedAddend) {
8773 SrcReg2 = *ReplacedAddend;
8800 .
addImm(MUL->getOperand(3).getImm());
8807 assert(
false &&
"Invalid FMA instruction kind \n");
8821 if (AArch64::FPR32RegClass.hasSubClassEq(RC))
8822 Opc = AArch64::FNMADDSrrr;
8823 else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
8824 Opc = AArch64::FNMADDDrrr;
8858 unsigned IdxDupOp,
unsigned MulOpc,
8860 assert(((IdxDupOp == 1) || (IdxDupOp == 2)) &&
8861 "Invalid index of FMUL operand");
8869 if (Dup->
getOpcode() == TargetOpcode::COPY)
8878 unsigned IdxMulOp = IdxDupOp == 1 ? 2 : 1;
8919 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
8934 genNeg(MF, MRI,
TII, Root, InsInstrs, InstrIdxForVirtReg, MnegOpc, RC);
8961 genNeg(MF, MRI,
TII, Root, InsInstrs, InstrIdxForVirtReg, MnegOpc, RC);
8989 unsigned IdxMulOpd,
unsigned MaddOpc,
unsigned VR,
8991 assert(IdxMulOpd == 1 || IdxMulOpd == 2);
8995 Register SrcReg0 = MUL->getOperand(1).getReg();
8996 bool Src0IsKill = MUL->getOperand(1).isKill();
8997 Register SrcReg1 = MUL->getOperand(2).getReg();
8998 bool Src1IsKill = MUL->getOperand(2).isKill();
9028 assert(IdxOpd1 == 1 || IdxOpd1 == 2);
9029 unsigned IdxOtherOpd = IdxOpd1 == 1 ? 2 : 1;
9043 if (Opcode == AArch64::SUBSWrr)
9044 Opcode = AArch64::SUBWrr;
9045 else if (Opcode == AArch64::SUBSXrr)
9046 Opcode = AArch64::SUBXrr;
9048 assert((Opcode == AArch64::SUBWrr || Opcode == AArch64::SUBXrr) &&
9049 "Unexpected instruction opcode.");
9066 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9073unsigned AArch64InstrInfo::getReduceOpcodeForAccumulator(
9074 unsigned int AccumulatorOpCode)
const {
9075 switch (AccumulatorOpCode) {
9076 case AArch64::UABALB_ZZZ_D:
9077 case AArch64::SABALB_ZZZ_D:
9078 case AArch64::UABALT_ZZZ_D:
9079 case AArch64::SABALT_ZZZ_D:
9080 return AArch64::ADD_ZZZ_D;
9081 case AArch64::UABALB_ZZZ_H:
9082 case AArch64::SABALB_ZZZ_H:
9083 case AArch64::UABALT_ZZZ_H:
9084 case AArch64::SABALT_ZZZ_H:
9085 return AArch64::ADD_ZZZ_H;
9086 case AArch64::UABALB_ZZZ_S:
9087 case AArch64::SABALB_ZZZ_S:
9088 case AArch64::UABALT_ZZZ_S:
9089 case AArch64::SABALT_ZZZ_S:
9090 return AArch64::ADD_ZZZ_S;
9091 case AArch64::UABALv16i8_v8i16:
9092 case AArch64::SABALv8i8_v8i16:
9093 case AArch64::SABAv8i16:
9094 case AArch64::UABAv8i16:
9095 return AArch64::ADDv8i16;
9096 case AArch64::SABALv2i32_v2i64:
9097 case AArch64::UABALv2i32_v2i64:
9098 case AArch64::SABALv4i32_v2i64:
9099 return AArch64::ADDv2i64;
9100 case AArch64::UABALv4i16_v4i32:
9101 case AArch64::SABALv4i16_v4i32:
9102 case AArch64::SABALv8i16_v4i32:
9103 case AArch64::SABAv4i32:
9104 case AArch64::UABAv4i32:
9105 return AArch64::ADDv4i32;
9106 case AArch64::UABALv4i32_v2i64:
9107 return AArch64::ADDv2i64;
9108 case AArch64::UABALv8i16_v4i32:
9109 return AArch64::ADDv4i32;
9110 case AArch64::UABALv8i8_v8i16:
9111 case AArch64::SABALv16i8_v8i16:
9112 return AArch64::ADDv8i16;
9113 case AArch64::UABAv16i8:
9114 case AArch64::SABAv16i8:
9115 return AArch64::ADDv16i8;
9116 case AArch64::UABAv4i16:
9117 case AArch64::SABAv4i16:
9118 return AArch64::ADDv4i16;
9119 case AArch64::UABAv2i32:
9120 case AArch64::SABAv2i32:
9121 return AArch64::ADDv2i32;
9122 case AArch64::UABAv8i8:
9123 case AArch64::SABAv8i8:
9124 return AArch64::ADDv8i8;
9133void AArch64InstrInfo::genAlternativeCodeSequence(
9143 MachineInstr *
MUL =
nullptr;
9150 DelInstrs, InstrIdxForVirtReg);
9156 InstrIdxForVirtReg);
9162 InstrIdxForVirtReg);
9171 Opc = AArch64::MADDWrrr;
9172 RC = &AArch64::GPR32RegClass;
9174 Opc = AArch64::MADDXrrr;
9175 RC = &AArch64::GPR64RegClass;
9186 Opc = AArch64::MADDWrrr;
9187 RC = &AArch64::GPR32RegClass;
9189 Opc = AArch64::MADDXrrr;
9190 RC = &AArch64::GPR64RegClass;
9204 unsigned BitSize, MovImm;
9207 MovImm = AArch64::MOVi32imm;
9208 RC = &AArch64::GPR32spRegClass;
9210 Opc = AArch64::MADDWrrr;
9211 RC = &AArch64::GPR32RegClass;
9213 MovImm = AArch64::MOVi64imm;
9214 RC = &AArch64::GPR64spRegClass;
9216 Opc = AArch64::MADDXrrr;
9217 RC = &AArch64::GPR64RegClass;
9232 if (Insn.
size() != 1)
9234 MachineInstrBuilder MIB1 =
9235 BuildMI(MF, MIMetadata(Root),
TII->get(MovImm), NewVR)
9238 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9250 unsigned SubOpc, ZeroReg;
9252 SubOpc = AArch64::SUBWrr;
9253 SubRC = &AArch64::GPR32spRegClass;
9254 ZeroReg = AArch64::WZR;
9255 Opc = AArch64::MADDWrrr;
9256 RC = &AArch64::GPR32RegClass;
9258 SubOpc = AArch64::SUBXrr;
9259 SubRC = &AArch64::GPR64spRegClass;
9260 ZeroReg = AArch64::XZR;
9261 Opc = AArch64::MADDXrrr;
9262 RC = &AArch64::GPR64RegClass;
9266 MachineInstrBuilder MIB1 =
9267 BuildMI(MF, MIMetadata(Root),
TII->get(SubOpc), NewVR)
9271 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9282 Opc = AArch64::MSUBWrrr;
9283 RC = &AArch64::GPR32RegClass;
9285 Opc = AArch64::MSUBXrrr;
9286 RC = &AArch64::GPR64RegClass;
9291 Opc = AArch64::MLAv8i8;
9292 RC = &AArch64::FPR64RegClass;
9296 Opc = AArch64::MLAv8i8;
9297 RC = &AArch64::FPR64RegClass;
9301 Opc = AArch64::MLAv16i8;
9302 RC = &AArch64::FPR128RegClass;
9306 Opc = AArch64::MLAv16i8;
9307 RC = &AArch64::FPR128RegClass;
9311 Opc = AArch64::MLAv4i16;
9312 RC = &AArch64::FPR64RegClass;
9316 Opc = AArch64::MLAv4i16;
9317 RC = &AArch64::FPR64RegClass;
9321 Opc = AArch64::MLAv8i16;
9322 RC = &AArch64::FPR128RegClass;
9326 Opc = AArch64::MLAv8i16;
9327 RC = &AArch64::FPR128RegClass;
9331 Opc = AArch64::MLAv2i32;
9332 RC = &AArch64::FPR64RegClass;
9336 Opc = AArch64::MLAv2i32;
9337 RC = &AArch64::FPR64RegClass;
9341 Opc = AArch64::MLAv4i32;
9342 RC = &AArch64::FPR128RegClass;
9346 Opc = AArch64::MLAv4i32;
9347 RC = &AArch64::FPR128RegClass;
9352 Opc = AArch64::MLAv8i8;
9353 RC = &AArch64::FPR64RegClass;
9355 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv8i8,
9359 Opc = AArch64::MLSv8i8;
9360 RC = &AArch64::FPR64RegClass;
9364 Opc = AArch64::MLAv16i8;
9365 RC = &AArch64::FPR128RegClass;
9367 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv16i8,
9371 Opc = AArch64::MLSv16i8;
9372 RC = &AArch64::FPR128RegClass;
9376 Opc = AArch64::MLAv4i16;
9377 RC = &AArch64::FPR64RegClass;
9379 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i16,
9383 Opc = AArch64::MLSv4i16;
9384 RC = &AArch64::FPR64RegClass;
9388 Opc = AArch64::MLAv8i16;
9389 RC = &AArch64::FPR128RegClass;
9391 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv8i16,
9395 Opc = AArch64::MLSv8i16;
9396 RC = &AArch64::FPR128RegClass;
9400 Opc = AArch64::MLAv2i32;
9401 RC = &AArch64::FPR64RegClass;
9403 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv2i32,
9407 Opc = AArch64::MLSv2i32;
9408 RC = &AArch64::FPR64RegClass;
9412 Opc = AArch64::MLAv4i32;
9413 RC = &AArch64::FPR128RegClass;
9415 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i32,
9419 Opc = AArch64::MLSv4i32;
9420 RC = &AArch64::FPR128RegClass;
9425 Opc = AArch64::MLAv4i16_indexed;
9426 RC = &AArch64::FPR64RegClass;
9430 Opc = AArch64::MLAv4i16_indexed;
9431 RC = &AArch64::FPR64RegClass;
9435 Opc = AArch64::MLAv8i16_indexed;
9436 RC = &AArch64::FPR128RegClass;
9440 Opc = AArch64::MLAv8i16_indexed;
9441 RC = &AArch64::FPR128RegClass;
9445 Opc = AArch64::MLAv2i32_indexed;
9446 RC = &AArch64::FPR64RegClass;
9450 Opc = AArch64::MLAv2i32_indexed;
9451 RC = &AArch64::FPR64RegClass;
9455 Opc = AArch64::MLAv4i32_indexed;
9456 RC = &AArch64::FPR128RegClass;
9460 Opc = AArch64::MLAv4i32_indexed;
9461 RC = &AArch64::FPR128RegClass;
9466 Opc = AArch64::MLAv4i16_indexed;
9467 RC = &AArch64::FPR64RegClass;
9469 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i16,
9473 Opc = AArch64::MLSv4i16_indexed;
9474 RC = &AArch64::FPR64RegClass;
9478 Opc = AArch64::MLAv8i16_indexed;
9479 RC = &AArch64::FPR128RegClass;
9481 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv8i16,
9485 Opc = AArch64::MLSv8i16_indexed;
9486 RC = &AArch64::FPR128RegClass;
9490 Opc = AArch64::MLAv2i32_indexed;
9491 RC = &AArch64::FPR64RegClass;
9493 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv2i32,
9497 Opc = AArch64::MLSv2i32_indexed;
9498 RC = &AArch64::FPR64RegClass;
9502 Opc = AArch64::MLAv4i32_indexed;
9503 RC = &AArch64::FPR128RegClass;
9505 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i32,
9509 Opc = AArch64::MLSv4i32_indexed;
9510 RC = &AArch64::FPR128RegClass;
9516 Opc = AArch64::FMADDHrrr;
9517 RC = &AArch64::FPR16RegClass;
9521 Opc = AArch64::FMADDSrrr;
9522 RC = &AArch64::FPR32RegClass;
9526 Opc = AArch64::FMADDDrrr;
9527 RC = &AArch64::FPR64RegClass;
9532 Opc = AArch64::FMADDHrrr;
9533 RC = &AArch64::FPR16RegClass;
9537 Opc = AArch64::FMADDSrrr;
9538 RC = &AArch64::FPR32RegClass;
9542 Opc = AArch64::FMADDDrrr;
9543 RC = &AArch64::FPR64RegClass;
9548 Opc = AArch64::FMLAv1i32_indexed;
9549 RC = &AArch64::FPR32RegClass;
9554 Opc = AArch64::FMLAv1i32_indexed;
9555 RC = &AArch64::FPR32RegClass;
9561 Opc = AArch64::FMLAv1i64_indexed;
9562 RC = &AArch64::FPR64RegClass;
9567 Opc = AArch64::FMLAv1i64_indexed;
9568 RC = &AArch64::FPR64RegClass;
9574 RC = &AArch64::FPR64RegClass;
9575 Opc = AArch64::FMLAv4i16_indexed;
9580 RC = &AArch64::FPR64RegClass;
9581 Opc = AArch64::FMLAv4f16;
9586 RC = &AArch64::FPR64RegClass;
9587 Opc = AArch64::FMLAv4i16_indexed;
9592 RC = &AArch64::FPR64RegClass;
9593 Opc = AArch64::FMLAv4f16;
9600 RC = &AArch64::FPR64RegClass;
9602 Opc = AArch64::FMLAv2i32_indexed;
9606 Opc = AArch64::FMLAv2f32;
9613 RC = &AArch64::FPR64RegClass;
9615 Opc = AArch64::FMLAv2i32_indexed;
9619 Opc = AArch64::FMLAv2f32;
9626 RC = &AArch64::FPR128RegClass;
9627 Opc = AArch64::FMLAv8i16_indexed;
9632 RC = &AArch64::FPR128RegClass;
9633 Opc = AArch64::FMLAv8f16;
9638 RC = &AArch64::FPR128RegClass;
9639 Opc = AArch64::FMLAv8i16_indexed;
9644 RC = &AArch64::FPR128RegClass;
9645 Opc = AArch64::FMLAv8f16;
9652 RC = &AArch64::FPR128RegClass;
9654 Opc = AArch64::FMLAv2i64_indexed;
9658 Opc = AArch64::FMLAv2f64;
9665 RC = &AArch64::FPR128RegClass;
9667 Opc = AArch64::FMLAv2i64_indexed;
9671 Opc = AArch64::FMLAv2f64;
9679 RC = &AArch64::FPR128RegClass;
9681 Opc = AArch64::FMLAv4i32_indexed;
9685 Opc = AArch64::FMLAv4f32;
9693 RC = &AArch64::FPR128RegClass;
9695 Opc = AArch64::FMLAv4i32_indexed;
9699 Opc = AArch64::FMLAv4f32;
9706 Opc = AArch64::FNMSUBHrrr;
9707 RC = &AArch64::FPR16RegClass;
9711 Opc = AArch64::FNMSUBSrrr;
9712 RC = &AArch64::FPR32RegClass;
9716 Opc = AArch64::FNMSUBDrrr;
9717 RC = &AArch64::FPR64RegClass;
9722 Opc = AArch64::FNMADDHrrr;
9723 RC = &AArch64::FPR16RegClass;
9727 Opc = AArch64::FNMADDSrrr;
9728 RC = &AArch64::FPR32RegClass;
9732 Opc = AArch64::FNMADDDrrr;
9733 RC = &AArch64::FPR64RegClass;
9738 Opc = AArch64::FMSUBHrrr;
9739 RC = &AArch64::FPR16RegClass;
9743 Opc = AArch64::FMSUBSrrr;
9744 RC = &AArch64::FPR32RegClass;
9748 Opc = AArch64::FMSUBDrrr;
9749 RC = &AArch64::FPR64RegClass;
9754 Opc = AArch64::FMLSv1i32_indexed;
9755 RC = &AArch64::FPR32RegClass;
9761 Opc = AArch64::FMLSv1i64_indexed;
9762 RC = &AArch64::FPR64RegClass;
9769 RC = &AArch64::FPR64RegClass;
9771 MachineInstrBuilder MIB1 =
9772 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv4f16), NewVR)
9775 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9777 Opc = AArch64::FMLAv4f16;
9781 Opc = AArch64::FMLAv4i16_indexed;
9788 RC = &AArch64::FPR64RegClass;
9789 Opc = AArch64::FMLSv4f16;
9794 RC = &AArch64::FPR64RegClass;
9795 Opc = AArch64::FMLSv4i16_indexed;
9802 RC = &AArch64::FPR64RegClass;
9804 Opc = AArch64::FMLSv2i32_indexed;
9808 Opc = AArch64::FMLSv2f32;
9816 RC = &AArch64::FPR128RegClass;
9818 MachineInstrBuilder MIB1 =
9819 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv8f16), NewVR)
9822 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9824 Opc = AArch64::FMLAv8f16;
9828 Opc = AArch64::FMLAv8i16_indexed;
9835 RC = &AArch64::FPR128RegClass;
9836 Opc = AArch64::FMLSv8f16;
9841 RC = &AArch64::FPR128RegClass;
9842 Opc = AArch64::FMLSv8i16_indexed;
9849 RC = &AArch64::FPR128RegClass;
9851 Opc = AArch64::FMLSv2i64_indexed;
9855 Opc = AArch64::FMLSv2f64;
9863 RC = &AArch64::FPR128RegClass;
9865 Opc = AArch64::FMLSv4i32_indexed;
9869 Opc = AArch64::FMLSv4f32;
9876 RC = &AArch64::FPR64RegClass;
9878 MachineInstrBuilder MIB1 =
9879 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv2f32), NewVR)
9882 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9884 Opc = AArch64::FMLAv2i32_indexed;
9888 Opc = AArch64::FMLAv2f32;
9896 RC = &AArch64::FPR128RegClass;
9898 MachineInstrBuilder MIB1 =
9899 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv4f32), NewVR)
9902 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9904 Opc = AArch64::FMLAv4i32_indexed;
9908 Opc = AArch64::FMLAv4f32;
9916 RC = &AArch64::FPR128RegClass;
9918 MachineInstrBuilder MIB1 =
9919 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv2f64), NewVR)
9922 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9924 Opc = AArch64::FMLAv2i64_indexed;
9928 Opc = AArch64::FMLAv2f64;
9940 &AArch64::FPR128RegClass, MRI);
9949 &AArch64::FPR128RegClass, MRI);
9958 &AArch64::FPR128_loRegClass, MRI);
9967 &AArch64::FPR128RegClass, MRI);
9976 &AArch64::FPR128_loRegClass, MRI);