67#define GET_INSTRINFO_CTOR_DTOR
68#include "AArch64GenInstrInfo.inc"
70#define DEBUG_TYPE "AArch64InstrInfo"
72STATISTIC(NumCopyInstrs,
"Number of COPY instructions expanded");
73STATISTIC(NumZCRegMoveInstrsGPR,
"Number of zero-cycle GPR register move "
74 "instructions expanded from canonical COPY");
75STATISTIC(NumZCRegMoveInstrsFPR,
"Number of zero-cycle FPR register move "
76 "instructions expanded from canonical COPY");
77STATISTIC(NumZCZeroingInstrsGPR,
"Number of zero-cycle GPR zeroing "
78 "instructions expanded from canonical COPY");
83 cl::desc(
"Restrict range of CB instructions (DEBUG)"));
87 cl::desc(
"Restrict range of TB[N]Z instructions (DEBUG)"));
91 cl::desc(
"Restrict range of CB[N]Z instructions (DEBUG)"));
95 cl::desc(
"Restrict range of Bcc instructions (DEBUG)"));
99 cl::desc(
"Restrict range of B instructions (DEBUG)"));
103 cl::desc(
"Restrict range of instructions to search for the "
104 "machine-combiner gather pattern optimization"));
108 cl::desc(
"Use a frame record for Mach-O non-leaf outlined functions"));
113 RI(STI.getTargetTriple(), STI.getHwMode()), Subtarget(STI) {}
123 switch (
MI.getOpcode()) {
134 if (
MI.getOperand(0).getReg() != AArch64::LR)
147 case AArch64::BLRAAZ:
149 case AArch64::BLRABZ:
153 case AArch64::AUTIASP:
154 case AArch64::AUTIBSP:
155 case AArch64::AUTIAZ:
156 case AArch64::AUTIBZ:
157 case AArch64::XPACLRI:
162 if (
MI.getOperand(0).getImm() == 3 &&
MI.getOperand(1).getImm() == 7 &&
163 MI.getOperand(3).getImm() == 1)
171 bool ModifiesLR =
false;
172 bool ModifiesSP =
false;
176 if (MO.getReg() == AArch64::LR)
178 else if (MO.getReg() == AArch64::SP)
187 if (
MI.mayLoadOrStore()) {
195 if (ModifiesSP || ModifiesLR)
213 auto Op =
MI.getOpcode();
214 if (
Op == AArch64::INLINEASM ||
Op == AArch64::INLINEASM_BR)
215 return getInlineAsmLength(
MI.getOperand(0).getSymbolName(), MAI);
219 if (
MI.isMetaInstruction())
224 unsigned NumBytes = 0;
234 NumBytes =
Desc.getSize() ?
Desc.getSize() : 4;
237 if (!MFI->shouldSignReturnAddress(*MF))
240 auto Method = STI.getAuthenticatedLRCheckMethod(*MF);
248 switch (
Desc.getOpcode()) {
251 return Desc.getSize();
258 case TargetOpcode::STACKMAP:
261 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
263 case TargetOpcode::PATCHPOINT:
266 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
268 case TargetOpcode::STATEPOINT:
270 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
275 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
280 F.getFnAttributeAsParsedInteger(
"patchable-function-entry", 9) * 4;
282 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
283 case TargetOpcode::PATCHABLE_TAIL_CALL:
284 case TargetOpcode::PATCHABLE_TYPED_EVENT_CALL:
288 case TargetOpcode::PATCHABLE_EVENT_CALL:
294 NumBytes =
MI.getOperand(1).getImm();
296 case AArch64::MOVaddr:
297 case AArch64::MOVaddrJT:
298 case AArch64::MOVaddrCP:
299 case AArch64::MOVaddrBA:
300 case AArch64::MOVaddrTLS:
301 case AArch64::MOVaddrEXT: {
305 MI.getOperand(1).getTargetFlags(),
306 Subtarget.isTargetMachO(), Insn);
307 NumBytes = Insn.
size() * 4;
311 case AArch64::MOVi32imm:
312 case AArch64::MOVi64imm: {
314 unsigned BitSize =
Desc.getOpcode() == AArch64::MOVi32imm ? 32 : 64;
317 NumBytes = Insn.
size() * 4;
321 case TargetOpcode::BUNDLE:
322 NumBytes = getInstBundleSize(
MI);
358 case AArch64::CBWPri:
359 case AArch64::CBXPri:
360 case AArch64::CBWPrr:
361 case AArch64::CBXPrr:
369 case AArch64::CBBAssertExt:
370 case AArch64::CBHAssertExt:
401 case AArch64::CBWPri:
402 case AArch64::CBXPri:
403 case AArch64::CBBAssertExt:
404 case AArch64::CBHAssertExt:
405 case AArch64::CBWPrr:
406 case AArch64::CBXPrr:
412 int64_t BrOffset)
const {
414 assert(Bits >= 3 &&
"max branch displacement must be enough to jump"
415 "over conditional branch expansion");
416 return isIntN(Bits, BrOffset / 4);
421 switch (
MI.getOpcode()) {
425 return MI.getOperand(0).getMBB();
430 return MI.getOperand(2).getMBB();
436 return MI.getOperand(1).getMBB();
437 case AArch64::CBWPri:
438 case AArch64::CBXPri:
439 case AArch64::CBBAssertExt:
440 case AArch64::CBHAssertExt:
441 case AArch64::CBWPrr:
442 case AArch64::CBXPrr:
443 return MI.getOperand(3).getMBB();
453 assert(RS &&
"RegScavenger required for long branching");
455 "new block should be inserted for expanding unconditional branch");
458 "restore block should be inserted for restoring clobbered registers");
465 "Branch offsets outside of the signed 33-bit range not supported");
476 RS->enterBasicBlockEnd(
MBB);
479 constexpr Register Reg = AArch64::X16;
480 if (!RS->isRegUsed(Reg)) {
481 insertUnconditionalBranch(
MBB, &NewDestBB,
DL);
492 Register Scavenged = RS->FindUnusedReg(&AArch64::GPR64RegClass);
493 if (Scavenged != AArch64::NoRegister) {
494 buildIndirectBranch(Scavenged, NewDestBB);
495 RS->setRegUsed(Scavenged);
504 "Unable to insert indirect branch inside function that has red zone");
527 bool AllowModify)
const {
534 if (
I->getOpcode() == AArch64::SpeculationBarrierISBDSBEndBB ||
535 I->getOpcode() == AArch64::SpeculationBarrierSBEndBB) {
539 if (!isUnpredicatedTerminator(*
I))
546 unsigned LastOpc = LastInst->
getOpcode();
547 if (
I ==
MBB.begin() || !isUnpredicatedTerminator(*--
I)) {
562 unsigned SecondLastOpc = SecondLastInst->
getOpcode();
569 LastInst = SecondLastInst;
571 if (
I ==
MBB.begin() || !isUnpredicatedTerminator(*--
I)) {
576 SecondLastInst = &*
I;
577 SecondLastOpc = SecondLastInst->
getOpcode();
588 LastInst = SecondLastInst;
590 if (
I ==
MBB.begin() || !isUnpredicatedTerminator(*--
I)) {
592 "unreachable unconditional branches removed above");
601 SecondLastInst = &*
I;
602 SecondLastOpc = SecondLastInst->
getOpcode();
606 if (SecondLastInst &&
I !=
MBB.begin() && isUnpredicatedTerminator(*--
I))
622 I->eraseFromParent();
631 I->eraseFromParent();
640 MachineBranchPredicate &MBP,
641 bool AllowModify)
const {
653 assert(MBP.TrueDest &&
"expected!");
654 MBP.FalseDest = FBB ? FBB :
MBB.getNextNode();
656 MBP.ConditionDef =
nullptr;
657 MBP.SingleUseCondition =
false;
667 if (
I ==
MBB.begin())
683 if (
MI.modifiesRegister(AArch64::NZCV,
nullptr)) {
684 MBP.ConditionDef = &
MI;
693 case AArch64::CBNZX: {
697 MBP.Predicate = (
Opc == AArch64::CBNZX ||
Opc == AArch64::CBNZW)
698 ? MachineBranchPredicate::PRED_NE
699 : MachineBranchPredicate::PRED_EQ;
700 Register CondReg = MBP.LHS.getReg();
709 case AArch64::TBNZX: {
730 Cond[1].setImm(AArch64::CBNZW);
733 Cond[1].setImm(AArch64::CBZW);
736 Cond[1].setImm(AArch64::CBNZX);
739 Cond[1].setImm(AArch64::CBZX);
742 Cond[1].setImm(AArch64::TBNZW);
745 Cond[1].setImm(AArch64::TBZW);
748 Cond[1].setImm(AArch64::TBNZX);
751 Cond[1].setImm(AArch64::TBZX);
755 case AArch64::CBWPri:
756 case AArch64::CBXPri:
757 case AArch64::CBBAssertExt:
758 case AArch64::CBHAssertExt:
759 case AArch64::CBWPrr:
760 case AArch64::CBXPrr: {
773 int *BytesRemoved)
const {
783 I->eraseFromParent();
787 if (
I ==
MBB.begin()) {
800 I->eraseFromParent();
807void AArch64InstrInfo::instantiateCondBranch(
832 if (
Cond.size() > 5) {
843 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
870 unsigned Opc =
MI.getOpcode();
877 if (
MI.getOperand(0).getReg() == AArch64::WZR ||
878 MI.getOperand(0).getReg() == AArch64::XZR) {
880 dbgs() <<
"Removing always taken branch: " <<
MI);
883 for (
auto *S : Succs)
885 MBB->removeSuccessor(S);
887 while (
MBB->rbegin() != &
MI)
888 MBB->rbegin()->eraseFromParent();
889 MI.eraseFromParent();
899 if (
MI.getOperand(0).getReg() == AArch64::WZR ||
900 MI.getOperand(0).getReg() == AArch64::XZR) {
902 dbgs() <<
"Removing never taken branch: " <<
MI);
904 MI.getParent()->removeSuccessor(
Target);
905 MI.eraseFromParent();
920 VReg =
DefMI->getOperand(1).getReg();
929 unsigned *NewReg =
nullptr) {
934 bool Is64Bit = AArch64::GPR64allRegClass.hasSubClassEq(MRI.
getRegClass(VReg));
940 switch (
DefMI->getOpcode()) {
941 case AArch64::SUBREG_TO_REG:
945 if (!
DefMI->getOperand(1).isReg())
947 if (!
DefMI->getOperand(2).isImm() ||
948 DefMI->getOperand(2).getImm() != AArch64::sub_32)
951 if (
DefMI->getOpcode() != AArch64::MOVi32imm)
953 if (!
DefMI->getOperand(1).isImm() ||
DefMI->getOperand(1).getImm() != 1)
956 SrcReg = AArch64::XZR;
957 Opc = AArch64::CSINCXr;
960 case AArch64::MOVi32imm:
961 case AArch64::MOVi64imm:
962 if (!
DefMI->getOperand(1).isImm() ||
DefMI->getOperand(1).getImm() != 1)
964 SrcReg = Is64Bit ? AArch64::XZR : AArch64::WZR;
965 Opc = Is64Bit ? AArch64::CSINCXr : AArch64::CSINCWr;
968 case AArch64::ADDSXri:
969 case AArch64::ADDSWri:
971 if (
DefMI->findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
976 case AArch64::ADDXri:
977 case AArch64::ADDWri:
979 if (!
DefMI->getOperand(2).isImm() ||
DefMI->getOperand(2).getImm() != 1 ||
980 DefMI->getOperand(3).getImm() != 0)
982 SrcReg =
DefMI->getOperand(1).getReg();
983 Opc = Is64Bit ? AArch64::CSINCXr : AArch64::CSINCWr;
986 case AArch64::ORNXrr:
987 case AArch64::ORNWrr: {
990 if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
992 SrcReg =
DefMI->getOperand(2).getReg();
993 Opc = Is64Bit ? AArch64::CSINVXr : AArch64::CSINVWr;
997 case AArch64::SUBSXrr:
998 case AArch64::SUBSWrr:
1000 if (
DefMI->findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
1005 case AArch64::SUBXrr:
1006 case AArch64::SUBWrr: {
1009 if (ZReg != AArch64::XZR && ZReg != AArch64::WZR)
1011 SrcReg =
DefMI->getOperand(2).getReg();
1012 Opc = Is64Bit ? AArch64::CSNEGXr : AArch64::CSNEGWr;
1018 assert(
Opc && SrcReg &&
"Missing parameters");
1028 Register FalseReg,
int &CondCycles,
1030 int &FalseCycles)
const {
1041 if (!RI.getCommonSubClass(RC, MRI.
getRegClass(DstReg)))
1045 unsigned ExtraCondLat =
Cond.size() != 1;
1049 if (AArch64::GPR64allRegClass.hasSubClassEq(RC) ||
1050 AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
1052 CondCycles = 1 + ExtraCondLat;
1053 TrueCycles = FalseCycles = 1;
1063 if (AArch64::FPR64RegClass.hasSubClassEq(RC) ||
1064 AArch64::FPR32RegClass.hasSubClassEq(RC)) {
1065 CondCycles = 5 + ExtraCondLat;
1066 TrueCycles = FalseCycles = 2;
1083 switch (
Cond.size()) {
1103 case AArch64::CBNZW:
1107 case AArch64::CBNZX:
1138 case AArch64::TBNZW:
1139 case AArch64::TBNZX:
1161 unsigned SubsOpc, SubsDestReg;
1167 case AArch64::CBWPri:
1168 SubsOpc = AArch64::SUBSWri;
1169 SubsDestReg = AArch64::WZR;
1172 case AArch64::CBXPri:
1173 SubsOpc = AArch64::SUBSXri;
1174 SubsDestReg = AArch64::XZR;
1177 case AArch64::CBWPrr:
1178 SubsOpc = AArch64::SUBSWrr;
1179 SubsDestReg = AArch64::WZR;
1182 case AArch64::CBXPrr:
1183 SubsOpc = AArch64::SUBSXrr;
1184 SubsDestReg = AArch64::XZR;
1217 switch (ExtendType) {
1223 "Unexpected compare-and-branch instruction for SXTB shift-extend");
1224 ExtOpc = AArch64::SBFMWri;
1230 "Unexpected compare-and-branch instruction for SXTH shift-extend");
1231 ExtOpc = AArch64::SBFMWri;
1237 "Unexpected compare-and-branch instruction for UXTB shift-extend");
1238 ExtOpc = AArch64::ANDWri;
1244 "Unexpected compare-and-branch instruction for UXTH shift-extend");
1245 ExtOpc = AArch64::ANDWri;
1254 if (ExtOpc != AArch64::ANDWri)
1256 MBBI.addImm(ExtBits);
1284 bool TryFold =
false;
1286 RC = &AArch64::GPR64RegClass;
1287 Opc = AArch64::CSELXr;
1290 RC = &AArch64::GPR32RegClass;
1291 Opc = AArch64::CSELWr;
1294 RC = &AArch64::FPR64RegClass;
1295 Opc = AArch64::FCSELDrrr;
1297 RC = &AArch64::FPR32RegClass;
1298 Opc = AArch64::FCSELSrrr;
1300 assert(RC &&
"Unsupported regclass");
1304 unsigned NewReg = 0;
1327 (FalseReg.
isVirtual() || FalseReg == AArch64::WZR ||
1328 FalseReg == AArch64::XZR) &&
1329 "FalseReg was folded into a non-virtual register other than WZR or XZR");
1346 assert(BitSize == 64 &&
"Only bit sizes of 32 or 64 allowed");
1351 return Is.
size() <= 2;
1356 assert(
MI.isCopy() &&
"Expected COPY instruction");
1362 if (
Reg.isVirtual())
1364 if (
Reg.isPhysical())
1365 return RI.getMinimalPhysRegClass(
Reg);
1370 if (DstRC && SrcRC && !RI.getCommonSubClass(DstRC, SrcRC))
1373 return MI.isAsCheapAsAMove();
1379 if (Subtarget.hasExynosCheapAsMoveHandling()) {
1380 if (isExynosCheapAsMove(
MI))
1382 return MI.isAsCheapAsAMove();
1385 switch (
MI.getOpcode()) {
1387 return MI.isAsCheapAsAMove();
1389 case TargetOpcode::COPY:
1392 case AArch64::ADDWrs:
1393 case AArch64::ADDXrs:
1394 case AArch64::SUBWrs:
1395 case AArch64::SUBXrs:
1396 return Subtarget.hasALULSLFast() &&
MI.getOperand(3).getImm() <= 4;
1401 case AArch64::MOVi32imm:
1403 case AArch64::MOVi64imm:
1408bool AArch64InstrInfo::isFalkorShiftExtFast(
const MachineInstr &
MI) {
1409 switch (
MI.getOpcode()) {
1413 case AArch64::ADDWrs:
1414 case AArch64::ADDXrs:
1415 case AArch64::ADDSWrs:
1416 case AArch64::ADDSXrs: {
1417 unsigned Imm =
MI.getOperand(3).getImm();
1424 case AArch64::ADDWrx:
1425 case AArch64::ADDXrx:
1426 case AArch64::ADDXrx64:
1427 case AArch64::ADDSWrx:
1428 case AArch64::ADDSXrx:
1429 case AArch64::ADDSXrx64: {
1430 unsigned Imm =
MI.getOperand(3).getImm();
1442 case AArch64::SUBWrs:
1443 case AArch64::SUBSWrs: {
1444 unsigned Imm =
MI.getOperand(3).getImm();
1446 return ShiftVal == 0 ||
1450 case AArch64::SUBXrs:
1451 case AArch64::SUBSXrs: {
1452 unsigned Imm =
MI.getOperand(3).getImm();
1454 return ShiftVal == 0 ||
1458 case AArch64::SUBWrx:
1459 case AArch64::SUBXrx:
1460 case AArch64::SUBXrx64:
1461 case AArch64::SUBSWrx:
1462 case AArch64::SUBSXrx:
1463 case AArch64::SUBSXrx64: {
1464 unsigned Imm =
MI.getOperand(3).getImm();
1476 case AArch64::LDRBBroW:
1477 case AArch64::LDRBBroX:
1478 case AArch64::LDRBroW:
1479 case AArch64::LDRBroX:
1480 case AArch64::LDRDroW:
1481 case AArch64::LDRDroX:
1482 case AArch64::LDRHHroW:
1483 case AArch64::LDRHHroX:
1484 case AArch64::LDRHroW:
1485 case AArch64::LDRHroX:
1486 case AArch64::LDRQroW:
1487 case AArch64::LDRQroX:
1488 case AArch64::LDRSBWroW:
1489 case AArch64::LDRSBWroX:
1490 case AArch64::LDRSBXroW:
1491 case AArch64::LDRSBXroX:
1492 case AArch64::LDRSHWroW:
1493 case AArch64::LDRSHWroX:
1494 case AArch64::LDRSHXroW:
1495 case AArch64::LDRSHXroX:
1496 case AArch64::LDRSWroW:
1497 case AArch64::LDRSWroX:
1498 case AArch64::LDRSroW:
1499 case AArch64::LDRSroX:
1500 case AArch64::LDRWroW:
1501 case AArch64::LDRWroX:
1502 case AArch64::LDRXroW:
1503 case AArch64::LDRXroX:
1504 case AArch64::PRFMroW:
1505 case AArch64::PRFMroX:
1506 case AArch64::STRBBroW:
1507 case AArch64::STRBBroX:
1508 case AArch64::STRBroW:
1509 case AArch64::STRBroX:
1510 case AArch64::STRDroW:
1511 case AArch64::STRDroX:
1512 case AArch64::STRHHroW:
1513 case AArch64::STRHHroX:
1514 case AArch64::STRHroW:
1515 case AArch64::STRHroX:
1516 case AArch64::STRQroW:
1517 case AArch64::STRQroX:
1518 case AArch64::STRSroW:
1519 case AArch64::STRSroX:
1520 case AArch64::STRWroW:
1521 case AArch64::STRWroX:
1522 case AArch64::STRXroW:
1523 case AArch64::STRXroX: {
1524 unsigned IsSigned =
MI.getOperand(3).getImm();
1531 unsigned Opc =
MI.getOpcode();
1535 case AArch64::SEH_StackAlloc:
1536 case AArch64::SEH_SaveFPLR:
1537 case AArch64::SEH_SaveFPLR_X:
1538 case AArch64::SEH_SaveReg:
1539 case AArch64::SEH_SaveReg_X:
1540 case AArch64::SEH_SaveRegP:
1541 case AArch64::SEH_SaveRegP_X:
1542 case AArch64::SEH_SaveFReg:
1543 case AArch64::SEH_SaveFReg_X:
1544 case AArch64::SEH_SaveFRegP:
1545 case AArch64::SEH_SaveFRegP_X:
1546 case AArch64::SEH_SetFP:
1547 case AArch64::SEH_AddFP:
1548 case AArch64::SEH_Nop:
1549 case AArch64::SEH_PrologEnd:
1550 case AArch64::SEH_EpilogStart:
1551 case AArch64::SEH_EpilogEnd:
1552 case AArch64::SEH_PACSignLR:
1553 case AArch64::SEH_SaveAnyRegI:
1554 case AArch64::SEH_SaveAnyRegIP:
1555 case AArch64::SEH_SaveAnyRegQP:
1556 case AArch64::SEH_SaveAnyRegQPX:
1557 case AArch64::SEH_AllocZ:
1558 case AArch64::SEH_SaveZReg:
1559 case AArch64::SEH_SavePReg:
1566 unsigned &SubIdx)
const {
1567 switch (
MI.getOpcode()) {
1570 case AArch64::SBFMXri:
1571 case AArch64::UBFMXri:
1574 if (
MI.getOperand(2).getImm() != 0 ||
MI.getOperand(3).getImm() != 31)
1577 SrcReg =
MI.getOperand(1).getReg();
1578 DstReg =
MI.getOperand(0).getReg();
1579 SubIdx = AArch64::sub_32;
1588 int64_t OffsetA = 0, OffsetB = 0;
1589 TypeSize WidthA(0,
false), WidthB(0,
false);
1590 bool OffsetAIsScalable =
false, OffsetBIsScalable =
false;
1611 OffsetAIsScalable == OffsetBIsScalable) {
1612 int LowOffset = OffsetA < OffsetB ? OffsetA : OffsetB;
1613 int HighOffset = OffsetA < OffsetB ? OffsetB : OffsetA;
1614 TypeSize LowWidth = (LowOffset == OffsetA) ? WidthA : WidthB;
1615 if (LowWidth.
isScalable() == OffsetAIsScalable &&
1633 switch (
MI.getOpcode()) {
1636 if (
MI.getOperand(0).getImm() == 0x14)
1643 case AArch64::MSRpstatesvcrImm1:
1650 auto Next = std::next(
MI.getIterator());
1651 return Next !=
MBB->end() &&
Next->isCFIInstruction();
1658 Register &SrcReg2, int64_t &CmpMask,
1659 int64_t &CmpValue)
const {
1663 assert(
MI.getNumOperands() >= 2 &&
"All AArch64 cmps should have 2 operands");
1664 if (!
MI.getOperand(1).isReg() ||
MI.getOperand(1).getSubReg())
1667 switch (
MI.getOpcode()) {
1670 case AArch64::PTEST_PP:
1671 case AArch64::PTEST_PP_ANY:
1672 case AArch64::PTEST_PP_FIRST:
1673 SrcReg =
MI.getOperand(0).getReg();
1674 SrcReg2 =
MI.getOperand(1).getReg();
1675 if (
MI.getOperand(2).getSubReg())
1682 case AArch64::SUBSWrr:
1683 case AArch64::SUBSWrs:
1684 case AArch64::SUBSWrx:
1685 case AArch64::SUBSXrr:
1686 case AArch64::SUBSXrs:
1687 case AArch64::SUBSXrx:
1688 case AArch64::ADDSWrr:
1689 case AArch64::ADDSWrs:
1690 case AArch64::ADDSWrx:
1691 case AArch64::ADDSXrr:
1692 case AArch64::ADDSXrs:
1693 case AArch64::ADDSXrx:
1695 SrcReg =
MI.getOperand(1).getReg();
1696 SrcReg2 =
MI.getOperand(2).getReg();
1699 if (
MI.getOperand(2).getSubReg())
1705 case AArch64::SUBSWri:
1706 case AArch64::ADDSWri:
1707 case AArch64::SUBSXri:
1708 case AArch64::ADDSXri:
1709 SrcReg =
MI.getOperand(1).getReg();
1712 CmpValue =
MI.getOperand(2).getImm();
1714 case AArch64::ANDSWri:
1715 case AArch64::ANDSXri:
1718 SrcReg =
MI.getOperand(1).getReg();
1722 MI.getOperand(2).getImm(),
1723 MI.getOpcode() == AArch64::ANDSWri ? 32 : 64);
1732 assert(
MBB &&
"Can't get MachineBasicBlock here");
1734 assert(MF &&
"Can't get MachineFunction here");
1739 for (
unsigned OpIdx = 0, EndIdx = Instr.getNumOperands(); OpIdx < EndIdx;
1743 Instr.getRegClassConstraint(OpIdx,
TII,
TRI);
1746 if (!OpRegCstraints)
1754 "Operand has register constraints without being a register!");
1757 if (
Reg.isPhysical()) {
1774 bool MIDefinesZeroReg =
false;
1775 if (
MI.definesRegister(AArch64::WZR,
nullptr) ||
1776 MI.definesRegister(AArch64::XZR,
nullptr))
1777 MIDefinesZeroReg =
true;
1779 switch (
MI.getOpcode()) {
1781 return MI.getOpcode();
1782 case AArch64::ADDSWrr:
1783 return AArch64::ADDWrr;
1784 case AArch64::ADDSWri:
1785 return MIDefinesZeroReg ? AArch64::ADDSWri : AArch64::ADDWri;
1786 case AArch64::ADDSWrs:
1787 return MIDefinesZeroReg ? AArch64::ADDSWrs : AArch64::ADDWrs;
1788 case AArch64::ADDSWrx:
1789 return AArch64::ADDWrx;
1790 case AArch64::ADDSXrr:
1791 return AArch64::ADDXrr;
1792 case AArch64::ADDSXri:
1793 return MIDefinesZeroReg ? AArch64::ADDSXri : AArch64::ADDXri;
1794 case AArch64::ADDSXrs:
1795 return MIDefinesZeroReg ? AArch64::ADDSXrs : AArch64::ADDXrs;
1796 case AArch64::ADDSXrx:
1797 return AArch64::ADDXrx;
1798 case AArch64::SUBSWrr:
1799 return AArch64::SUBWrr;
1800 case AArch64::SUBSWri:
1801 return MIDefinesZeroReg ? AArch64::SUBSWri : AArch64::SUBWri;
1802 case AArch64::SUBSWrs:
1803 return MIDefinesZeroReg ? AArch64::SUBSWrs : AArch64::SUBWrs;
1804 case AArch64::SUBSWrx:
1805 return AArch64::SUBWrx;
1806 case AArch64::SUBSXrr:
1807 return AArch64::SUBXrr;
1808 case AArch64::SUBSXri:
1809 return MIDefinesZeroReg ? AArch64::SUBSXri : AArch64::SUBXri;
1810 case AArch64::SUBSXrs:
1811 return MIDefinesZeroReg ? AArch64::SUBSXrs : AArch64::SUBXrs;
1812 case AArch64::SUBSXrx:
1813 return AArch64::SUBXrx;
1828 if (To == To->getParent()->begin())
1833 if (To->getParent() != From->getParent())
1845 Instr.modifiesRegister(AArch64::NZCV,
TRI)) ||
1846 ((AccessToCheck &
AK_Read) && Instr.readsRegister(AArch64::NZCV,
TRI)))
1852std::optional<unsigned>
1856 unsigned MaskOpcode =
Mask->getOpcode();
1857 unsigned PredOpcode = Pred->
getOpcode();
1858 bool PredIsPTestLike = isPTestLikeOpcode(PredOpcode);
1859 bool PredIsWhileLike = isWhileOpcode(PredOpcode);
1861 if (PredIsWhileLike) {
1865 if ((Mask == Pred) && PTest->
getOpcode() == AArch64::PTEST_PP_ANY)
1872 getElementSizeForOpcode(MaskOpcode) ==
1873 getElementSizeForOpcode(PredOpcode))
1879 if (PTest->
getOpcode() == AArch64::PTEST_PP_FIRST &&
1886 if (PredIsPTestLike) {
1891 if ((Mask == Pred) && PTest->
getOpcode() == AArch64::PTEST_PP_ANY)
1899 if (Mask != PTestLikeMask && PTestLikeMask->isFullCopy() &&
1900 PTestLikeMask->getOperand(1).getReg().isVirtual())
1908 getElementSizeForOpcode(MaskOpcode) ==
1909 getElementSizeForOpcode(PredOpcode)) {
1910 if (Mask == PTestLikeMask || PTest->
getOpcode() == AArch64::PTEST_PP_ANY)
1936 uint64_t PredElementSize = getElementSizeForOpcode(PredOpcode);
1938 PTest->
getOpcode() == AArch64::PTEST_PP_ANY))
1946 switch (PredOpcode) {
1947 case AArch64::AND_PPzPP:
1948 case AArch64::BIC_PPzPP:
1949 case AArch64::EOR_PPzPP:
1950 case AArch64::NAND_PPzPP:
1951 case AArch64::NOR_PPzPP:
1952 case AArch64::ORN_PPzPP:
1953 case AArch64::ORR_PPzPP:
1954 case AArch64::BRKA_PPzP:
1955 case AArch64::BRKPA_PPzPP:
1956 case AArch64::BRKB_PPzP:
1957 case AArch64::BRKPB_PPzPP:
1958 case AArch64::RDFFR_PPz: {
1962 if (Mask != PredMask)
1966 case AArch64::BRKN_PPzP: {
1970 if ((MaskOpcode != AArch64::PTRUE_B) ||
1971 (
Mask->getOperand(1).getImm() != 31))
1975 case AArch64::PTRUE_B:
1988bool AArch64InstrInfo::optimizePTestInstr(
1989 MachineInstr *PTest,
unsigned MaskReg,
unsigned PredReg,
1994 if (Pred->
isCopy() && PTest->
getOpcode() == AArch64::PTEST_PP_FIRST) {
1998 if (
Op.isReg() &&
Op.getReg().isVirtual() &&
1999 Op.getSubReg() == AArch64::psub0)
2003 unsigned PredOpcode = Pred->
getOpcode();
2004 auto NewOp = canRemovePTestInstr(PTest, Mask, Pred, MRI);
2020 if (*NewOp != PredOpcode) {
2031 for (; i !=
e; ++i) {
2062 if (DeadNZCVIdx != -1) {
2081 if (CmpInstr.
getOpcode() == AArch64::PTEST_PP ||
2082 CmpInstr.
getOpcode() == AArch64::PTEST_PP_ANY ||
2083 CmpInstr.
getOpcode() == AArch64::PTEST_PP_FIRST)
2084 return optimizePTestInstr(&CmpInstr, SrcReg, SrcReg2, MRI);
2093 if (CmpValue == 0 && substituteCmpToZero(CmpInstr, SrcReg, *MRI))
2095 return (CmpValue == 0 || CmpValue == 1) &&
2096 removeCmpToZeroOrOne(CmpInstr, SrcReg, CmpValue, *MRI);
2104 switch (Instr.getOpcode()) {
2106 return AArch64::INSTRUCTION_LIST_END;
2108 case AArch64::ADDSWrr:
2109 case AArch64::ADDSWri:
2110 case AArch64::ADDSXrr:
2111 case AArch64::ADDSXri:
2112 case AArch64::ADDSWrx:
2113 case AArch64::ADDSXrx:
2114 case AArch64::ADDSWrs:
2115 case AArch64::ADDSXrs:
2116 case AArch64::SUBSWrr:
2117 case AArch64::SUBSWri:
2118 case AArch64::SUBSWrx:
2119 case AArch64::SUBSWrs:
2120 case AArch64::SUBSXrr:
2121 case AArch64::SUBSXri:
2122 case AArch64::SUBSXrx:
2123 case AArch64::SUBSXrs:
2124 case AArch64::ANDSWri:
2125 case AArch64::ANDSWrr:
2126 case AArch64::ANDSWrs:
2127 case AArch64::ANDSXri:
2128 case AArch64::ANDSXrr:
2129 case AArch64::ANDSXrs:
2130 case AArch64::BICSWrr:
2131 case AArch64::BICSXrr:
2132 case AArch64::BICSWrs:
2133 case AArch64::BICSXrs:
2134 case AArch64::ADCSWr:
2135 case AArch64::ADCSXr:
2136 case AArch64::SBCSWr:
2137 case AArch64::SBCSXr:
2138 return Instr.getOpcode();
2140 case AArch64::ADDWrr:
2141 return AArch64::ADDSWrr;
2142 case AArch64::ADDWri:
2143 return AArch64::ADDSWri;
2144 case AArch64::ADDXrr:
2145 return AArch64::ADDSXrr;
2146 case AArch64::ADDXri:
2147 return AArch64::ADDSXri;
2148 case AArch64::ADDWrx:
2149 return AArch64::ADDSWrx;
2150 case AArch64::ADDXrx:
2151 return AArch64::ADDSXrx;
2152 case AArch64::ADDWrs:
2153 return AArch64::ADDSWrs;
2154 case AArch64::ADDXrs:
2155 return AArch64::ADDSXrs;
2156 case AArch64::ADCWr:
2157 return AArch64::ADCSWr;
2158 case AArch64::ADCXr:
2159 return AArch64::ADCSXr;
2160 case AArch64::SUBWrr:
2161 return AArch64::SUBSWrr;
2162 case AArch64::SUBWri:
2163 return AArch64::SUBSWri;
2164 case AArch64::SUBXrr:
2165 return AArch64::SUBSXrr;
2166 case AArch64::SUBXri:
2167 return AArch64::SUBSXri;
2168 case AArch64::SUBWrx:
2169 return AArch64::SUBSWrx;
2170 case AArch64::SUBXrx:
2171 return AArch64::SUBSXrx;
2172 case AArch64::SUBWrs:
2173 return AArch64::SUBSWrs;
2174 case AArch64::SUBXrs:
2175 return AArch64::SUBSXrs;
2176 case AArch64::SBCWr:
2177 return AArch64::SBCSWr;
2178 case AArch64::SBCXr:
2179 return AArch64::SBCSXr;
2180 case AArch64::ANDWri:
2181 return AArch64::ANDSWri;
2182 case AArch64::ANDXri:
2183 return AArch64::ANDSXri;
2184 case AArch64::ANDWrr:
2185 return AArch64::ANDSWrr;
2186 case AArch64::ANDWrs:
2187 return AArch64::ANDSWrs;
2188 case AArch64::ANDXrr:
2189 return AArch64::ANDSXrr;
2190 case AArch64::ANDXrs:
2191 return AArch64::ANDSXrs;
2192 case AArch64::BICWrr:
2193 return AArch64::BICSWrr;
2194 case AArch64::BICXrr:
2195 return AArch64::BICSXrr;
2196 case AArch64::BICWrs:
2197 return AArch64::BICSWrs;
2198 case AArch64::BICXrs:
2199 return AArch64::BICSXrs;
2205 for (
auto *BB :
MBB->successors())
2206 if (BB->isLiveIn(AArch64::NZCV))
2213int AArch64InstrInfo::findCondCodeUseOperandIdxForBranchOrSelect(
2215 switch (
Instr.getOpcode()) {
2219 case AArch64::Bcc: {
2220 int Idx =
Instr.findRegisterUseOperandIdx(AArch64::NZCV,
nullptr);
2225 case AArch64::CSINVWr:
2226 case AArch64::CSINVXr:
2227 case AArch64::CSINCWr:
2228 case AArch64::CSINCXr:
2229 case AArch64::CSELWr:
2230 case AArch64::CSELXr:
2231 case AArch64::CSNEGWr:
2232 case AArch64::CSNEGXr:
2233 case AArch64::FCSELSrrr:
2234 case AArch64::FCSELDrrr: {
2235 int Idx =
Instr.findRegisterUseOperandIdx(AArch64::NZCV,
nullptr);
2247 AArch64InstrInfo::findCondCodeUseOperandIdxForBranchOrSelect(Instr);
2249 Instr.getOperand(CCIdx).
getImm())
2302std::optional<UsedNZCV>
2307 if (
MI.getParent() != CmpParent)
2308 return std::nullopt;
2311 return std::nullopt;
2316 if (Instr.readsRegister(AArch64::NZCV, &
TRI)) {
2319 return std::nullopt;
2324 if (Instr.modifiesRegister(AArch64::NZCV, &
TRI))
2327 return NZCVUsedAfterCmp;
2331 return Opcode == AArch64::ADDSWri || Opcode == AArch64::ADDSXri;
2335 return Opcode == AArch64::SUBSWri || Opcode == AArch64::SUBSXri;
2341 case AArch64::ANDSWri:
2342 case AArch64::ANDSWrr:
2343 case AArch64::ANDSWrs:
2344 case AArch64::ANDSXri:
2345 case AArch64::ANDSXrr:
2346 case AArch64::ANDSXrs:
2347 case AArch64::BICSWrr:
2348 case AArch64::BICSXrr:
2349 case AArch64::BICSWrs:
2350 case AArch64::BICSXrs:
2376 const unsigned CmpOpcode = CmpInstr.
getOpcode();
2382 "Caller guarantees that CmpInstr compares with constant 0");
2385 if (!NZVCUsed || NZVCUsed->C)
2406bool AArch64InstrInfo::substituteCmpToZero(
2417 if (NewOpc == AArch64::INSTRUCTION_LIST_END)
2424 MI->setDesc(
get(NewOpc));
2429 MI->addRegisterDefined(AArch64::NZCV, &
TRI);
2441 assert((CmpValue == 0 || CmpValue == 1) &&
2442 "Only comparisons to 0 or 1 considered for removal!");
2445 unsigned MIOpc =
MI.getOpcode();
2446 if (MIOpc == AArch64::CSINCWr) {
2447 if (
MI.getOperand(1).getReg() != AArch64::WZR ||
2448 MI.getOperand(2).getReg() != AArch64::WZR)
2450 }
else if (MIOpc == AArch64::CSINCXr) {
2451 if (
MI.getOperand(1).getReg() != AArch64::XZR ||
2452 MI.getOperand(2).getReg() != AArch64::XZR)
2462 if (
MI.findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
true) != -1)
2466 const unsigned CmpOpcode = CmpInstr.
getOpcode();
2468 if (CmpValue && !IsSubsRegImm)
2470 if (!CmpValue && !IsSubsRegImm && !
isADDSRegImm(CmpOpcode))
2475 if (MIUsedNZCV.
C || MIUsedNZCV.
V)
2478 std::optional<UsedNZCV> NZCVUsedAfterCmp =
2482 if (!NZCVUsedAfterCmp || NZCVUsedAfterCmp->C || NZCVUsedAfterCmp->V)
2485 if ((MIUsedNZCV.
Z && NZCVUsedAfterCmp->N) ||
2486 (MIUsedNZCV.
N && NZCVUsedAfterCmp->Z))
2489 if (MIUsedNZCV.
N && !CmpValue)
2531bool AArch64InstrInfo::removeCmpToZeroOrOne(
2538 SmallVector<MachineInstr *, 4> CCUseInstrs;
2539 bool IsInvertCC =
false;
2547 for (MachineInstr *CCUseInstr : CCUseInstrs) {
2548 int Idx = findCondCodeUseOperandIdxForBranchOrSelect(*CCUseInstr);
2549 assert(Idx >= 0 &&
"Unexpected instruction using CC.");
2550 MachineOperand &CCOperand = CCUseInstr->getOperand(Idx);
2559bool AArch64InstrInfo::expandPostRAPseudo(
MachineInstr &
MI)
const {
2560 if (
MI.getOpcode() != TargetOpcode::LOAD_STACK_GUARD &&
2561 MI.getOpcode() != AArch64::CATCHRET &&
2562 MI.getOpcode() != AArch64::STACK_GUARD_UNMIX)
2567 auto TRI = Subtarget.getRegisterInfo();
2570 if (
MI.getOpcode() == AArch64::STACK_GUARD_UNMIX) {
2584 if (
MI.getOpcode() == AArch64::CATCHRET) {
2586 const TargetInstrInfo *
TII =
2588 MachineBasicBlock *TargetMBB =
MI.getOperand(0).getMBB();
2593 FirstEpilogSEH = std::prev(FirstEpilogSEH);
2595 FirstEpilogSEH = std::next(FirstEpilogSEH);
2610 if (
M.getStackProtectorGuard() ==
"sysreg") {
2611 const AArch64SysReg::SysReg *SrcReg =
2612 AArch64SysReg::lookupSysRegByName(
M.getStackProtectorGuardReg());
2620 int Offset =
M.getStackProtectorGuardOffset();
2671 const GlobalValue *GV =
2674 unsigned OpFlags = Subtarget.ClassifyGlobalReference(GV, TM);
2677 unsigned GuardWidth =
M.getStackProtectorGuardValueWidth().value_or(
2678 Subtarget.isTargetILP32() ? 4 : 8);
2679 if (GuardWidth != 4 && GuardWidth != 8)
2684 if (GuardWidth == 4) {
2685 unsigned Reg32 =
TRI->getSubReg(
Reg, AArch64::sub_32);
2714 if (GuardWidth == 4) {
2715 unsigned Reg32 =
TRI->getSubReg(
Reg, AArch64::sub_32);
2732 if (GuardWidth == 4) {
2733 unsigned Reg32 =
TRI->getSubReg(
Reg, AArch64::sub_32);
2751 if (Subtarget.getTargetTriple().isOSMSVCRT())
2764 switch (
MI.getOpcode()) {
2767 case AArch64::MOVZWi:
2768 case AArch64::MOVZXi:
2769 if (
MI.getOperand(1).isImm() &&
MI.getOperand(1).getImm() == 0) {
2770 assert(
MI.getDesc().getNumOperands() == 3 &&
2771 MI.getOperand(2).getImm() == 0 &&
"invalid MOVZi operands");
2775 case AArch64::ANDWri:
2776 return MI.getOperand(1).getReg() == AArch64::WZR;
2777 case AArch64::ANDXri:
2778 return MI.getOperand(1).getReg() == AArch64::XZR;
2779 case TargetOpcode::COPY:
2780 return MI.getOperand(1).getReg() == AArch64::WZR;
2788 switch (
MI.getOpcode()) {
2791 case TargetOpcode::COPY: {
2794 return (AArch64::GPR32RegClass.
contains(DstReg) ||
2795 AArch64::GPR64RegClass.
contains(DstReg));
2797 case AArch64::ORRXrs:
2798 if (
MI.getOperand(1).getReg() == AArch64::XZR) {
2799 assert(
MI.getDesc().getNumOperands() == 4 &&
2800 MI.getOperand(3).getImm() == 0 &&
"invalid ORRrs operands");
2804 case AArch64::ADDXri:
2805 if (
MI.getOperand(2).getImm() == 0) {
2806 assert(
MI.getDesc().getNumOperands() == 4 &&
2807 MI.getOperand(3).getImm() == 0 &&
"invalid ADDXri operands");
2818 switch (
MI.getOpcode()) {
2821 case TargetOpcode::COPY: {
2823 return AArch64::FPR128RegClass.contains(DstReg);
2825 case AArch64::ORRv16i8:
2826 if (
MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg()) {
2827 assert(
MI.getDesc().getNumOperands() == 3 &&
MI.getOperand(0).isReg() &&
2828 "invalid ORRv16i8 operands");
2840 case AArch64::LDRWui:
2841 case AArch64::LDRXui:
2842 case AArch64::LDRBui:
2843 case AArch64::LDRHui:
2844 case AArch64::LDRSui:
2845 case AArch64::LDRDui:
2846 case AArch64::LDRQui:
2847 case AArch64::LDR_PXI:
2853 int &FrameIndex)
const {
2857 if (
MI.getOperand(0).getSubReg() == 0 &&
MI.getOperand(1).isFI() &&
2858 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) {
2859 FrameIndex =
MI.getOperand(1).getIndex();
2860 return MI.getOperand(0).getReg();
2869 case AArch64::STRWui:
2870 case AArch64::STRXui:
2871 case AArch64::STRBui:
2872 case AArch64::STRHui:
2873 case AArch64::STRSui:
2874 case AArch64::STRDui:
2875 case AArch64::STRQui:
2876 case AArch64::STR_PXI:
2882 int &FrameIndex)
const {
2886 if (
MI.getOperand(0).getSubReg() == 0 &&
MI.getOperand(1).isFI() &&
2887 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) {
2888 FrameIndex =
MI.getOperand(1).getIndex();
2889 return MI.getOperand(0).getReg();
2895 int &FrameIndex)
const {
2910 return MI.getOperand(0).getReg();
2916 int &FrameIndex)
const {
2931 return MI.getOperand(0).getReg();
2939 return MMO->getFlags() & MOSuppressPair;
2945 if (
MI.memoperands_empty())
2953 return MMO->getFlags() & MOStridedAccess;
2961 case AArch64::STURSi:
2962 case AArch64::STRSpre:
2963 case AArch64::STURDi:
2964 case AArch64::STRDpre:
2965 case AArch64::STURQi:
2966 case AArch64::STRQpre:
2967 case AArch64::STURBBi:
2968 case AArch64::STURHHi:
2969 case AArch64::STURWi:
2970 case AArch64::STRWpre:
2971 case AArch64::STURXi:
2972 case AArch64::STRXpre:
2973 case AArch64::LDURSi:
2974 case AArch64::LDRSpre:
2975 case AArch64::LDURDi:
2976 case AArch64::LDRDpre:
2977 case AArch64::LDURQi:
2978 case AArch64::LDRQpre:
2979 case AArch64::LDURWi:
2980 case AArch64::LDRWpre:
2981 case AArch64::LDURXi:
2982 case AArch64::LDRXpre:
2983 case AArch64::LDRSWpre:
2984 case AArch64::LDURSWi:
2985 case AArch64::LDURHHi:
2986 case AArch64::LDURBBi:
2987 case AArch64::LDURSBWi:
2988 case AArch64::LDURSHWi:
2996 case AArch64::PRFMui:
return AArch64::PRFUMi;
2997 case AArch64::LDRXui:
return AArch64::LDURXi;
2998 case AArch64::LDRWui:
return AArch64::LDURWi;
2999 case AArch64::LDRBui:
return AArch64::LDURBi;
3000 case AArch64::LDRHui:
return AArch64::LDURHi;
3001 case AArch64::LDRSui:
return AArch64::LDURSi;
3002 case AArch64::LDRDui:
return AArch64::LDURDi;
3003 case AArch64::LDRQui:
return AArch64::LDURQi;
3004 case AArch64::LDRBBui:
return AArch64::LDURBBi;
3005 case AArch64::LDRHHui:
return AArch64::LDURHHi;
3006 case AArch64::LDRSBXui:
return AArch64::LDURSBXi;
3007 case AArch64::LDRSBWui:
return AArch64::LDURSBWi;
3008 case AArch64::LDRSHXui:
return AArch64::LDURSHXi;
3009 case AArch64::LDRSHWui:
return AArch64::LDURSHWi;
3010 case AArch64::LDRSWui:
return AArch64::LDURSWi;
3011 case AArch64::STRXui:
return AArch64::STURXi;
3012 case AArch64::STRWui:
return AArch64::STURWi;
3013 case AArch64::STRBui:
return AArch64::STURBi;
3014 case AArch64::STRHui:
return AArch64::STURHi;
3015 case AArch64::STRSui:
return AArch64::STURSi;
3016 case AArch64::STRDui:
return AArch64::STURDi;
3017 case AArch64::STRQui:
return AArch64::STURQi;
3018 case AArch64::STRBBui:
return AArch64::STURBBi;
3019 case AArch64::STRHHui:
return AArch64::STURHHi;
3028 case AArch64::LDAPURBi:
3029 case AArch64::LDAPURHi:
3030 case AArch64::LDAPURi:
3031 case AArch64::LDAPURSBWi:
3032 case AArch64::LDAPURSBXi:
3033 case AArch64::LDAPURSHWi:
3034 case AArch64::LDAPURSHXi:
3035 case AArch64::LDAPURSWi:
3036 case AArch64::LDAPURXi:
3037 case AArch64::LDR_PPXI:
3038 case AArch64::LDR_PXI:
3039 case AArch64::LDR_ZXI:
3040 case AArch64::LDR_ZZXI:
3041 case AArch64::LDR_ZZXI_STRIDED_CONTIGUOUS:
3042 case AArch64::LDR_ZZZXI:
3043 case AArch64::LDR_ZZZZXI:
3044 case AArch64::LDR_ZZZZXI_STRIDED_CONTIGUOUS:
3045 case AArch64::LDRBBui:
3046 case AArch64::LDRBui:
3047 case AArch64::LDRDui:
3048 case AArch64::LDRHHui:
3049 case AArch64::LDRHui:
3050 case AArch64::LDRQui:
3051 case AArch64::LDRSBWui:
3052 case AArch64::LDRSBXui:
3053 case AArch64::LDRSHWui:
3054 case AArch64::LDRSHXui:
3055 case AArch64::LDRSui:
3056 case AArch64::LDRSWui:
3057 case AArch64::LDRWui:
3058 case AArch64::LDRXui:
3059 case AArch64::LDURBBi:
3060 case AArch64::LDURBi:
3061 case AArch64::LDURDi:
3062 case AArch64::LDURHHi:
3063 case AArch64::LDURHi:
3064 case AArch64::LDURQi:
3065 case AArch64::LDURSBWi:
3066 case AArch64::LDURSBXi:
3067 case AArch64::LDURSHWi:
3068 case AArch64::LDURSHXi:
3069 case AArch64::LDURSi:
3070 case AArch64::LDURSWi:
3071 case AArch64::LDURWi:
3072 case AArch64::LDURXi:
3073 case AArch64::PRFMui:
3074 case AArch64::PRFUMi:
3075 case AArch64::ST2Gi:
3077 case AArch64::STLURBi:
3078 case AArch64::STLURHi:
3079 case AArch64::STLURWi:
3080 case AArch64::STLURXi:
3081 case AArch64::StoreSwiftAsyncContext:
3082 case AArch64::STR_PPXI:
3083 case AArch64::STR_PXI:
3084 case AArch64::STR_ZXI:
3085 case AArch64::STR_ZZXI:
3086 case AArch64::STR_ZZXI_STRIDED_CONTIGUOUS:
3087 case AArch64::STR_ZZZXI:
3088 case AArch64::STR_ZZZZXI:
3089 case AArch64::STR_ZZZZXI_STRIDED_CONTIGUOUS:
3090 case AArch64::STRBBui:
3091 case AArch64::STRBui:
3092 case AArch64::STRDui:
3093 case AArch64::STRHHui:
3094 case AArch64::STRHui:
3095 case AArch64::STRQui:
3096 case AArch64::STRSui:
3097 case AArch64::STRWui:
3098 case AArch64::STRXui:
3099 case AArch64::STURBBi:
3100 case AArch64::STURBi:
3101 case AArch64::STURDi:
3102 case AArch64::STURHHi:
3103 case AArch64::STURHi:
3104 case AArch64::STURQi:
3105 case AArch64::STURSi:
3106 case AArch64::STURWi:
3107 case AArch64::STURXi:
3108 case AArch64::STZ2Gi:
3109 case AArch64::STZGi:
3110 case AArch64::TAGPstack:
3112 case AArch64::LD1B_D_IMM:
3113 case AArch64::LD1B_H_IMM:
3114 case AArch64::LD1B_IMM:
3115 case AArch64::LD1B_S_IMM:
3116 case AArch64::LD1D_IMM:
3117 case AArch64::LD1H_D_IMM:
3118 case AArch64::LD1H_IMM:
3119 case AArch64::LD1H_S_IMM:
3120 case AArch64::LD1RB_D_IMM:
3121 case AArch64::LD1RB_H_IMM:
3122 case AArch64::LD1RB_IMM:
3123 case AArch64::LD1RB_S_IMM:
3124 case AArch64::LD1RD_IMM:
3125 case AArch64::LD1RH_D_IMM:
3126 case AArch64::LD1RH_IMM:
3127 case AArch64::LD1RH_S_IMM:
3128 case AArch64::LD1RSB_D_IMM:
3129 case AArch64::LD1RSB_H_IMM:
3130 case AArch64::LD1RSB_S_IMM:
3131 case AArch64::LD1RSH_D_IMM:
3132 case AArch64::LD1RSH_S_IMM:
3133 case AArch64::LD1RSW_IMM:
3134 case AArch64::LD1RW_D_IMM:
3135 case AArch64::LD1RW_IMM:
3136 case AArch64::LD1SB_D_IMM:
3137 case AArch64::LD1SB_H_IMM:
3138 case AArch64::LD1SB_S_IMM:
3139 case AArch64::LD1SH_D_IMM:
3140 case AArch64::LD1SH_S_IMM:
3141 case AArch64::LD1SW_D_IMM:
3142 case AArch64::LD1W_D_IMM:
3143 case AArch64::LD1W_IMM:
3144 case AArch64::LD2B_IMM:
3145 case AArch64::LD2D_IMM:
3146 case AArch64::LD2H_IMM:
3147 case AArch64::LD2W_IMM:
3148 case AArch64::LD3B_IMM:
3149 case AArch64::LD3D_IMM:
3150 case AArch64::LD3H_IMM:
3151 case AArch64::LD3W_IMM:
3152 case AArch64::LD4B_IMM:
3153 case AArch64::LD4D_IMM:
3154 case AArch64::LD4H_IMM:
3155 case AArch64::LD4W_IMM:
3157 case AArch64::LDNF1B_D_IMM:
3158 case AArch64::LDNF1B_H_IMM:
3159 case AArch64::LDNF1B_IMM:
3160 case AArch64::LDNF1B_S_IMM:
3161 case AArch64::LDNF1D_IMM:
3162 case AArch64::LDNF1H_D_IMM:
3163 case AArch64::LDNF1H_IMM:
3164 case AArch64::LDNF1H_S_IMM:
3165 case AArch64::LDNF1SB_D_IMM:
3166 case AArch64::LDNF1SB_H_IMM:
3167 case AArch64::LDNF1SB_S_IMM:
3168 case AArch64::LDNF1SH_D_IMM:
3169 case AArch64::LDNF1SH_S_IMM:
3170 case AArch64::LDNF1SW_D_IMM:
3171 case AArch64::LDNF1W_D_IMM:
3172 case AArch64::LDNF1W_IMM:
3173 case AArch64::LDNPDi:
3174 case AArch64::LDNPQi:
3175 case AArch64::LDNPSi:
3176 case AArch64::LDNPWi:
3177 case AArch64::LDNPXi:
3178 case AArch64::LDNT1B_ZRI:
3179 case AArch64::LDNT1D_ZRI:
3180 case AArch64::LDNT1H_ZRI:
3181 case AArch64::LDNT1W_ZRI:
3182 case AArch64::LDPDi:
3183 case AArch64::LDPQi:
3184 case AArch64::LDPSi:
3185 case AArch64::LDPWi:
3186 case AArch64::LDPXi:
3187 case AArch64::LDRBBpost:
3188 case AArch64::LDRBBpre:
3189 case AArch64::LDRBpost:
3190 case AArch64::LDRBpre:
3191 case AArch64::LDRDpost:
3192 case AArch64::LDRDpre:
3193 case AArch64::LDRHHpost:
3194 case AArch64::LDRHHpre:
3195 case AArch64::LDRHpost:
3196 case AArch64::LDRHpre:
3197 case AArch64::LDRQpost:
3198 case AArch64::LDRQpre:
3199 case AArch64::LDRSpost:
3200 case AArch64::LDRSpre:
3201 case AArch64::LDRWpost:
3202 case AArch64::LDRWpre:
3203 case AArch64::LDRXpost:
3204 case AArch64::LDRXpre:
3205 case AArch64::ST1B_D_IMM:
3206 case AArch64::ST1B_H_IMM:
3207 case AArch64::ST1B_IMM:
3208 case AArch64::ST1B_S_IMM:
3209 case AArch64::ST1D_IMM:
3210 case AArch64::ST1H_D_IMM:
3211 case AArch64::ST1H_IMM:
3212 case AArch64::ST1H_S_IMM:
3213 case AArch64::ST1W_D_IMM:
3214 case AArch64::ST1W_IMM:
3215 case AArch64::ST2B_IMM:
3216 case AArch64::ST2D_IMM:
3217 case AArch64::ST2H_IMM:
3218 case AArch64::ST2W_IMM:
3219 case AArch64::ST3B_IMM:
3220 case AArch64::ST3D_IMM:
3221 case AArch64::ST3H_IMM:
3222 case AArch64::ST3W_IMM:
3223 case AArch64::ST4B_IMM:
3224 case AArch64::ST4D_IMM:
3225 case AArch64::ST4H_IMM:
3226 case AArch64::ST4W_IMM:
3227 case AArch64::STGPi:
3228 case AArch64::STGPreIndex:
3229 case AArch64::STZGPreIndex:
3230 case AArch64::ST2GPreIndex:
3231 case AArch64::STZ2GPreIndex:
3232 case AArch64::STGPostIndex:
3233 case AArch64::STZGPostIndex:
3234 case AArch64::ST2GPostIndex:
3235 case AArch64::STZ2GPostIndex:
3236 case AArch64::STNPDi:
3237 case AArch64::STNPQi:
3238 case AArch64::STNPSi:
3239 case AArch64::STNPWi:
3240 case AArch64::STNPXi:
3241 case AArch64::STNT1B_ZRI:
3242 case AArch64::STNT1D_ZRI:
3243 case AArch64::STNT1H_ZRI:
3244 case AArch64::STNT1W_ZRI:
3245 case AArch64::STPDi:
3246 case AArch64::STPQi:
3247 case AArch64::STPSi:
3248 case AArch64::STPWi:
3249 case AArch64::STPXi:
3250 case AArch64::STRBBpost:
3251 case AArch64::STRBBpre:
3252 case AArch64::STRBpost:
3253 case AArch64::STRBpre:
3254 case AArch64::STRDpost:
3255 case AArch64::STRDpre:
3256 case AArch64::STRHHpost:
3257 case AArch64::STRHHpre:
3258 case AArch64::STRHpost:
3259 case AArch64::STRHpre:
3260 case AArch64::STRQpost:
3261 case AArch64::STRQpre:
3262 case AArch64::STRSpost:
3263 case AArch64::STRSpre:
3264 case AArch64::STRWpost:
3265 case AArch64::STRWpre:
3266 case AArch64::STRXpost:
3267 case AArch64::STRXpre:
3268 case AArch64::LD1B_2Z_IMM:
3269 case AArch64::LD1B_2Z_STRIDED_IMM:
3270 case AArch64::LD1H_2Z_IMM:
3271 case AArch64::LD1H_2Z_STRIDED_IMM:
3272 case AArch64::LD1W_2Z_IMM:
3273 case AArch64::LD1W_2Z_STRIDED_IMM:
3274 case AArch64::LD1D_2Z_IMM:
3275 case AArch64::LD1D_2Z_STRIDED_IMM:
3276 case AArch64::LD1B_4Z_IMM:
3277 case AArch64::LD1B_4Z_STRIDED_IMM:
3278 case AArch64::LD1H_4Z_IMM:
3279 case AArch64::LD1H_4Z_STRIDED_IMM:
3280 case AArch64::LD1W_4Z_IMM:
3281 case AArch64::LD1W_4Z_STRIDED_IMM:
3282 case AArch64::LD1D_4Z_IMM:
3283 case AArch64::LD1D_4Z_STRIDED_IMM:
3284 case AArch64::LD1B_2Z_IMM_PSEUDO:
3285 case AArch64::LD1H_2Z_IMM_PSEUDO:
3286 case AArch64::LD1W_2Z_IMM_PSEUDO:
3287 case AArch64::LD1D_2Z_IMM_PSEUDO:
3288 case AArch64::LD1B_4Z_IMM_PSEUDO:
3289 case AArch64::LD1H_4Z_IMM_PSEUDO:
3290 case AArch64::LD1W_4Z_IMM_PSEUDO:
3291 case AArch64::LD1D_4Z_IMM_PSEUDO:
3292 case AArch64::ST1B_2Z_IMM:
3293 case AArch64::ST1B_2Z_STRIDED_IMM:
3294 case AArch64::ST1H_2Z_IMM:
3295 case AArch64::ST1H_2Z_STRIDED_IMM:
3296 case AArch64::ST1W_2Z_IMM:
3297 case AArch64::ST1W_2Z_STRIDED_IMM:
3298 case AArch64::ST1D_2Z_IMM:
3299 case AArch64::ST1D_2Z_STRIDED_IMM:
3300 case AArch64::LDNT1B_2Z_IMM_PSEUDO:
3301 case AArch64::LDNT1B_2Z_IMM:
3302 case AArch64::LDNT1B_2Z_STRIDED_IMM:
3303 case AArch64::LDNT1H_2Z_IMM_PSEUDO:
3304 case AArch64::LDNT1H_2Z_IMM:
3305 case AArch64::LDNT1H_2Z_STRIDED_IMM:
3306 case AArch64::LDNT1W_2Z_IMM_PSEUDO:
3307 case AArch64::LDNT1W_2Z_IMM:
3308 case AArch64::LDNT1W_2Z_STRIDED_IMM:
3309 case AArch64::LDNT1D_2Z_IMM_PSEUDO:
3310 case AArch64::LDNT1D_2Z_IMM:
3311 case AArch64::LDNT1D_2Z_STRIDED_IMM:
3312 case AArch64::STNT1B_2Z_IMM:
3313 case AArch64::STNT1B_2Z_STRIDED_IMM:
3314 case AArch64::STNT1H_2Z_IMM:
3315 case AArch64::STNT1H_2Z_STRIDED_IMM:
3316 case AArch64::STNT1W_2Z_IMM:
3317 case AArch64::STNT1W_2Z_STRIDED_IMM:
3318 case AArch64::STNT1D_2Z_IMM:
3319 case AArch64::STNT1D_2Z_STRIDED_IMM:
3320 case AArch64::ST1B_2Z_IMM_PSEUDO:
3321 case AArch64::ST1H_2Z_IMM_PSEUDO:
3322 case AArch64::ST1W_2Z_IMM_PSEUDO:
3323 case AArch64::ST1D_2Z_IMM_PSEUDO:
3324 case AArch64::STNT1B_2Z_IMM_PSEUDO:
3325 case AArch64::STNT1H_2Z_IMM_PSEUDO:
3326 case AArch64::STNT1W_2Z_IMM_PSEUDO:
3327 case AArch64::STNT1D_2Z_IMM_PSEUDO:
3328 case AArch64::ST1B_4Z_IMM:
3329 case AArch64::ST1B_4Z_STRIDED_IMM:
3330 case AArch64::ST1H_4Z_IMM:
3331 case AArch64::ST1H_4Z_STRIDED_IMM:
3332 case AArch64::ST1W_4Z_IMM:
3333 case AArch64::ST1W_4Z_STRIDED_IMM:
3334 case AArch64::ST1D_4Z_IMM:
3335 case AArch64::ST1D_4Z_STRIDED_IMM:
3336 case AArch64::LDNT1B_4Z_IMM_PSEUDO:
3337 case AArch64::LDNT1B_4Z_IMM:
3338 case AArch64::LDNT1B_4Z_STRIDED_IMM:
3339 case AArch64::LDNT1H_4Z_IMM_PSEUDO:
3340 case AArch64::LDNT1H_4Z_IMM:
3341 case AArch64::LDNT1H_4Z_STRIDED_IMM:
3342 case AArch64::LDNT1W_4Z_IMM_PSEUDO:
3343 case AArch64::LDNT1W_4Z_IMM:
3344 case AArch64::LDNT1W_4Z_STRIDED_IMM:
3345 case AArch64::LDNT1D_4Z_IMM_PSEUDO:
3346 case AArch64::LDNT1D_4Z_IMM:
3347 case AArch64::LDNT1D_4Z_STRIDED_IMM:
3348 case AArch64::STNT1B_4Z_IMM:
3349 case AArch64::STNT1B_4Z_STRIDED_IMM:
3350 case AArch64::STNT1H_4Z_IMM:
3351 case AArch64::STNT1H_4Z_STRIDED_IMM:
3352 case AArch64::STNT1W_4Z_IMM:
3353 case AArch64::STNT1W_4Z_STRIDED_IMM:
3354 case AArch64::STNT1D_4Z_IMM:
3355 case AArch64::STNT1D_4Z_STRIDED_IMM:
3356 case AArch64::ST1B_4Z_IMM_PSEUDO:
3357 case AArch64::ST1H_4Z_IMM_PSEUDO:
3358 case AArch64::ST1W_4Z_IMM_PSEUDO:
3359 case AArch64::ST1D_4Z_IMM_PSEUDO:
3360 case AArch64::STNT1B_4Z_IMM_PSEUDO:
3361 case AArch64::STNT1H_4Z_IMM_PSEUDO:
3362 case AArch64::STNT1W_4Z_IMM_PSEUDO:
3363 case AArch64::STNT1D_4Z_IMM_PSEUDO:
3365 case AArch64::LDPDpost:
3366 case AArch64::LDPDpre:
3367 case AArch64::LDPQpost:
3368 case AArch64::LDPQpre:
3369 case AArch64::LDPSpost:
3370 case AArch64::LDPSpre:
3371 case AArch64::LDPWpost:
3372 case AArch64::LDPWpre:
3373 case AArch64::LDPXpost:
3374 case AArch64::LDPXpre:
3375 case AArch64::STGPpre:
3376 case AArch64::STGPpost:
3377 case AArch64::STPDpost:
3378 case AArch64::STPDpre:
3379 case AArch64::STPQpost:
3380 case AArch64::STPQpre:
3381 case AArch64::STPSpost:
3382 case AArch64::STPSpre:
3383 case AArch64::STPWpost:
3384 case AArch64::STPWpre:
3385 case AArch64::STPXpost:
3386 case AArch64::STPXpre:
3392 switch (
MI.getOpcode()) {
3396 case AArch64::STRSui:
3397 case AArch64::STRDui:
3398 case AArch64::STRQui:
3399 case AArch64::STRXui:
3400 case AArch64::STRWui:
3401 case AArch64::LDRSui:
3402 case AArch64::LDRDui:
3403 case AArch64::LDRQui:
3404 case AArch64::LDRXui:
3405 case AArch64::LDRWui:
3406 case AArch64::LDRSWui:
3408 case AArch64::STURSi:
3409 case AArch64::STRSpre:
3410 case AArch64::STURDi:
3411 case AArch64::STRDpre:
3412 case AArch64::STURQi:
3413 case AArch64::STRQpre:
3414 case AArch64::STURWi:
3415 case AArch64::STRWpre:
3416 case AArch64::STURXi:
3417 case AArch64::STRXpre:
3418 case AArch64::LDURSi:
3419 case AArch64::LDRSpre:
3420 case AArch64::LDURDi:
3421 case AArch64::LDRDpre:
3422 case AArch64::LDURQi:
3423 case AArch64::LDRQpre:
3424 case AArch64::LDURWi:
3425 case AArch64::LDRWpre:
3426 case AArch64::LDURXi:
3427 case AArch64::LDRXpre:
3428 case AArch64::LDURSWi:
3429 case AArch64::LDRSWpre:
3431 case AArch64::LDR_ZXI:
3432 case AArch64::STR_ZXI:
3438 switch (
MI.getOpcode()) {
3441 "Unexpected instruction - was a new tail call opcode introduced?");
3443 case AArch64::TCRETURNdi:
3444 case AArch64::TCRETURNri:
3445 case AArch64::TCRETURNrix16x17:
3446 case AArch64::TCRETURNrix17:
3447 case AArch64::TCRETURNrinotx16:
3448 case AArch64::TCRETURNriALL:
3449 case AArch64::AUTH_TCRETURN:
3450 case AArch64::AUTH_TCRETURN_BTI:
3460 case AArch64::ADDWri:
3461 return AArch64::ADDSWri;
3462 case AArch64::ADDWrr:
3463 return AArch64::ADDSWrr;
3464 case AArch64::ADDWrs:
3465 return AArch64::ADDSWrs;
3466 case AArch64::ADDWrx:
3467 return AArch64::ADDSWrx;
3468 case AArch64::ANDWri:
3469 return AArch64::ANDSWri;
3470 case AArch64::ANDWrr:
3471 return AArch64::ANDSWrr;
3472 case AArch64::ANDWrs:
3473 return AArch64::ANDSWrs;
3474 case AArch64::BICWrr:
3475 return AArch64::BICSWrr;
3476 case AArch64::BICWrs:
3477 return AArch64::BICSWrs;
3478 case AArch64::SUBWri:
3479 return AArch64::SUBSWri;
3480 case AArch64::SUBWrr:
3481 return AArch64::SUBSWrr;
3482 case AArch64::SUBWrs:
3483 return AArch64::SUBSWrs;
3484 case AArch64::SUBWrx:
3485 return AArch64::SUBSWrx;
3487 case AArch64::ADDXri:
3488 return AArch64::ADDSXri;
3489 case AArch64::ADDXrr:
3490 return AArch64::ADDSXrr;
3491 case AArch64::ADDXrs:
3492 return AArch64::ADDSXrs;
3493 case AArch64::ADDXrx:
3494 return AArch64::ADDSXrx;
3495 case AArch64::ANDXri:
3496 return AArch64::ANDSXri;
3497 case AArch64::ANDXrr:
3498 return AArch64::ANDSXrr;
3499 case AArch64::ANDXrs:
3500 return AArch64::ANDSXrs;
3501 case AArch64::BICXrr:
3502 return AArch64::BICSXrr;
3503 case AArch64::BICXrs:
3504 return AArch64::BICSXrs;
3505 case AArch64::SUBXri:
3506 return AArch64::SUBSXri;
3507 case AArch64::SUBXrr:
3508 return AArch64::SUBSXrr;
3509 case AArch64::SUBXrs:
3510 return AArch64::SUBSXrs;
3511 case AArch64::SUBXrx:
3512 return AArch64::SUBSXrx;
3514 case AArch64::AND_PPzPP:
3515 return AArch64::ANDS_PPzPP;
3516 case AArch64::BIC_PPzPP:
3517 return AArch64::BICS_PPzPP;
3518 case AArch64::EOR_PPzPP:
3519 return AArch64::EORS_PPzPP;
3520 case AArch64::NAND_PPzPP:
3521 return AArch64::NANDS_PPzPP;
3522 case AArch64::NOR_PPzPP:
3523 return AArch64::NORS_PPzPP;
3524 case AArch64::ORN_PPzPP:
3525 return AArch64::ORNS_PPzPP;
3526 case AArch64::ORR_PPzPP:
3527 return AArch64::ORRS_PPzPP;
3528 case AArch64::BRKA_PPzP:
3529 return AArch64::BRKAS_PPzP;
3530 case AArch64::BRKPA_PPzPP:
3531 return AArch64::BRKPAS_PPzPP;
3532 case AArch64::BRKB_PPzP:
3533 return AArch64::BRKBS_PPzP;
3534 case AArch64::BRKPB_PPzPP:
3535 return AArch64::BRKPBS_PPzPP;
3536 case AArch64::BRKN_PPzP:
3537 return AArch64::BRKNS_PPzP;
3538 case AArch64::RDFFR_PPz:
3539 return AArch64::RDFFRS_PPz;
3540 case AArch64::PTRUE_B:
3541 return AArch64::PTRUES_B;
3552 if (
MI.hasOrderedMemoryRef())
3557 assert((
MI.getOperand(IsPreLdSt ? 2 : 1).isReg() ||
3558 MI.getOperand(IsPreLdSt ? 2 : 1).isFI()) &&
3559 "Expected a reg or frame index operand.");
3563 bool IsImmPreLdSt = IsPreLdSt &&
MI.getOperand(3).isImm();
3565 if (!
MI.getOperand(2).isImm() && !IsImmPreLdSt)
3578 if (
MI.getOperand(1).isReg() && !IsPreLdSt) {
3579 Register BaseReg =
MI.getOperand(1).getReg();
3581 if (
MI.modifiesRegister(BaseReg,
TRI))
3587 switch (
MI.getOpcode()) {
3590 case AArch64::LDR_ZXI:
3591 case AArch64::STR_ZXI:
3592 if (!Subtarget.isLittleEndian() ||
3593 Subtarget.getSVEVectorSizeInBits() != 128)
3606 const MCAsmInfo &MAI =
MI.getMF()->getTarget().getMCAsmInfo();
3614 if (Subtarget.isPaired128Slow()) {
3615 switch (
MI.getOpcode()) {
3618 case AArch64::LDURQi:
3619 case AArch64::STURQi:
3620 case AArch64::LDRQui:
3621 case AArch64::STRQui:
3648std::optional<ExtAddrMode>
3653 bool OffsetIsScalable;
3654 if (!getMemOperandWithOffset(MemI,
Base,
Offset, OffsetIsScalable,
TRI))
3655 return std::nullopt;
3658 return std::nullopt;
3673 int64_t OffsetScale = 1;
3678 case AArch64::LDURQi:
3679 case AArch64::STURQi:
3683 case AArch64::LDURDi:
3684 case AArch64::STURDi:
3685 case AArch64::LDURXi:
3686 case AArch64::STURXi:
3690 case AArch64::LDURWi:
3691 case AArch64::LDURSWi:
3692 case AArch64::STURWi:
3696 case AArch64::LDURHi:
3697 case AArch64::STURHi:
3698 case AArch64::LDURHHi:
3699 case AArch64::STURHHi:
3700 case AArch64::LDURSHXi:
3701 case AArch64::LDURSHWi:
3705 case AArch64::LDRBroX:
3706 case AArch64::LDRBBroX:
3707 case AArch64::LDRSBXroX:
3708 case AArch64::LDRSBWroX:
3709 case AArch64::STRBroX:
3710 case AArch64::STRBBroX:
3711 case AArch64::LDURBi:
3712 case AArch64::LDURBBi:
3713 case AArch64::LDURSBXi:
3714 case AArch64::LDURSBWi:
3715 case AArch64::STURBi:
3716 case AArch64::STURBBi:
3717 case AArch64::LDRBui:
3718 case AArch64::LDRBBui:
3719 case AArch64::LDRSBXui:
3720 case AArch64::LDRSBWui:
3721 case AArch64::STRBui:
3722 case AArch64::STRBBui:
3726 case AArch64::LDRQroX:
3727 case AArch64::STRQroX:
3728 case AArch64::LDRQui:
3729 case AArch64::STRQui:
3734 case AArch64::LDRDroX:
3735 case AArch64::STRDroX:
3736 case AArch64::LDRXroX:
3737 case AArch64::STRXroX:
3738 case AArch64::LDRDui:
3739 case AArch64::STRDui:
3740 case AArch64::LDRXui:
3741 case AArch64::STRXui:
3746 case AArch64::LDRWroX:
3747 case AArch64::LDRSWroX:
3748 case AArch64::STRWroX:
3749 case AArch64::LDRWui:
3750 case AArch64::LDRSWui:
3751 case AArch64::STRWui:
3756 case AArch64::LDRHroX:
3757 case AArch64::STRHroX:
3758 case AArch64::LDRHHroX:
3759 case AArch64::STRHHroX:
3760 case AArch64::LDRSHXroX:
3761 case AArch64::LDRSHWroX:
3762 case AArch64::LDRHui:
3763 case AArch64::STRHui:
3764 case AArch64::LDRHHui:
3765 case AArch64::STRHHui:
3766 case AArch64::LDRSHXui:
3767 case AArch64::LDRSHWui:
3775 if (BaseRegOp.
isReg() && BaseRegOp.
getReg() == Reg)
3799 case AArch64::SBFMXri:
3812 AM.
Scale = OffsetScale;
3817 case TargetOpcode::SUBREG_TO_REG: {
3833 if (
DefMI.getOpcode() != AArch64::ORRWrs ||
3834 DefMI.getOperand(1).getReg() != AArch64::WZR ||
3835 DefMI.getOperand(3).getImm() != 0)
3842 AM.
Scale = OffsetScale;
3853 auto validateOffsetForLDP = [](
unsigned NumBytes, int64_t OldOffset,
3854 int64_t NewOffset) ->
bool {
3855 int64_t MinOffset, MaxOffset;
3872 return OldOffset < MinOffset || OldOffset > MaxOffset ||
3873 (NewOffset >= MinOffset && NewOffset <= MaxOffset);
3875 auto canFoldAddSubImmIntoAddrMode = [&](int64_t Disp) ->
bool {
3877 int64_t NewOffset = OldOffset + Disp;
3878 if (!isLegalAddressingMode(NumBytes, NewOffset, 0))
3882 if (!validateOffsetForLDP(NumBytes, OldOffset, NewOffset))
3892 auto canFoldAddRegIntoAddrMode =
3897 if ((
unsigned)Scale != Scale)
3899 if (!isLegalAddressingMode(NumBytes, 0, Scale))
3911 return (Opcode == AArch64::STURQi || Opcode == AArch64::STRQui) &&
3912 Subtarget.isSTRQroSlow();
3921 case AArch64::ADDXri:
3927 return canFoldAddSubImmIntoAddrMode(Disp);
3929 case AArch64::SUBXri:
3935 return canFoldAddSubImmIntoAddrMode(-Disp);
3937 case AArch64::ADDXrs: {
3950 if (Shift != 2 && Shift != 3 && Subtarget.hasAddrLSLSlow14())
3952 if (avoidSlowSTRQ(MemI))
3955 return canFoldAddRegIntoAddrMode(1ULL << Shift);
3958 case AArch64::ADDXrr:
3966 if (!OptSize && avoidSlowSTRQ(MemI))
3968 return canFoldAddRegIntoAddrMode(1);
3970 case AArch64::ADDXrx:
3978 if (!OptSize && avoidSlowSTRQ(MemI))
3987 return canFoldAddRegIntoAddrMode(
4002 case AArch64::LDURQi:
4003 case AArch64::LDRQui:
4004 return AArch64::LDRQroX;
4005 case AArch64::STURQi:
4006 case AArch64::STRQui:
4007 return AArch64::STRQroX;
4008 case AArch64::LDURDi:
4009 case AArch64::LDRDui:
4010 return AArch64::LDRDroX;
4011 case AArch64::STURDi:
4012 case AArch64::STRDui:
4013 return AArch64::STRDroX;
4014 case AArch64::LDURXi:
4015 case AArch64::LDRXui:
4016 return AArch64::LDRXroX;
4017 case AArch64::STURXi:
4018 case AArch64::STRXui:
4019 return AArch64::STRXroX;
4020 case AArch64::LDURWi:
4021 case AArch64::LDRWui:
4022 return AArch64::LDRWroX;
4023 case AArch64::LDURSWi:
4024 case AArch64::LDRSWui:
4025 return AArch64::LDRSWroX;
4026 case AArch64::STURWi:
4027 case AArch64::STRWui:
4028 return AArch64::STRWroX;
4029 case AArch64::LDURHi:
4030 case AArch64::LDRHui:
4031 return AArch64::LDRHroX;
4032 case AArch64::STURHi:
4033 case AArch64::STRHui:
4034 return AArch64::STRHroX;
4035 case AArch64::LDURHHi:
4036 case AArch64::LDRHHui:
4037 return AArch64::LDRHHroX;
4038 case AArch64::STURHHi:
4039 case AArch64::STRHHui:
4040 return AArch64::STRHHroX;
4041 case AArch64::LDURSHXi:
4042 case AArch64::LDRSHXui:
4043 return AArch64::LDRSHXroX;
4044 case AArch64::LDURSHWi:
4045 case AArch64::LDRSHWui:
4046 return AArch64::LDRSHWroX;
4047 case AArch64::LDURBi:
4048 case AArch64::LDRBui:
4049 return AArch64::LDRBroX;
4050 case AArch64::LDURBBi:
4051 case AArch64::LDRBBui:
4052 return AArch64::LDRBBroX;
4053 case AArch64::LDURSBXi:
4054 case AArch64::LDRSBXui:
4055 return AArch64::LDRSBXroX;
4056 case AArch64::LDURSBWi:
4057 case AArch64::LDRSBWui:
4058 return AArch64::LDRSBWroX;
4059 case AArch64::STURBi:
4060 case AArch64::STRBui:
4061 return AArch64::STRBroX;
4062 case AArch64::STURBBi:
4063 case AArch64::STRBBui:
4064 return AArch64::STRBBroX;
4076 case AArch64::LDURQi:
4078 return AArch64::LDRQui;
4079 case AArch64::STURQi:
4081 return AArch64::STRQui;
4082 case AArch64::LDURDi:
4084 return AArch64::LDRDui;
4085 case AArch64::STURDi:
4087 return AArch64::STRDui;
4088 case AArch64::LDURXi:
4090 return AArch64::LDRXui;
4091 case AArch64::STURXi:
4093 return AArch64::STRXui;
4094 case AArch64::LDURWi:
4096 return AArch64::LDRWui;
4097 case AArch64::LDURSWi:
4099 return AArch64::LDRSWui;
4100 case AArch64::STURWi:
4102 return AArch64::STRWui;
4103 case AArch64::LDURHi:
4105 return AArch64::LDRHui;
4106 case AArch64::STURHi:
4108 return AArch64::STRHui;
4109 case AArch64::LDURHHi:
4111 return AArch64::LDRHHui;
4112 case AArch64::STURHHi:
4114 return AArch64::STRHHui;
4115 case AArch64::LDURSHXi:
4117 return AArch64::LDRSHXui;
4118 case AArch64::LDURSHWi:
4120 return AArch64::LDRSHWui;
4121 case AArch64::LDURBi:
4123 return AArch64::LDRBui;
4124 case AArch64::LDURBBi:
4126 return AArch64::LDRBBui;
4127 case AArch64::LDURSBXi:
4129 return AArch64::LDRSBXui;
4130 case AArch64::LDURSBWi:
4132 return AArch64::LDRSBWui;
4133 case AArch64::STURBi:
4135 return AArch64::STRBui;
4136 case AArch64::STURBBi:
4138 return AArch64::STRBBui;
4139 case AArch64::LDRQui:
4140 case AArch64::STRQui:
4143 case AArch64::LDRDui:
4144 case AArch64::STRDui:
4145 case AArch64::LDRXui:
4146 case AArch64::STRXui:
4149 case AArch64::LDRWui:
4150 case AArch64::LDRSWui:
4151 case AArch64::STRWui:
4154 case AArch64::LDRHui:
4155 case AArch64::STRHui:
4156 case AArch64::LDRHHui:
4157 case AArch64::STRHHui:
4158 case AArch64::LDRSHXui:
4159 case AArch64::LDRSHWui:
4162 case AArch64::LDRBui:
4163 case AArch64::LDRBBui:
4164 case AArch64::LDRSBXui:
4165 case AArch64::LDRSBWui:
4166 case AArch64::STRBui:
4167 case AArch64::STRBBui:
4181 case AArch64::LDURQi:
4182 case AArch64::STURQi:
4183 case AArch64::LDURDi:
4184 case AArch64::STURDi:
4185 case AArch64::LDURXi:
4186 case AArch64::STURXi:
4187 case AArch64::LDURWi:
4188 case AArch64::LDURSWi:
4189 case AArch64::STURWi:
4190 case AArch64::LDURHi:
4191 case AArch64::STURHi:
4192 case AArch64::LDURHHi:
4193 case AArch64::STURHHi:
4194 case AArch64::LDURSHXi:
4195 case AArch64::LDURSHWi:
4196 case AArch64::LDURBi:
4197 case AArch64::STURBi:
4198 case AArch64::LDURBBi:
4199 case AArch64::STURBBi:
4200 case AArch64::LDURSBWi:
4201 case AArch64::LDURSBXi:
4203 case AArch64::LDRQui:
4204 return AArch64::LDURQi;
4205 case AArch64::STRQui:
4206 return AArch64::STURQi;
4207 case AArch64::LDRDui:
4208 return AArch64::LDURDi;
4209 case AArch64::STRDui:
4210 return AArch64::STURDi;
4211 case AArch64::LDRXui:
4212 return AArch64::LDURXi;
4213 case AArch64::STRXui:
4214 return AArch64::STURXi;
4215 case AArch64::LDRWui:
4216 return AArch64::LDURWi;
4217 case AArch64::LDRSWui:
4218 return AArch64::LDURSWi;
4219 case AArch64::STRWui:
4220 return AArch64::STURWi;
4221 case AArch64::LDRHui:
4222 return AArch64::LDURHi;
4223 case AArch64::STRHui:
4224 return AArch64::STURHi;
4225 case AArch64::LDRHHui:
4226 return AArch64::LDURHHi;
4227 case AArch64::STRHHui:
4228 return AArch64::STURHHi;
4229 case AArch64::LDRSHXui:
4230 return AArch64::LDURSHXi;
4231 case AArch64::LDRSHWui:
4232 return AArch64::LDURSHWi;
4233 case AArch64::LDRBBui:
4234 return AArch64::LDURBBi;
4235 case AArch64::LDRBui:
4236 return AArch64::LDURBi;
4237 case AArch64::STRBBui:
4238 return AArch64::STURBBi;
4239 case AArch64::STRBui:
4240 return AArch64::STURBi;
4241 case AArch64::LDRSBWui:
4242 return AArch64::LDURSBWi;
4243 case AArch64::LDRSBXui:
4244 return AArch64::LDURSBXi;
4257 case AArch64::LDRQroX:
4258 case AArch64::LDURQi:
4259 case AArch64::LDRQui:
4260 return AArch64::LDRQroW;
4261 case AArch64::STRQroX:
4262 case AArch64::STURQi:
4263 case AArch64::STRQui:
4264 return AArch64::STRQroW;
4265 case AArch64::LDRDroX:
4266 case AArch64::LDURDi:
4267 case AArch64::LDRDui:
4268 return AArch64::LDRDroW;
4269 case AArch64::STRDroX:
4270 case AArch64::STURDi:
4271 case AArch64::STRDui:
4272 return AArch64::STRDroW;
4273 case AArch64::LDRXroX:
4274 case AArch64::LDURXi:
4275 case AArch64::LDRXui:
4276 return AArch64::LDRXroW;
4277 case AArch64::STRXroX:
4278 case AArch64::STURXi:
4279 case AArch64::STRXui:
4280 return AArch64::STRXroW;
4281 case AArch64::LDRWroX:
4282 case AArch64::LDURWi:
4283 case AArch64::LDRWui:
4284 return AArch64::LDRWroW;
4285 case AArch64::LDRSWroX:
4286 case AArch64::LDURSWi:
4287 case AArch64::LDRSWui:
4288 return AArch64::LDRSWroW;
4289 case AArch64::STRWroX:
4290 case AArch64::STURWi:
4291 case AArch64::STRWui:
4292 return AArch64::STRWroW;
4293 case AArch64::LDRHroX:
4294 case AArch64::LDURHi:
4295 case AArch64::LDRHui:
4296 return AArch64::LDRHroW;
4297 case AArch64::STRHroX:
4298 case AArch64::STURHi:
4299 case AArch64::STRHui:
4300 return AArch64::STRHroW;
4301 case AArch64::LDRHHroX:
4302 case AArch64::LDURHHi:
4303 case AArch64::LDRHHui:
4304 return AArch64::LDRHHroW;
4305 case AArch64::STRHHroX:
4306 case AArch64::STURHHi:
4307 case AArch64::STRHHui:
4308 return AArch64::STRHHroW;
4309 case AArch64::LDRSHXroX:
4310 case AArch64::LDURSHXi:
4311 case AArch64::LDRSHXui:
4312 return AArch64::LDRSHXroW;
4313 case AArch64::LDRSHWroX:
4314 case AArch64::LDURSHWi:
4315 case AArch64::LDRSHWui:
4316 return AArch64::LDRSHWroW;
4317 case AArch64::LDRBroX:
4318 case AArch64::LDURBi:
4319 case AArch64::LDRBui:
4320 return AArch64::LDRBroW;
4321 case AArch64::LDRBBroX:
4322 case AArch64::LDURBBi:
4323 case AArch64::LDRBBui:
4324 return AArch64::LDRBBroW;
4325 case AArch64::LDRSBXroX:
4326 case AArch64::LDURSBXi:
4327 case AArch64::LDRSBXui:
4328 return AArch64::LDRSBXroW;
4329 case AArch64::LDRSBWroX:
4330 case AArch64::LDURSBWi:
4331 case AArch64::LDRSBWui:
4332 return AArch64::LDRSBWroW;
4333 case AArch64::STRBroX:
4334 case AArch64::STURBi:
4335 case AArch64::STRBui:
4336 return AArch64::STRBroW;
4337 case AArch64::STRBBroX:
4338 case AArch64::STURBBi:
4339 case AArch64::STRBBui:
4340 return AArch64::STRBBroW;
4365 return B.getInstr();
4369 "Addressing mode not supported for folding");
4386 return B.getInstr();
4393 "Address offset can be a register or an immediate, but not both");
4414 return B.getInstr();
4418 "Function must not be called with an addressing mode it can't handle");
4427 case AArch64::LD1Fourv16b_POST:
4428 case AArch64::LD1Fourv1d_POST:
4429 case AArch64::LD1Fourv2d_POST:
4430 case AArch64::LD1Fourv2s_POST:
4431 case AArch64::LD1Fourv4h_POST:
4432 case AArch64::LD1Fourv4s_POST:
4433 case AArch64::LD1Fourv8b_POST:
4434 case AArch64::LD1Fourv8h_POST:
4435 case AArch64::LD1Onev16b_POST:
4436 case AArch64::LD1Onev1d_POST:
4437 case AArch64::LD1Onev2d_POST:
4438 case AArch64::LD1Onev2s_POST:
4439 case AArch64::LD1Onev4h_POST:
4440 case AArch64::LD1Onev4s_POST:
4441 case AArch64::LD1Onev8b_POST:
4442 case AArch64::LD1Onev8h_POST:
4443 case AArch64::LD1Rv16b_POST:
4444 case AArch64::LD1Rv1d_POST:
4445 case AArch64::LD1Rv2d_POST:
4446 case AArch64::LD1Rv2s_POST:
4447 case AArch64::LD1Rv4h_POST:
4448 case AArch64::LD1Rv4s_POST:
4449 case AArch64::LD1Rv8b_POST:
4450 case AArch64::LD1Rv8h_POST:
4451 case AArch64::LD1Threev16b_POST:
4452 case AArch64::LD1Threev1d_POST:
4453 case AArch64::LD1Threev2d_POST:
4454 case AArch64::LD1Threev2s_POST:
4455 case AArch64::LD1Threev4h_POST:
4456 case AArch64::LD1Threev4s_POST:
4457 case AArch64::LD1Threev8b_POST:
4458 case AArch64::LD1Threev8h_POST:
4459 case AArch64::LD1Twov16b_POST:
4460 case AArch64::LD1Twov1d_POST:
4461 case AArch64::LD1Twov2d_POST:
4462 case AArch64::LD1Twov2s_POST:
4463 case AArch64::LD1Twov4h_POST:
4464 case AArch64::LD1Twov4s_POST:
4465 case AArch64::LD1Twov8b_POST:
4466 case AArch64::LD1Twov8h_POST:
4467 case AArch64::LD1i16_POST:
4468 case AArch64::LD1i32_POST:
4469 case AArch64::LD1i64_POST:
4470 case AArch64::LD1i8_POST:
4471 case AArch64::LD2Rv16b_POST:
4472 case AArch64::LD2Rv1d_POST:
4473 case AArch64::LD2Rv2d_POST:
4474 case AArch64::LD2Rv2s_POST:
4475 case AArch64::LD2Rv4h_POST:
4476 case AArch64::LD2Rv4s_POST:
4477 case AArch64::LD2Rv8b_POST:
4478 case AArch64::LD2Rv8h_POST:
4479 case AArch64::LD2Twov16b_POST:
4480 case AArch64::LD2Twov2d_POST:
4481 case AArch64::LD2Twov2s_POST:
4482 case AArch64::LD2Twov4h_POST:
4483 case AArch64::LD2Twov4s_POST:
4484 case AArch64::LD2Twov8b_POST:
4485 case AArch64::LD2Twov8h_POST:
4486 case AArch64::LD2i16_POST:
4487 case AArch64::LD2i32_POST:
4488 case AArch64::LD2i64_POST:
4489 case AArch64::LD2i8_POST:
4490 case AArch64::LD3Rv16b_POST:
4491 case AArch64::LD3Rv1d_POST:
4492 case AArch64::LD3Rv2d_POST:
4493 case AArch64::LD3Rv2s_POST:
4494 case AArch64::LD3Rv4h_POST:
4495 case AArch64::LD3Rv4s_POST:
4496 case AArch64::LD3Rv8b_POST:
4497 case AArch64::LD3Rv8h_POST:
4498 case AArch64::LD3Threev16b_POST:
4499 case AArch64::LD3Threev2d_POST:
4500 case AArch64::LD3Threev2s_POST:
4501 case AArch64::LD3Threev4h_POST:
4502 case AArch64::LD3Threev4s_POST:
4503 case AArch64::LD3Threev8b_POST:
4504 case AArch64::LD3Threev8h_POST:
4505 case AArch64::LD3i16_POST:
4506 case AArch64::LD3i32_POST:
4507 case AArch64::LD3i64_POST:
4508 case AArch64::LD3i8_POST:
4509 case AArch64::LD4Fourv16b_POST:
4510 case AArch64::LD4Fourv2d_POST:
4511 case AArch64::LD4Fourv2s_POST:
4512 case AArch64::LD4Fourv4h_POST:
4513 case AArch64::LD4Fourv4s_POST:
4514 case AArch64::LD4Fourv8b_POST:
4515 case AArch64::LD4Fourv8h_POST:
4516 case AArch64::LD4Rv16b_POST:
4517 case AArch64::LD4Rv1d_POST:
4518 case AArch64::LD4Rv2d_POST:
4519 case AArch64::LD4Rv2s_POST:
4520 case AArch64::LD4Rv4h_POST:
4521 case AArch64::LD4Rv4s_POST:
4522 case AArch64::LD4Rv8b_POST:
4523 case AArch64::LD4Rv8h_POST:
4524 case AArch64::LD4i16_POST:
4525 case AArch64::LD4i32_POST:
4526 case AArch64::LD4i64_POST:
4527 case AArch64::LD4i8_POST:
4528 case AArch64::LDAPRWpost:
4529 case AArch64::LDAPRXpost:
4530 case AArch64::LDIAPPWpost:
4531 case AArch64::LDIAPPXpost:
4532 case AArch64::LDPDpost:
4533 case AArch64::LDPQpost:
4534 case AArch64::LDPSWpost:
4535 case AArch64::LDPSpost:
4536 case AArch64::LDPWpost:
4537 case AArch64::LDPXpost:
4538 case AArch64::LDRBBpost:
4539 case AArch64::LDRBpost:
4540 case AArch64::LDRDpost:
4541 case AArch64::LDRHHpost:
4542 case AArch64::LDRHpost:
4543 case AArch64::LDRQpost:
4544 case AArch64::LDRSBWpost:
4545 case AArch64::LDRSBXpost:
4546 case AArch64::LDRSHWpost:
4547 case AArch64::LDRSHXpost:
4548 case AArch64::LDRSWpost:
4549 case AArch64::LDRSpost:
4550 case AArch64::LDRWpost:
4551 case AArch64::LDRXpost:
4552 case AArch64::ST1Fourv16b_POST:
4553 case AArch64::ST1Fourv1d_POST:
4554 case AArch64::ST1Fourv2d_POST:
4555 case AArch64::ST1Fourv2s_POST:
4556 case AArch64::ST1Fourv4h_POST:
4557 case AArch64::ST1Fourv4s_POST:
4558 case AArch64::ST1Fourv8b_POST:
4559 case AArch64::ST1Fourv8h_POST:
4560 case AArch64::ST1Onev16b_POST:
4561 case AArch64::ST1Onev1d_POST:
4562 case AArch64::ST1Onev2d_POST:
4563 case AArch64::ST1Onev2s_POST:
4564 case AArch64::ST1Onev4h_POST:
4565 case AArch64::ST1Onev4s_POST:
4566 case AArch64::ST1Onev8b_POST:
4567 case AArch64::ST1Onev8h_POST:
4568 case AArch64::ST1Threev16b_POST:
4569 case AArch64::ST1Threev1d_POST:
4570 case AArch64::ST1Threev2d_POST:
4571 case AArch64::ST1Threev2s_POST:
4572 case AArch64::ST1Threev4h_POST:
4573 case AArch64::ST1Threev4s_POST:
4574 case AArch64::ST1Threev8b_POST:
4575 case AArch64::ST1Threev8h_POST:
4576 case AArch64::ST1Twov16b_POST:
4577 case AArch64::ST1Twov1d_POST:
4578 case AArch64::ST1Twov2d_POST:
4579 case AArch64::ST1Twov2s_POST:
4580 case AArch64::ST1Twov4h_POST:
4581 case AArch64::ST1Twov4s_POST:
4582 case AArch64::ST1Twov8b_POST:
4583 case AArch64::ST1Twov8h_POST:
4584 case AArch64::ST1i16_POST:
4585 case AArch64::ST1i32_POST:
4586 case AArch64::ST1i64_POST:
4587 case AArch64::ST1i8_POST:
4588 case AArch64::ST2GPostIndex:
4589 case AArch64::ST2Twov16b_POST:
4590 case AArch64::ST2Twov2d_POST:
4591 case AArch64::ST2Twov2s_POST:
4592 case AArch64::ST2Twov4h_POST:
4593 case AArch64::ST2Twov4s_POST:
4594 case AArch64::ST2Twov8b_POST:
4595 case AArch64::ST2Twov8h_POST:
4596 case AArch64::ST2i16_POST:
4597 case AArch64::ST2i32_POST:
4598 case AArch64::ST2i64_POST:
4599 case AArch64::ST2i8_POST:
4600 case AArch64::ST3Threev16b_POST:
4601 case AArch64::ST3Threev2d_POST:
4602 case AArch64::ST3Threev2s_POST:
4603 case AArch64::ST3Threev4h_POST:
4604 case AArch64::ST3Threev4s_POST:
4605 case AArch64::ST3Threev8b_POST:
4606 case AArch64::ST3Threev8h_POST:
4607 case AArch64::ST3i16_POST:
4608 case AArch64::ST3i32_POST:
4609 case AArch64::ST3i64_POST:
4610 case AArch64::ST3i8_POST:
4611 case AArch64::ST4Fourv16b_POST:
4612 case AArch64::ST4Fourv2d_POST:
4613 case AArch64::ST4Fourv2s_POST:
4614 case AArch64::ST4Fourv4h_POST:
4615 case AArch64::ST4Fourv4s_POST:
4616 case AArch64::ST4Fourv8b_POST:
4617 case AArch64::ST4Fourv8h_POST:
4618 case AArch64::ST4i16_POST:
4619 case AArch64::ST4i32_POST:
4620 case AArch64::ST4i64_POST:
4621 case AArch64::ST4i8_POST:
4622 case AArch64::STGPostIndex:
4623 case AArch64::STGPpost:
4624 case AArch64::STPDpost:
4625 case AArch64::STPQpost:
4626 case AArch64::STPSpost:
4627 case AArch64::STPWpost:
4628 case AArch64::STPXpost:
4629 case AArch64::STRBBpost:
4630 case AArch64::STRBpost:
4631 case AArch64::STRDpost:
4632 case AArch64::STRHHpost:
4633 case AArch64::STRHpost:
4634 case AArch64::STRQpost:
4635 case AArch64::STRSpost:
4636 case AArch64::STRWpost:
4637 case AArch64::STRXpost:
4638 case AArch64::STZ2GPostIndex:
4639 case AArch64::STZGPostIndex:
4646 bool &OffsetIsScalable,
TypeSize &Width,
4667 int64_t Dummy1, Dummy2;
4689 return BaseOp->
isReg() || BaseOp->
isFI();
4696 assert(OfsOp.
isImm() &&
"Offset operand wasn't immediate.");
4701 TypeSize &Width, int64_t &MinOffset,
4702 int64_t &MaxOffset) {
4707 MinOffset = MaxOffset = 0;
4710 case AArch64::LDRQui:
4711 case AArch64::STRQui:
4716 case AArch64::LDRXui:
4717 case AArch64::LDRDui:
4718 case AArch64::STRXui:
4719 case AArch64::STRDui:
4720 case AArch64::PRFMui:
4725 case AArch64::LDRWui:
4726 case AArch64::LDRSui:
4727 case AArch64::LDRSWui:
4728 case AArch64::STRWui:
4729 case AArch64::STRSui:
4734 case AArch64::LDRHui:
4735 case AArch64::LDRHHui:
4736 case AArch64::LDRSHWui:
4737 case AArch64::LDRSHXui:
4738 case AArch64::STRHui:
4739 case AArch64::STRHHui:
4744 case AArch64::LDRBui:
4745 case AArch64::LDRBBui:
4746 case AArch64::LDRSBWui:
4747 case AArch64::LDRSBXui:
4748 case AArch64::STRBui:
4749 case AArch64::STRBBui:
4755 case AArch64::STRQpre:
4756 case AArch64::LDRQpost:
4762 case AArch64::LDRDpost:
4763 case AArch64::LDRDpre:
4764 case AArch64::LDRXpost:
4765 case AArch64::LDRXpre:
4766 case AArch64::STRDpost:
4767 case AArch64::STRDpre:
4768 case AArch64::STRXpost:
4769 case AArch64::STRXpre:
4775 case AArch64::STRWpost:
4776 case AArch64::STRWpre:
4777 case AArch64::LDRWpost:
4778 case AArch64::LDRWpre:
4779 case AArch64::STRSpost:
4780 case AArch64::STRSpre:
4781 case AArch64::LDRSpost:
4782 case AArch64::LDRSpre:
4788 case AArch64::LDRHpost:
4789 case AArch64::LDRHpre:
4790 case AArch64::STRHpost:
4791 case AArch64::STRHpre:
4792 case AArch64::LDRHHpost:
4793 case AArch64::LDRHHpre:
4794 case AArch64::STRHHpost:
4795 case AArch64::STRHHpre:
4801 case AArch64::LDRBpost:
4802 case AArch64::LDRBpre:
4803 case AArch64::STRBpost:
4804 case AArch64::STRBpre:
4805 case AArch64::LDRBBpost:
4806 case AArch64::LDRBBpre:
4807 case AArch64::STRBBpost:
4808 case AArch64::STRBBpre:
4814 case AArch64::LDURQi:
4815 case AArch64::STURQi:
4821 case AArch64::LDURXi:
4822 case AArch64::LDURDi:
4823 case AArch64::LDAPURXi:
4824 case AArch64::STURXi:
4825 case AArch64::STURDi:
4826 case AArch64::STLURXi:
4827 case AArch64::PRFUMi:
4833 case AArch64::LDURWi:
4834 case AArch64::LDURSi:
4835 case AArch64::LDURSWi:
4836 case AArch64::LDAPURi:
4837 case AArch64::LDAPURSWi:
4838 case AArch64::STURWi:
4839 case AArch64::STURSi:
4840 case AArch64::STLURWi:
4846 case AArch64::LDURHi:
4847 case AArch64::LDURHHi:
4848 case AArch64::LDURSHXi:
4849 case AArch64::LDURSHWi:
4850 case AArch64::LDAPURHi:
4851 case AArch64::LDAPURSHWi:
4852 case AArch64::LDAPURSHXi:
4853 case AArch64::STURHi:
4854 case AArch64::STURHHi:
4855 case AArch64::STLURHi:
4861 case AArch64::LDURBi:
4862 case AArch64::LDURBBi:
4863 case AArch64::LDURSBXi:
4864 case AArch64::LDURSBWi:
4865 case AArch64::LDAPURBi:
4866 case AArch64::LDAPURSBWi:
4867 case AArch64::LDAPURSBXi:
4868 case AArch64::STURBi:
4869 case AArch64::STURBBi:
4870 case AArch64::STLURBi:
4876 case AArch64::LDPQi:
4877 case AArch64::LDNPQi:
4878 case AArch64::STPQi:
4879 case AArch64::STNPQi:
4880 case AArch64::LDPQpost:
4881 case AArch64::LDPQpre:
4882 case AArch64::STPQpost:
4883 case AArch64::STPQpre:
4889 case AArch64::LDPXi:
4890 case AArch64::LDPDi:
4891 case AArch64::LDNPXi:
4892 case AArch64::LDNPDi:
4893 case AArch64::STPXi:
4894 case AArch64::STPDi:
4895 case AArch64::STNPXi:
4896 case AArch64::STNPDi:
4897 case AArch64::LDPDpost:
4898 case AArch64::LDPDpre:
4899 case AArch64::LDPXpost:
4900 case AArch64::LDPXpre:
4901 case AArch64::STPDpost:
4902 case AArch64::STPDpre:
4903 case AArch64::STPXpost:
4904 case AArch64::STPXpre:
4910 case AArch64::LDPWi:
4911 case AArch64::LDPSi:
4912 case AArch64::LDNPWi:
4913 case AArch64::LDNPSi:
4914 case AArch64::STPWi:
4915 case AArch64::STPSi:
4916 case AArch64::STNPWi:
4917 case AArch64::STNPSi:
4918 case AArch64::LDPSpost:
4919 case AArch64::LDPSpre:
4920 case AArch64::LDPWpost:
4921 case AArch64::LDPWpre:
4922 case AArch64::STPSpost:
4923 case AArch64::STPSpre:
4924 case AArch64::STPWpost:
4925 case AArch64::STPWpre:
4931 case AArch64::StoreSwiftAsyncContext:
4944 case AArch64::TAGPstack:
4954 case AArch64::STGPreIndex:
4955 case AArch64::STGPostIndex:
4956 case AArch64::STZGi:
4957 case AArch64::STZGPreIndex:
4958 case AArch64::STZGPostIndex:
4964 case AArch64::STR_ZZZZXI:
4965 case AArch64::STR_ZZZZXI_STRIDED_CONTIGUOUS:
4966 case AArch64::LDR_ZZZZXI:
4967 case AArch64::LDR_ZZZZXI_STRIDED_CONTIGUOUS:
4973 case AArch64::STR_ZZZXI:
4974 case AArch64::LDR_ZZZXI:
4980 case AArch64::STR_ZZXI:
4981 case AArch64::STR_ZZXI_STRIDED_CONTIGUOUS:
4982 case AArch64::LDR_ZZXI:
4983 case AArch64::LDR_ZZXI_STRIDED_CONTIGUOUS:
4989 case AArch64::LDR_PXI:
4990 case AArch64::STR_PXI:
4995 case AArch64::LDR_PPXI:
4996 case AArch64::STR_PPXI:
5002 case AArch64::LDR_ZXI:
5003 case AArch64::STR_ZXI:
5008 case AArch64::LD1B_IMM:
5009 case AArch64::LD1H_IMM:
5010 case AArch64::LD1W_IMM:
5011 case AArch64::LD1D_IMM:
5012 case AArch64::LDNT1B_ZRI:
5013 case AArch64::LDNT1H_ZRI:
5014 case AArch64::LDNT1W_ZRI:
5015 case AArch64::LDNT1D_ZRI:
5016 case AArch64::ST1B_IMM:
5017 case AArch64::ST1H_IMM:
5018 case AArch64::ST1W_IMM:
5019 case AArch64::ST1D_IMM:
5020 case AArch64::STNT1B_ZRI:
5021 case AArch64::STNT1H_ZRI:
5022 case AArch64::STNT1W_ZRI:
5023 case AArch64::STNT1D_ZRI:
5024 case AArch64::LDNF1B_IMM:
5025 case AArch64::LDNF1H_IMM:
5026 case AArch64::LDNF1W_IMM:
5027 case AArch64::LDNF1D_IMM:
5034 case AArch64::LD2B_IMM:
5035 case AArch64::LD2H_IMM:
5036 case AArch64::LD2W_IMM:
5037 case AArch64::LD2D_IMM:
5038 case AArch64::ST2B_IMM:
5039 case AArch64::ST2H_IMM:
5040 case AArch64::ST2W_IMM:
5041 case AArch64::ST2D_IMM:
5042 case AArch64::LD1B_2Z_IMM:
5043 case AArch64::LD1B_2Z_STRIDED_IMM:
5044 case AArch64::LD1H_2Z_IMM:
5045 case AArch64::LD1H_2Z_STRIDED_IMM:
5046 case AArch64::LD1W_2Z_IMM:
5047 case AArch64::LD1W_2Z_STRIDED_IMM:
5048 case AArch64::LD1D_2Z_IMM:
5049 case AArch64::LD1D_2Z_STRIDED_IMM:
5050 case AArch64::LD1B_2Z_IMM_PSEUDO:
5051 case AArch64::LD1H_2Z_IMM_PSEUDO:
5052 case AArch64::LD1W_2Z_IMM_PSEUDO:
5053 case AArch64::LD1D_2Z_IMM_PSEUDO:
5054 case AArch64::ST1B_2Z_IMM:
5055 case AArch64::ST1B_2Z_STRIDED_IMM:
5056 case AArch64::ST1H_2Z_IMM:
5057 case AArch64::ST1H_2Z_STRIDED_IMM:
5058 case AArch64::ST1W_2Z_IMM:
5059 case AArch64::ST1W_2Z_STRIDED_IMM:
5060 case AArch64::ST1D_2Z_IMM:
5061 case AArch64::ST1D_2Z_STRIDED_IMM:
5062 case AArch64::LDNT1B_2Z_IMM_PSEUDO:
5063 case AArch64::LDNT1B_2Z_IMM:
5064 case AArch64::LDNT1B_2Z_STRIDED_IMM:
5065 case AArch64::LDNT1H_2Z_IMM_PSEUDO:
5066 case AArch64::LDNT1H_2Z_IMM:
5067 case AArch64::LDNT1H_2Z_STRIDED_IMM:
5068 case AArch64::LDNT1W_2Z_IMM_PSEUDO:
5069 case AArch64::LDNT1W_2Z_IMM:
5070 case AArch64::LDNT1W_2Z_STRIDED_IMM:
5071 case AArch64::LDNT1D_2Z_IMM_PSEUDO:
5072 case AArch64::LDNT1D_2Z_IMM:
5073 case AArch64::LDNT1D_2Z_STRIDED_IMM:
5074 case AArch64::STNT1B_2Z_IMM:
5075 case AArch64::STNT1B_2Z_STRIDED_IMM:
5076 case AArch64::STNT1H_2Z_IMM:
5077 case AArch64::STNT1H_2Z_STRIDED_IMM:
5078 case AArch64::STNT1W_2Z_IMM:
5079 case AArch64::STNT1W_2Z_STRIDED_IMM:
5080 case AArch64::STNT1D_2Z_IMM:
5081 case AArch64::STNT1D_2Z_STRIDED_IMM:
5082 case AArch64::ST1B_2Z_IMM_PSEUDO:
5083 case AArch64::ST1H_2Z_IMM_PSEUDO:
5084 case AArch64::ST1W_2Z_IMM_PSEUDO:
5085 case AArch64::ST1D_2Z_IMM_PSEUDO:
5086 case AArch64::STNT1B_2Z_IMM_PSEUDO:
5087 case AArch64::STNT1H_2Z_IMM_PSEUDO:
5088 case AArch64::STNT1W_2Z_IMM_PSEUDO:
5089 case AArch64::STNT1D_2Z_IMM_PSEUDO:
5094 case AArch64::LD3B_IMM:
5095 case AArch64::LD3H_IMM:
5096 case AArch64::LD3W_IMM:
5097 case AArch64::LD3D_IMM:
5098 case AArch64::ST3B_IMM:
5099 case AArch64::ST3H_IMM:
5100 case AArch64::ST3W_IMM:
5101 case AArch64::ST3D_IMM:
5106 case AArch64::LD4B_IMM:
5107 case AArch64::LD4H_IMM:
5108 case AArch64::LD4W_IMM:
5109 case AArch64::LD4D_IMM:
5110 case AArch64::ST4B_IMM:
5111 case AArch64::ST4H_IMM:
5112 case AArch64::ST4W_IMM:
5113 case AArch64::ST4D_IMM:
5114 case AArch64::LD1B_4Z_IMM:
5115 case AArch64::LD1B_4Z_STRIDED_IMM:
5116 case AArch64::LD1H_4Z_IMM:
5117 case AArch64::LD1H_4Z_STRIDED_IMM:
5118 case AArch64::LD1W_4Z_IMM:
5119 case AArch64::LD1W_4Z_STRIDED_IMM:
5120 case AArch64::LD1D_4Z_IMM:
5121 case AArch64::LD1D_4Z_STRIDED_IMM:
5122 case AArch64::LD1B_4Z_IMM_PSEUDO:
5123 case AArch64::LD1H_4Z_IMM_PSEUDO:
5124 case AArch64::LD1W_4Z_IMM_PSEUDO:
5125 case AArch64::LD1D_4Z_IMM_PSEUDO:
5126 case AArch64::ST1B_4Z_IMM:
5127 case AArch64::ST1B_4Z_STRIDED_IMM:
5128 case AArch64::ST1H_4Z_IMM:
5129 case AArch64::ST1H_4Z_STRIDED_IMM:
5130 case AArch64::ST1W_4Z_IMM:
5131 case AArch64::ST1W_4Z_STRIDED_IMM:
5132 case AArch64::ST1D_4Z_IMM:
5133 case AArch64::ST1D_4Z_STRIDED_IMM:
5134 case AArch64::LDNT1B_4Z_IMM_PSEUDO:
5135 case AArch64::LDNT1B_4Z_IMM:
5136 case AArch64::LDNT1B_4Z_STRIDED_IMM:
5137 case AArch64::LDNT1H_4Z_IMM_PSEUDO:
5138 case AArch64::LDNT1H_4Z_IMM:
5139 case AArch64::LDNT1H_4Z_STRIDED_IMM:
5140 case AArch64::LDNT1W_4Z_IMM_PSEUDO:
5141 case AArch64::LDNT1W_4Z_IMM:
5142 case AArch64::LDNT1W_4Z_STRIDED_IMM:
5143 case AArch64::LDNT1D_4Z_IMM_PSEUDO:
5144 case AArch64::LDNT1D_4Z_IMM:
5145 case AArch64::LDNT1D_4Z_STRIDED_IMM:
5146 case AArch64::STNT1B_4Z_IMM:
5147 case AArch64::STNT1B_4Z_STRIDED_IMM:
5148 case AArch64::STNT1H_4Z_IMM:
5149 case AArch64::STNT1H_4Z_STRIDED_IMM:
5150 case AArch64::STNT1W_4Z_IMM:
5151 case AArch64::STNT1W_4Z_STRIDED_IMM:
5152 case AArch64::STNT1D_4Z_IMM:
5153 case AArch64::STNT1D_4Z_STRIDED_IMM:
5154 case AArch64::ST1B_4Z_IMM_PSEUDO:
5155 case AArch64::ST1H_4Z_IMM_PSEUDO:
5156 case AArch64::ST1W_4Z_IMM_PSEUDO:
5157 case AArch64::ST1D_4Z_IMM_PSEUDO:
5158 case AArch64::STNT1B_4Z_IMM_PSEUDO:
5159 case AArch64::STNT1H_4Z_IMM_PSEUDO:
5160 case AArch64::STNT1W_4Z_IMM_PSEUDO:
5161 case AArch64::STNT1D_4Z_IMM_PSEUDO:
5166 case AArch64::LD1B_H_IMM:
5167 case AArch64::LD1SB_H_IMM:
5168 case AArch64::LD1H_S_IMM:
5169 case AArch64::LD1SH_S_IMM:
5170 case AArch64::LD1W_D_IMM:
5171 case AArch64::LD1SW_D_IMM:
5172 case AArch64::ST1B_H_IMM:
5173 case AArch64::ST1H_S_IMM:
5174 case AArch64::ST1W_D_IMM:
5175 case AArch64::LDNF1B_H_IMM:
5176 case AArch64::LDNF1SB_H_IMM:
5177 case AArch64::LDNF1H_S_IMM:
5178 case AArch64::LDNF1SH_S_IMM:
5179 case AArch64::LDNF1W_D_IMM:
5180 case AArch64::LDNF1SW_D_IMM:
5187 case AArch64::LD1B_S_IMM:
5188 case AArch64::LD1SB_S_IMM:
5189 case AArch64::LD1H_D_IMM:
5190 case AArch64::LD1SH_D_IMM:
5191 case AArch64::ST1B_S_IMM:
5192 case AArch64::ST1H_D_IMM:
5193 case AArch64::LDNF1B_S_IMM:
5194 case AArch64::LDNF1SB_S_IMM:
5195 case AArch64::LDNF1H_D_IMM:
5196 case AArch64::LDNF1SH_D_IMM:
5203 case AArch64::LD1B_D_IMM:
5204 case AArch64::LD1SB_D_IMM:
5205 case AArch64::ST1B_D_IMM:
5206 case AArch64::LDNF1B_D_IMM:
5207 case AArch64::LDNF1SB_D_IMM:
5214 case AArch64::ST2Gi:
5215 case AArch64::ST2GPreIndex:
5216 case AArch64::ST2GPostIndex:
5217 case AArch64::STZ2Gi:
5218 case AArch64::STZ2GPreIndex:
5219 case AArch64::STZ2GPostIndex:
5225 case AArch64::STGPi:
5226 case AArch64::STGPpost:
5227 case AArch64::STGPpre:
5232 case AArch64::LD1RB_IMM:
5233 case AArch64::LD1RB_H_IMM:
5234 case AArch64::LD1RB_S_IMM:
5235 case AArch64::LD1RB_D_IMM:
5236 case AArch64::LD1RSB_H_IMM:
5237 case AArch64::LD1RSB_S_IMM:
5238 case AArch64::LD1RSB_D_IMM:
5243 case AArch64::LD1RH_IMM:
5244 case AArch64::LD1RH_S_IMM:
5245 case AArch64::LD1RH_D_IMM:
5246 case AArch64::LD1RSH_S_IMM:
5247 case AArch64::LD1RSH_D_IMM:
5252 case AArch64::LD1RW_IMM:
5253 case AArch64::LD1RW_D_IMM:
5254 case AArch64::LD1RSW_IMM:
5259 case AArch64::LD1RD_IMM:
5274 case AArch64::LDRBui:
5275 case AArch64::LDRBBui:
5276 case AArch64::LDURBBi:
5277 case AArch64::LDRSBWui:
5278 case AArch64::LDURSBWi:
5279 case AArch64::STRBui:
5280 case AArch64::STRBBui:
5281 case AArch64::STURBBi:
5283 case AArch64::LDRHui:
5284 case AArch64::LDRHHui:
5285 case AArch64::LDURHHi:
5286 case AArch64::LDRSHWui:
5287 case AArch64::LDURSHWi:
5288 case AArch64::STRHui:
5289 case AArch64::STRHHui:
5290 case AArch64::STURHHi:
5292 case AArch64::LDRSui:
5293 case AArch64::LDURSi:
5294 case AArch64::LDRSpre:
5295 case AArch64::LDRSWui:
5296 case AArch64::LDURSWi:
5297 case AArch64::LDRSWpre:
5298 case AArch64::LDRWpre:
5299 case AArch64::LDRWui:
5300 case AArch64::LDURWi:
5301 case AArch64::STRSui:
5302 case AArch64::STURSi:
5303 case AArch64::STRSpre:
5304 case AArch64::STRWui:
5305 case AArch64::STURWi:
5306 case AArch64::STRWpre:
5307 case AArch64::LDPSi:
5308 case AArch64::LDPSWi:
5309 case AArch64::LDPWi:
5310 case AArch64::STPSi:
5311 case AArch64::STPWi:
5313 case AArch64::LDRDui:
5314 case AArch64::LDURDi:
5315 case AArch64::LDRDpre:
5316 case AArch64::LDRXui:
5317 case AArch64::LDURXi:
5318 case AArch64::LDRXpre:
5319 case AArch64::STRDui:
5320 case AArch64::STURDi:
5321 case AArch64::STRDpre:
5322 case AArch64::STRXui:
5323 case AArch64::STURXi:
5324 case AArch64::STRXpre:
5325 case AArch64::LDPDi:
5326 case AArch64::LDPXi:
5327 case AArch64::STPDi:
5328 case AArch64::STPXi:
5330 case AArch64::LDRQui:
5331 case AArch64::LDURQi:
5332 case AArch64::STRQui:
5333 case AArch64::STURQi:
5334 case AArch64::STRQpre:
5335 case AArch64::LDPQi:
5336 case AArch64::LDRQpre:
5337 case AArch64::STPQi:
5339 case AArch64::STZGi:
5340 case AArch64::ST2Gi:
5341 case AArch64::STZ2Gi:
5342 case AArch64::STGPi:
5348 switch (
MI.getOpcode()) {
5351 case AArch64::LDRWpre:
5352 case AArch64::LDRXpre:
5353 case AArch64::LDRSWpre:
5354 case AArch64::LDRSpre:
5355 case AArch64::LDRDpre:
5356 case AArch64::LDRQpre:
5362 switch (
MI.getOpcode()) {
5365 case AArch64::STRWpre:
5366 case AArch64::STRXpre:
5367 case AArch64::STRSpre:
5368 case AArch64::STRDpre:
5369 case AArch64::STRQpre:
5379 switch (
MI.getOpcode()) {
5382 case AArch64::LDURBBi:
5383 case AArch64::LDURHHi:
5384 case AArch64::LDURWi:
5385 case AArch64::LDRBBui:
5386 case AArch64::LDRHHui:
5387 case AArch64::LDRWui:
5388 case AArch64::LDRBBroX:
5389 case AArch64::LDRHHroX:
5390 case AArch64::LDRWroX:
5391 case AArch64::LDRBBroW:
5392 case AArch64::LDRHHroW:
5393 case AArch64::LDRWroW:
5399 switch (
MI.getOpcode()) {
5402 case AArch64::LDURSBWi:
5403 case AArch64::LDURSHWi:
5404 case AArch64::LDURSBXi:
5405 case AArch64::LDURSHXi:
5406 case AArch64::LDURSWi:
5407 case AArch64::LDRSBWui:
5408 case AArch64::LDRSHWui:
5409 case AArch64::LDRSBXui:
5410 case AArch64::LDRSHXui:
5411 case AArch64::LDRSWui:
5412 case AArch64::LDRSBWroX:
5413 case AArch64::LDRSHWroX:
5414 case AArch64::LDRSBXroX:
5415 case AArch64::LDRSHXroX:
5416 case AArch64::LDRSWroX:
5417 case AArch64::LDRSBWroW:
5418 case AArch64::LDRSHWroW:
5419 case AArch64::LDRSBXroW:
5420 case AArch64::LDRSHXroW:
5421 case AArch64::LDRSWroW:
5427 switch (
MI.getOpcode()) {
5430 case AArch64::LDPSi:
5431 case AArch64::LDPSWi:
5432 case AArch64::LDPDi:
5433 case AArch64::LDPQi:
5434 case AArch64::LDPWi:
5435 case AArch64::LDPXi:
5436 case AArch64::STPSi:
5437 case AArch64::STPDi:
5438 case AArch64::STPQi:
5439 case AArch64::STPWi:
5440 case AArch64::STPXi:
5441 case AArch64::STGPi:
5447 assert(
MI.mayLoadOrStore() &&
"Load or store instruction expected");
5451 return MI.getOperand(Idx);
5456 assert(
MI.mayLoadOrStore() &&
"Load or store instruction expected");
5460 return MI.getOperand(Idx);
5465 switch (
MI.getOpcode()) {
5468 case AArch64::LDRBroX:
5469 case AArch64::LDRBBroX:
5470 case AArch64::LDRSBXroX:
5471 case AArch64::LDRSBWroX:
5472 case AArch64::LDRHroX:
5473 case AArch64::LDRHHroX:
5474 case AArch64::LDRSHXroX:
5475 case AArch64::LDRSHWroX:
5476 case AArch64::LDRWroX:
5477 case AArch64::LDRSroX:
5478 case AArch64::LDRSWroX:
5479 case AArch64::LDRDroX:
5480 case AArch64::LDRXroX:
5481 case AArch64::LDRQroX:
5482 return MI.getOperand(4);
5488 if (
MI.getParent() ==
nullptr)
5498 auto Reg =
Op.getReg();
5499 if (Reg.isPhysical())
5500 return AArch64::FPR16RegClass.contains(Reg);
5502 return TRC == &AArch64::FPR16RegClass ||
5503 TRC == &AArch64::FPR16_loRegClass;
5512 auto Reg =
Op.getReg();
5513 if (Reg.isPhysical())
5514 return AArch64::FPR128RegClass.contains(Reg);
5516 return TRC == &AArch64::FPR128RegClass ||
5517 TRC == &AArch64::FPR128_loRegClass;
5523 switch (
MI.getOpcode()) {
5526 case AArch64::PACIASP:
5527 case AArch64::PACIBSP:
5530 case AArch64::PAUTH_PROLOGUE:
5533 case AArch64::HINT: {
5534 unsigned Imm =
MI.getOperand(0).getImm();
5539 if (
Imm == 25 ||
Imm == 27)
5551 assert(Reg.isPhysical() &&
"Expected physical register in isFpOrNEON");
5552 return AArch64::FPR128RegClass.contains(Reg) ||
5553 AArch64::FPR64RegClass.contains(Reg) ||
5554 AArch64::FPR32RegClass.contains(Reg) ||
5555 AArch64::FPR16RegClass.contains(Reg) ||
5556 AArch64::FPR8RegClass.contains(Reg);
5563 auto Reg =
Op.getReg();
5564 if (Reg.isPhysical())
5568 return TRC == &AArch64::FPR128RegClass ||
5569 TRC == &AArch64::FPR128_loRegClass ||
5570 TRC == &AArch64::FPR64RegClass ||
5571 TRC == &AArch64::FPR64_loRegClass ||
5572 TRC == &AArch64::FPR32RegClass || TRC == &AArch64::FPR16RegClass ||
5573 TRC == &AArch64::FPR8RegClass;
5595 if (FirstOpc == SecondOpc)
5601 case AArch64::STRSui:
5602 case AArch64::STURSi:
5603 return SecondOpc == AArch64::STRSui || SecondOpc == AArch64::STURSi;
5604 case AArch64::STRDui:
5605 case AArch64::STURDi:
5606 return SecondOpc == AArch64::STRDui || SecondOpc == AArch64::STURDi;
5607 case AArch64::STRQui:
5608 case AArch64::STURQi:
5609 return SecondOpc == AArch64::STRQui || SecondOpc == AArch64::STURQi;
5610 case AArch64::STRWui:
5611 case AArch64::STURWi:
5612 return SecondOpc == AArch64::STRWui || SecondOpc == AArch64::STURWi;
5613 case AArch64::STRXui:
5614 case AArch64::STURXi:
5615 return SecondOpc == AArch64::STRXui || SecondOpc == AArch64::STURXi;
5616 case AArch64::LDRSui:
5617 case AArch64::LDURSi:
5618 return SecondOpc == AArch64::LDRSui || SecondOpc == AArch64::LDURSi;
5619 case AArch64::LDRDui:
5620 case AArch64::LDURDi:
5621 return SecondOpc == AArch64::LDRDui || SecondOpc == AArch64::LDURDi;
5622 case AArch64::LDRQui:
5623 case AArch64::LDURQi:
5624 return SecondOpc == AArch64::LDRQui || SecondOpc == AArch64::LDURQi;
5625 case AArch64::LDRWui:
5626 case AArch64::LDURWi:
5627 return SecondOpc == AArch64::LDRSWui || SecondOpc == AArch64::LDURSWi;
5628 case AArch64::LDRSWui:
5629 case AArch64::LDURSWi:
5630 return SecondOpc == AArch64::LDRWui || SecondOpc == AArch64::LDURWi;
5631 case AArch64::LDRXui:
5632 case AArch64::LDURXi:
5633 return SecondOpc == AArch64::LDRXui || SecondOpc == AArch64::LDURXi;
5640 int64_t Offset1,
unsigned Opcode1,
int FI2,
5641 int64_t Offset2,
unsigned Opcode2) {
5647 assert(ObjectOffset1 <= ObjectOffset2 &&
"Object offsets are not ordered.");
5650 if (ObjectOffset1 % Scale1 != 0)
5652 ObjectOffset1 /= Scale1;
5654 if (ObjectOffset2 % Scale2 != 0)
5656 ObjectOffset2 /= Scale2;
5657 ObjectOffset1 += Offset1;
5658 ObjectOffset2 += Offset2;
5659 return ObjectOffset1 + 1 == ObjectOffset2;
5671 int64_t OpOffset2,
bool OffsetIsScalable2,
unsigned ClusterSize,
5672 unsigned NumBytes)
const {
5682 "Only base registers and frame indices are supported.");
5689 if (ClusterSize > 2)
5696 unsigned FirstOpc = FirstLdSt.
getOpcode();
5697 unsigned SecondOpc = SecondLdSt.
getOpcode();
5717 if (Offset1 > 63 || Offset1 < -64)
5722 if (BaseOp1.
isFI()) {
5724 "Caller should have ordered offsets.");
5729 BaseOp2.
getIndex(), Offset2, SecondOpc);
5732 assert(Offset1 <= Offset2 &&
"Caller should have ordered offsets.");
5734 return Offset1 + 1 == Offset2;
5744 if (
Reg.isPhysical())
5754 assert(Subtarget.hasNEON() &&
"Unexpected register copy without NEON");
5756 uint16_t DestEncoding =
TRI->getEncodingValue(DestReg);
5757 uint16_t SrcEncoding =
TRI->getEncodingValue(SrcReg);
5758 unsigned NumRegs = Indices.
size();
5759 MCRegister DestSubReg =
TRI->getSubReg(DestReg, Indices[0]);
5761 "Unexpected predicate tuple copy");
5762 unsigned MaxRegs = AArch64::PPRRegClass.contains(DestSubReg) ? 15 : 31;
5764 int SubReg = 0, End = NumRegs, Incr = 1;
5766 if (((DestEncoding - SrcEncoding) & MaxRegs) < NumRegs) {
5767 SubReg = NumRegs - 1;
5772 for (; SubReg != End; SubReg += Incr) {
5773 DestSubReg =
TRI->getSubReg(DestReg, Indices[SubReg]);
5774 MCRegister SrcSubReg =
TRI->getSubReg(SrcReg, Indices[SubReg]);
5783 unsigned Opcode,
unsigned ZeroReg,
5786 unsigned NumRegs = Indices.
size();
5789 uint16_t DestEncoding =
TRI->getEncodingValue(DestReg);
5790 uint16_t SrcEncoding =
TRI->getEncodingValue(SrcReg);
5791 assert(DestEncoding % NumRegs == 0 && SrcEncoding % NumRegs == 0 &&
5792 "GPR reg sequences should not be able to overlap");
5795 for (
unsigned SubReg = 0; SubReg != NumRegs; ++SubReg) {
5816 unsigned Opc =
MI.getOpcode();
5817 if (
Opc == AArch64::MSRpstatesvcrImm1 ||
Opc == AArch64::MSRpstatePseudo) {
5819 int64_t PState =
MI.getOperand(0).getImm();
5820 if (PState == AArch64SVCR::SVCRSM || PState == AArch64SVCR::SVCRSMZA) {
5822 return MI.getOperand(1).getImm() == 1;
5841 bool RenamableSrc)
const {
5842 if (AArch64::GPR32spRegClass.
contains(DestReg) &&
5843 AArch64::GPR32spRegClass.
contains(SrcReg)) {
5844 if (DestReg == AArch64::WSP || SrcReg == AArch64::WSP) {
5846 if (Subtarget.hasZeroCycleRegMoveGPR64() &&
5847 !Subtarget.hasZeroCycleRegMoveGPR32()) {
5849 MCRegister DestRegX = RI.getMatchingSuperReg(DestReg, AArch64::sub_32,
5850 &AArch64::GPR64spRegClass);
5851 MCRegister SrcRegX = RI.getMatchingSuperReg(SrcReg, AArch64::sub_32,
5852 &AArch64::GPR64spRegClass);
5862 ++NumZCRegMoveInstrsGPR;
5868 if (Subtarget.hasZeroCycleRegMoveGPR32())
5869 ++NumZCRegMoveInstrsGPR;
5871 }
else if (Subtarget.hasZeroCycleRegMoveGPR64() &&
5872 !Subtarget.hasZeroCycleRegMoveGPR32()) {
5874 MCRegister DestRegX = RI.getMatchingSuperReg(DestReg, AArch64::sub_32,
5875 &AArch64::GPR64spRegClass);
5876 assert(DestRegX.
isValid() &&
"Destination super-reg not valid");
5877 MCRegister SrcRegX = RI.getMatchingSuperReg(SrcReg, AArch64::sub_32,
5878 &AArch64::GPR64spRegClass);
5888 ++NumZCRegMoveInstrsGPR;
5894 if (Subtarget.hasZeroCycleRegMoveGPR32())
5895 ++NumZCRegMoveInstrsGPR;
5901 if (AArch64::GPR32spRegClass.
contains(DestReg) && SrcReg == AArch64::WZR) {
5902 if (Subtarget.hasZeroCycleZeroingGPR64() &&
5903 !Subtarget.hasZeroCycleZeroingGPR32()) {
5904 MCRegister DestRegX = RI.getMatchingSuperReg(DestReg, AArch64::sub_32,
5905 &AArch64::GPR64spRegClass);
5906 assert(DestRegX.
isValid() &&
"Destination super-reg not valid");
5910 ++NumZCZeroingInstrsGPR;
5911 }
else if (Subtarget.hasZeroCycleZeroingGPR32()) {
5915 ++NumZCZeroingInstrsGPR;
5924 if (AArch64::GPR64spRegClass.
contains(DestReg) &&
5925 AArch64::GPR64spRegClass.
contains(SrcReg)) {
5926 if (DestReg == AArch64::SP || SrcReg == AArch64::SP) {
5932 if (Subtarget.hasZeroCycleRegMoveGPR64())
5933 ++NumZCRegMoveInstrsGPR;
5939 if (Subtarget.hasZeroCycleRegMoveGPR64())
5940 ++NumZCRegMoveInstrsGPR;
5946 if (AArch64::GPR64spRegClass.
contains(DestReg) && SrcReg == AArch64::XZR) {
5947 if (Subtarget.hasZeroCycleZeroingGPR64()) {
5951 ++NumZCZeroingInstrsGPR;
5961 if (AArch64::PPRRegClass.
contains(DestReg) &&
5962 AArch64::PPRRegClass.
contains(SrcReg)) {
5963 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
5964 "Unexpected SVE register.");
5974 bool DestIsPNR = AArch64::PNRRegClass.contains(DestReg);
5975 bool SrcIsPNR = AArch64::PNRRegClass.contains(SrcReg);
5976 if (DestIsPNR || SrcIsPNR) {
5978 return (R - AArch64::PN0) + AArch64::P0;
5983 if (PPRSrcReg != PPRDestReg) {
5995 if (AArch64::PPR2RegClass.
contains(DestReg) &&
5996 AArch64::PPR2RegClass.
contains(SrcReg)) {
5997 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
5998 "Unexpected SVE predicate register.");
5999 static const unsigned Indices[] = {AArch64::psub0, AArch64::psub1};
6005 if (AArch64::ZPRRegClass.
contains(DestReg) &&
6006 AArch64::ZPRRegClass.
contains(SrcReg)) {
6007 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6008 "Unexpected SVE register.");
6016 if ((AArch64::ZPR2RegClass.
contains(DestReg) ||
6017 AArch64::ZPR2StridedOrContiguousRegClass.
contains(DestReg)) &&
6018 (AArch64::ZPR2RegClass.
contains(SrcReg) ||
6019 AArch64::ZPR2StridedOrContiguousRegClass.
contains(SrcReg))) {
6020 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6021 "Unexpected SVE register.");
6022 static const unsigned Indices[] = {AArch64::zsub0, AArch64::zsub1};
6028 if (AArch64::ZPR3RegClass.
contains(DestReg) &&
6029 AArch64::ZPR3RegClass.
contains(SrcReg)) {
6030 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6031 "Unexpected SVE register.");
6032 static const unsigned Indices[] = {AArch64::zsub0, AArch64::zsub1,
6039 if ((AArch64::ZPR4RegClass.
contains(DestReg) ||
6040 AArch64::ZPR4StridedOrContiguousRegClass.
contains(DestReg)) &&
6041 (AArch64::ZPR4RegClass.
contains(SrcReg) ||
6042 AArch64::ZPR4StridedOrContiguousRegClass.
contains(SrcReg))) {
6043 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6044 "Unexpected SVE register.");
6045 static const unsigned Indices[] = {AArch64::zsub0, AArch64::zsub1,
6046 AArch64::zsub2, AArch64::zsub3};
6052 if (AArch64::DDDDRegClass.
contains(DestReg) &&
6053 AArch64::DDDDRegClass.
contains(SrcReg)) {
6054 static const unsigned Indices[] = {AArch64::dsub0, AArch64::dsub1,
6055 AArch64::dsub2, AArch64::dsub3};
6061 if (AArch64::DDDRegClass.
contains(DestReg) &&
6062 AArch64::DDDRegClass.
contains(SrcReg)) {
6063 static const unsigned Indices[] = {AArch64::dsub0, AArch64::dsub1,
6070 if (AArch64::DDRegClass.
contains(DestReg) &&
6071 AArch64::DDRegClass.
contains(SrcReg)) {
6072 static const unsigned Indices[] = {AArch64::dsub0, AArch64::dsub1};
6078 if (AArch64::QQQQRegClass.
contains(DestReg) &&
6079 AArch64::QQQQRegClass.
contains(SrcReg)) {
6080 static const unsigned Indices[] = {AArch64::qsub0, AArch64::qsub1,
6081 AArch64::qsub2, AArch64::qsub3};
6087 if (AArch64::QQQRegClass.
contains(DestReg) &&
6088 AArch64::QQQRegClass.
contains(SrcReg)) {
6089 static const unsigned Indices[] = {AArch64::qsub0, AArch64::qsub1,
6096 if (AArch64::QQRegClass.
contains(DestReg) &&
6097 AArch64::QQRegClass.
contains(SrcReg)) {
6098 static const unsigned Indices[] = {AArch64::qsub0, AArch64::qsub1};
6103 if (AArch64::XSeqPairsClassRegClass.
contains(DestReg) &&
6104 AArch64::XSeqPairsClassRegClass.
contains(SrcReg)) {
6105 static const unsigned Indices[] = {AArch64::sube64, AArch64::subo64};
6107 AArch64::XZR, Indices);
6111 if (AArch64::WSeqPairsClassRegClass.
contains(DestReg) &&
6112 AArch64::WSeqPairsClassRegClass.
contains(SrcReg)) {
6113 static const unsigned Indices[] = {AArch64::sube32, AArch64::subo32};
6115 AArch64::WZR, Indices);
6119 if (AArch64::FPR128RegClass.
contains(DestReg) &&
6120 AArch64::FPR128RegClass.
contains(SrcReg)) {
6124 if ((Subtarget.isSVEorStreamingSVEAvailable() &&
6125 !Subtarget.isNeonAvailable()) ||
6129 .
addReg(AArch64::Z0 + (SrcReg - AArch64::Q0))
6130 .
addReg(AArch64::Z0 + (SrcReg - AArch64::Q0));
6131 }
else if (Subtarget.isNeonAvailable()) {
6135 if (Subtarget.hasZeroCycleRegMoveFPR128())
6136 ++NumZCRegMoveInstrsFPR;
6152 if (AArch64::FPR64RegClass.
contains(DestReg) &&
6153 AArch64::FPR64RegClass.
contains(SrcReg)) {
6154 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6155 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6156 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6158 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::dsub,
6159 &AArch64::FPR128RegClass);
6160 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::dsub,
6161 &AArch64::FPR128RegClass);
6170 ++NumZCRegMoveInstrsFPR;
6174 if (Subtarget.hasZeroCycleRegMoveFPR64())
6175 ++NumZCRegMoveInstrsFPR;
6180 if (AArch64::FPR32RegClass.
contains(DestReg) &&
6181 AArch64::FPR32RegClass.
contains(SrcReg)) {
6182 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6183 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6184 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6186 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::ssub,
6187 &AArch64::FPR128RegClass);
6188 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::ssub,
6189 &AArch64::FPR128RegClass);
6198 ++NumZCRegMoveInstrsFPR;
6199 }
else if (Subtarget.hasZeroCycleRegMoveFPR64() &&
6200 !Subtarget.hasZeroCycleRegMoveFPR32()) {
6201 MCRegister DestRegD = RI.getMatchingSuperReg(DestReg, AArch64::ssub,
6202 &AArch64::FPR64RegClass);
6203 MCRegister SrcRegD = RI.getMatchingSuperReg(SrcReg, AArch64::ssub,
6204 &AArch64::FPR64RegClass);
6212 ++NumZCRegMoveInstrsFPR;
6216 if (Subtarget.hasZeroCycleRegMoveFPR32())
6217 ++NumZCRegMoveInstrsFPR;
6222 if (AArch64::FPR16RegClass.
contains(DestReg) &&
6223 AArch64::FPR16RegClass.
contains(SrcReg)) {
6224 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6225 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6226 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6228 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
6229 &AArch64::FPR128RegClass);
6230 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
6231 &AArch64::FPR128RegClass);
6240 }
else if (Subtarget.hasZeroCycleRegMoveFPR64() &&
6241 !Subtarget.hasZeroCycleRegMoveFPR32()) {
6242 MCRegister DestRegD = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
6243 &AArch64::FPR64RegClass);
6244 MCRegister SrcRegD = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
6245 &AArch64::FPR64RegClass);
6254 DestReg = RI.getMatchingSuperReg(DestReg, AArch64::hsub,
6255 &AArch64::FPR32RegClass);
6256 SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::hsub,
6257 &AArch64::FPR32RegClass);
6264 if (AArch64::FPR8RegClass.
contains(DestReg) &&
6265 AArch64::FPR8RegClass.
contains(SrcReg)) {
6266 if (Subtarget.hasZeroCycleRegMoveFPR128() &&
6267 !Subtarget.hasZeroCycleRegMoveFPR64() &&
6268 !Subtarget.hasZeroCycleRegMoveFPR32() && Subtarget.isNeonAvailable() &&
6270 MCRegister DestRegQ = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
6271 &AArch64::FPR128RegClass);
6272 MCRegister SrcRegQ = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
6273 &AArch64::FPR128RegClass);
6282 }
else if (Subtarget.hasZeroCycleRegMoveFPR64() &&
6283 !Subtarget.hasZeroCycleRegMoveFPR32()) {
6284 MCRegister DestRegD = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
6285 &AArch64::FPR64RegClass);
6286 MCRegister SrcRegD = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
6287 &AArch64::FPR64RegClass);
6296 DestReg = RI.getMatchingSuperReg(DestReg, AArch64::bsub,
6297 &AArch64::FPR32RegClass);
6298 SrcReg = RI.getMatchingSuperReg(SrcReg, AArch64::bsub,
6299 &AArch64::FPR32RegClass);
6307 if (AArch64::FPR64RegClass.
contains(DestReg) &&
6308 AArch64::GPR64RegClass.
contains(SrcReg)) {
6309 if (AArch64::XZR == SrcReg) {
6317 if (AArch64::GPR64RegClass.
contains(DestReg) &&
6318 AArch64::FPR64RegClass.
contains(SrcReg)) {
6324 if (AArch64::FPR32RegClass.
contains(DestReg) &&
6325 AArch64::GPR32RegClass.
contains(SrcReg)) {
6326 if (AArch64::WZR == SrcReg) {
6334 if (AArch64::GPR32RegClass.
contains(DestReg) &&
6335 AArch64::FPR32RegClass.
contains(SrcReg)) {
6341 if (DestReg == AArch64::NZCV) {
6342 assert(AArch64::GPR64RegClass.
contains(SrcReg) &&
"Invalid NZCV copy");
6344 .
addImm(AArch64SysReg::NZCV)
6350 if (SrcReg == AArch64::NZCV) {
6351 assert(AArch64::GPR64RegClass.
contains(DestReg) &&
"Invalid NZCV copy");
6353 .
addImm(AArch64SysReg::NZCV)
6359 errs() << RI.getRegAsmName(DestReg) <<
" = COPY " << RI.getRegAsmName(SrcReg)
6370 bool RenamableSrc)
const {
6382 unsigned SubIdx0,
unsigned SubIdx1,
int FI,
6387 SrcReg0 =
TRI.getSubReg(SrcReg, SubIdx0);
6389 SrcReg1 =
TRI.getSubReg(SrcReg, SubIdx1);
6402 Register SrcReg,
bool isKill,
int FI,
6417 switch (RI.getSpillSize(*RC)) {
6419 if (AArch64::FPR8RegClass.hasSubClassEq(RC))
6420 Opc = AArch64::STRBui;
6423 if (AArch64::FPR16RegClass.hasSubClassEq(RC))
6424 Opc = AArch64::STRHui;
6425 else if (AArch64::PNRRegClass.hasSubClassEq(RC) ||
6426 AArch64::PPRRegClass.hasSubClassEq(RC)) {
6427 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6428 "Unexpected register store without SVE store instructions");
6429 Opc = AArch64::STR_PXI;
6435 if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
6436 Opc = AArch64::STRWui;
6440 assert(SrcReg != AArch64::WSP);
6441 }
else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
6442 Opc = AArch64::STRSui;
6443 else if (AArch64::PPR2RegClass.hasSubClassEq(RC)) {
6444 Opc = AArch64::STR_PPXI;
6449 if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
6450 Opc = AArch64::STRXui;
6454 assert(SrcReg != AArch64::SP);
6455 }
else if (AArch64::FPR64RegClass.hasSubClassEq(RC)) {
6456 Opc = AArch64::STRDui;
6457 }
else if (AArch64::WSeqPairsClassRegClass.hasSubClassEq(RC)) {
6459 get(AArch64::STPWi), SrcReg, isKill,
6460 AArch64::sube32, AArch64::subo32, FI, MMO);
6465 if (AArch64::FPR128RegClass.hasSubClassEq(RC))
6466 Opc = AArch64::STRQui;
6467 else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
6468 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6469 Opc = AArch64::ST1Twov1d;
6471 }
else if (AArch64::XSeqPairsClassRegClass.hasSubClassEq(RC)) {
6473 get(AArch64::STPXi), SrcReg, isKill,
6474 AArch64::sube64, AArch64::subo64, FI, MMO);
6476 }
else if (AArch64::ZPRRegClass.hasSubClassEq(RC)) {
6477 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6478 "Unexpected register store without SVE store instructions");
6479 Opc = AArch64::STR_ZXI;
6484 if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
6485 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6486 Opc = AArch64::ST1Threev1d;
6491 if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
6492 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6493 Opc = AArch64::ST1Fourv1d;
6495 }
else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
6496 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6497 Opc = AArch64::ST1Twov2d;
6499 }
else if (AArch64::ZPR2StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6500 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6501 "Unexpected register store without SVE store instructions");
6502 Opc = AArch64::STR_ZZXI_STRIDED_CONTIGUOUS;
6504 }
else if (AArch64::ZPR2RegClass.hasSubClassEq(RC)) {
6505 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6506 "Unexpected register store without SVE store instructions");
6507 Opc = AArch64::STR_ZZXI;
6512 if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
6513 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6514 Opc = AArch64::ST1Threev2d;
6516 }
else if (AArch64::ZPR3RegClass.hasSubClassEq(RC)) {
6517 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6518 "Unexpected register store without SVE store instructions");
6519 Opc = AArch64::STR_ZZZXI;
6524 if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
6525 assert(Subtarget.hasNEON() &&
"Unexpected register store without NEON");
6526 Opc = AArch64::ST1Fourv2d;
6528 }
else if (AArch64::ZPR4StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6529 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6530 "Unexpected register store without SVE store instructions");
6531 Opc = AArch64::STR_ZZZZXI_STRIDED_CONTIGUOUS;
6533 }
else if (AArch64::ZPR4RegClass.hasSubClassEq(RC)) {
6534 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6535 "Unexpected register store without SVE store instructions");
6536 Opc = AArch64::STR_ZZZZXI;
6541 assert(
Opc &&
"Unknown register class");
6552 MI.addMemOperand(MMO);
6559 Register DestReg,
unsigned SubIdx0,
6560 unsigned SubIdx1,
int FI,
6564 bool IsUndef =
true;
6566 DestReg0 =
TRI.getSubReg(DestReg, SubIdx0);
6568 DestReg1 =
TRI.getSubReg(DestReg, SubIdx1);
6597 switch (
TRI.getSpillSize(*RC)) {
6599 if (AArch64::FPR8RegClass.hasSubClassEq(RC))
6600 Opc = AArch64::LDRBui;
6603 bool IsPNR = AArch64::PNRRegClass.hasSubClassEq(RC);
6604 if (AArch64::FPR16RegClass.hasSubClassEq(RC))
6605 Opc = AArch64::LDRHui;
6606 else if (IsPNR || AArch64::PPRRegClass.hasSubClassEq(RC)) {
6607 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6608 "Unexpected register load without SVE load instructions");
6611 Opc = AArch64::LDR_PXI;
6617 if (AArch64::GPR32allRegClass.hasSubClassEq(RC)) {
6618 Opc = AArch64::LDRWui;
6622 assert(DestReg != AArch64::WSP);
6623 }
else if (AArch64::FPR32RegClass.hasSubClassEq(RC))
6624 Opc = AArch64::LDRSui;
6625 else if (AArch64::PPR2RegClass.hasSubClassEq(RC)) {
6626 Opc = AArch64::LDR_PPXI;
6631 if (AArch64::GPR64allRegClass.hasSubClassEq(RC)) {
6632 Opc = AArch64::LDRXui;
6636 assert(DestReg != AArch64::SP);
6637 }
else if (AArch64::FPR64RegClass.hasSubClassEq(RC)) {
6638 Opc = AArch64::LDRDui;
6639 }
else if (AArch64::WSeqPairsClassRegClass.hasSubClassEq(RC)) {
6641 get(AArch64::LDPWi), DestReg, AArch64::sube32,
6642 AArch64::subo32, FI, MMO);
6647 if (AArch64::FPR128RegClass.hasSubClassEq(RC))
6648 Opc = AArch64::LDRQui;
6649 else if (AArch64::DDRegClass.hasSubClassEq(RC)) {
6650 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6651 Opc = AArch64::LD1Twov1d;
6653 }
else if (AArch64::XSeqPairsClassRegClass.hasSubClassEq(RC)) {
6655 get(AArch64::LDPXi), DestReg, AArch64::sube64,
6656 AArch64::subo64, FI, MMO);
6658 }
else if (AArch64::ZPRRegClass.hasSubClassEq(RC)) {
6659 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6660 "Unexpected register load without SVE load instructions");
6661 Opc = AArch64::LDR_ZXI;
6666 if (AArch64::DDDRegClass.hasSubClassEq(RC)) {
6667 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6668 Opc = AArch64::LD1Threev1d;
6673 if (AArch64::DDDDRegClass.hasSubClassEq(RC)) {
6674 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6675 Opc = AArch64::LD1Fourv1d;
6677 }
else if (AArch64::QQRegClass.hasSubClassEq(RC)) {
6678 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6679 Opc = AArch64::LD1Twov2d;
6681 }
else if (AArch64::ZPR2StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6682 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6683 "Unexpected register load without SVE load instructions");
6684 Opc = AArch64::LDR_ZZXI_STRIDED_CONTIGUOUS;
6686 }
else if (AArch64::ZPR2RegClass.hasSubClassEq(RC)) {
6687 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6688 "Unexpected register load without SVE load instructions");
6689 Opc = AArch64::LDR_ZZXI;
6694 if (AArch64::QQQRegClass.hasSubClassEq(RC)) {
6695 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6696 Opc = AArch64::LD1Threev2d;
6698 }
else if (AArch64::ZPR3RegClass.hasSubClassEq(RC)) {
6699 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6700 "Unexpected register load without SVE load instructions");
6701 Opc = AArch64::LDR_ZZZXI;
6706 if (AArch64::QQQQRegClass.hasSubClassEq(RC)) {
6707 assert(Subtarget.hasNEON() &&
"Unexpected register load without NEON");
6708 Opc = AArch64::LD1Fourv2d;
6710 }
else if (AArch64::ZPR4StridedOrContiguousRegClass.hasSubClassEq(RC)) {
6711 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6712 "Unexpected register load without SVE load instructions");
6713 Opc = AArch64::LDR_ZZZZXI_STRIDED_CONTIGUOUS;
6715 }
else if (AArch64::ZPR4RegClass.hasSubClassEq(RC)) {
6716 assert(Subtarget.isSVEorStreamingSVEAvailable() &&
6717 "Unexpected register load without SVE load instructions");
6718 Opc = AArch64::LDR_ZZZZXI;
6724 assert(
Opc &&
"Unknown register class");
6734 MI.addMemOperand(MMO);
6741 UseMI.getIterator()),
6743 return I.modifiesRegister(AArch64::NZCV, TRI) ||
6744 I.readsRegister(AArch64::NZCV, TRI);
6748void AArch64InstrInfo::decomposeStackOffsetForDwarfOffsets(
6753 assert(
Offset.getScalable() % 2 == 0 &&
"Invalid frame offset");
6760 ByteSized =
Offset.getFixed();
6761 VGSized =
Offset.getScalable() / 2;
6767void AArch64InstrInfo::decomposeStackOffsetForFrameOffsets(
6769 int64_t &NumDataVectors) {
6773 assert(
Offset.getScalable() % 2 == 0 &&
"Invalid frame offset");
6775 NumBytes =
Offset.getFixed();
6777 NumPredicateVectors =
Offset.getScalable() / 2;
6782 if (NumPredicateVectors % 8 == 0 || NumPredicateVectors < -64 ||
6783 NumPredicateVectors > 62) {
6784 NumDataVectors = NumPredicateVectors / 8;
6785 NumPredicateVectors -= NumDataVectors * 8;
6811 Expr.
push_back((
char)dwarf::DW_OP_bregx);
6819 int64_t OffsetFromDefCFA) {
6833 Comment << (NumBytes < 0 ?
" - " :
" + ") << std::abs(NumBytes);
6834 if (!RegScale.empty())
6844 int64_t NumBytes, NumVGScaledBytes;
6845 AArch64InstrInfo::decomposeStackOffsetForDwarfOffsets(
Offset, NumBytes,
6847 std::string CommentBuffer;
6850 if (
Reg == AArch64::SP)
6852 else if (
Reg == AArch64::FP)
6859 unsigned DwarfReg =
TRI.getDwarfRegNum(
Reg,
true);
6860 assert(DwarfReg <= 31 &&
"DwarfReg out of bounds (0..31)");
6862 Expr.
push_back(dwarf::DW_OP_breg0 + DwarfReg);
6865 if (NumVGScaledBytes) {
6875 DefCfaExpr.
push_back(dwarf::DW_CFA_def_cfa_expression);
6883 unsigned FrameReg,
unsigned Reg,
6885 bool LastAdjustmentWasScalable) {
6886 if (
Offset.getScalable())
6889 if (FrameReg == Reg && !LastAdjustmentWasScalable)
6892 unsigned DwarfReg =
TRI.getDwarfRegNum(Reg,
true);
6899 std::optional<int64_t> IncomingVGOffsetFromDefCFA) {
6900 int64_t NumBytes, NumVGScaledBytes;
6901 AArch64InstrInfo::decomposeStackOffsetForDwarfOffsets(
6902 OffsetFromDefCFA, NumBytes, NumVGScaledBytes);
6904 unsigned DwarfReg =
TRI.getDwarfRegNum(Reg,
true);
6907 if (!NumVGScaledBytes)
6910 std::string CommentBuffer;
6915 assert(NumVGScaledBytes &&
"Expected scalable offset");
6919 if (IncomingVGOffsetFromDefCFA) {
6921 VGRegScale =
"* IncomingVG";
6924 VGRegScale =
"* VG";
6928 OffsetExpr.
push_back(dwarf::DW_OP_plus);
6937 CfaExpr.
push_back(dwarf::DW_CFA_expression);
6952 unsigned SrcReg, int64_t
Offset,
unsigned Opc,
6955 bool *HasWinCFI,
bool EmitCFAOffset,
6958 unsigned MaxEncoding, ShiftSize;
6960 case AArch64::ADDXri:
6961 case AArch64::ADDSXri:
6962 case AArch64::SUBXri:
6963 case AArch64::SUBSXri:
6964 MaxEncoding = 0xfff;
6967 case AArch64::ADDVL_XXI:
6968 case AArch64::ADDPL_XXI:
6969 case AArch64::ADDSVL_XXI:
6970 case AArch64::ADDSPL_XXI:
6985 if (
Opc == AArch64::ADDVL_XXI ||
Opc == AArch64::ADDSVL_XXI)
6987 else if (
Opc == AArch64::ADDPL_XXI ||
Opc == AArch64::ADDSPL_XXI)
7001 const unsigned MaxEncodableValue = MaxEncoding << ShiftSize;
7003 if (TmpReg == AArch64::XZR)
7004 TmpReg =
MBB.getParent()->getRegInfo().createVirtualRegister(
7005 &AArch64::GPR64RegClass);
7007 uint64_t ThisVal = std::min<uint64_t>(
Offset, MaxEncodableValue);
7008 unsigned LocalShiftSize = 0;
7009 if (ThisVal > MaxEncoding) {
7010 ThisVal = ThisVal >> ShiftSize;
7011 LocalShiftSize = ShiftSize;
7013 assert((ThisVal >> ShiftSize) <= MaxEncoding &&
7014 "Encoding cannot handle value that big");
7016 Offset -= ThisVal << LocalShiftSize;
7021 .
addImm(Sign * (
int)ThisVal);
7031 if (Sign == -1 ||
Opc == AArch64::SUBXri ||
Opc == AArch64::SUBSXri)
7032 CFAOffset += Change;
7034 CFAOffset -= Change;
7035 if (EmitCFAOffset && DestReg == TmpReg) {
7048 int Imm = (int)(ThisVal << LocalShiftSize);
7049 if (VScale != 1 && DestReg == AArch64::SP) {
7055 }
else if ((DestReg == AArch64::FP && SrcReg == AArch64::SP) ||
7056 (SrcReg == AArch64::FP && DestReg == AArch64::SP)) {
7057 assert(VScale == 1 &&
"Expected non-scalable operation");
7066 assert(
Offset == 0 &&
"Expected remaining offset to be zero to "
7067 "emit a single SEH directive");
7068 }
else if (DestReg == AArch64::SP) {
7069 assert(VScale == 1 &&
"Expected non-scalable operation");
7072 assert(SrcReg == AArch64::SP &&
"Unexpected SrcReg for SEH_StackAlloc");
7085 unsigned DestReg,
unsigned SrcReg,
7088 bool NeedsWinCFI,
bool *HasWinCFI,
7090 unsigned FrameReg) {
7097 bool UseSVL =
F.hasFnAttribute(
"aarch64_pstate_sm_body");
7099 int64_t Bytes, NumPredicateVectors, NumDataVectors;
7100 AArch64InstrInfo::decomposeStackOffsetForFrameOffsets(
7101 Offset, Bytes, NumPredicateVectors, NumDataVectors);
7104 bool NeedsFinalDefNZCV = SetNZCV && (NumPredicateVectors || NumDataVectors);
7105 if (NeedsFinalDefNZCV)
7109 if (Bytes || (!
Offset && SrcReg != DestReg)) {
7110 assert((DestReg != AArch64::SP || Bytes % 8 == 0) &&
7111 "SP increment/decrement not 8-byte aligned");
7112 unsigned Opc = SetNZCV ? AArch64::ADDSXri : AArch64::ADDXri;
7115 Opc = SetNZCV ? AArch64::SUBSXri : AArch64::SUBXri;
7118 NeedsWinCFI, HasWinCFI, EmitCFAOffset, CFAOffset,
7120 CFAOffset += (
Opc == AArch64::ADDXri ||
Opc == AArch64::ADDSXri)
7127 assert(!(NeedsWinCFI && NumPredicateVectors) &&
7128 "WinCFI can't allocate fractions of an SVE data vector");
7130 if (NumDataVectors) {
7132 UseSVL ? AArch64::ADDSVL_XXI : AArch64::ADDVL_XXI,
TII,
7133 Flag, NeedsWinCFI, HasWinCFI, EmitCFAOffset, CFAOffset,
7139 if (NumPredicateVectors) {
7140 assert(DestReg != AArch64::SP &&
"Unaligned access to SP");
7142 UseSVL ? AArch64::ADDSPL_XXI : AArch64::ADDPL_XXI,
TII,
7143 Flag, NeedsWinCFI, HasWinCFI, EmitCFAOffset, CFAOffset,
7147 if (NeedsFinalDefNZCV)
7169 if (
MI.isFullCopy()) {
7172 if (SrcReg == AArch64::SP && DstReg.
isVirtual()) {
7176 if (DstReg == AArch64::SP && SrcReg.
isVirtual()) {
7181 if (SrcReg == AArch64::NZCV || DstReg == AArch64::NZCV)
7209 if (
MI.isCopy() &&
Ops.size() == 1 &&
7211 (
Ops[0] == 0 ||
Ops[0] == 1)) {
7212 bool IsSpill =
Ops[0] == 0;
7213 bool IsFill = !IsSpill;
7225 :
TRI.getMinimalPhysRegClass(Reg);
7231 "Mismatched register size in non subreg COPY");
7238 return &*--InsertPt;
7250 if (IsSpill && DstMO.
isUndef() && SrcReg == AArch64::WZR &&
7253 "Unexpected subreg on physical register");
7255 FrameIndex, &AArch64::GPR64RegClass,
Register());
7256 return &*--InsertPt;
7273 case AArch64::sub_32:
7274 if (AArch64::GPR64RegClass.hasSubClassEq(
getRegClass(DstReg)))
7275 FillRC = &AArch64::GPR32RegClass;
7278 FillRC = &AArch64::FPR32RegClass;
7281 FillRC = &AArch64::FPR64RegClass;
7287 TRI.getRegSizeInBits(*FillRC) &&
7288 "Mismatched regclass size on folded subreg COPY");
7307 bool *OutUseUnscaledOp,
7308 unsigned *OutUnscaledOp,
7309 int64_t *EmittableOffset) {
7311 if (EmittableOffset)
7312 *EmittableOffset = 0;
7313 if (OutUseUnscaledOp)
7314 *OutUseUnscaledOp =
false;
7320 switch (
MI.getOpcode()) {
7323 case AArch64::LD1Rv1d:
7324 case AArch64::LD1Rv2s:
7325 case AArch64::LD1Rv2d:
7326 case AArch64::LD1Rv4h:
7327 case AArch64::LD1Rv4s:
7328 case AArch64::LD1Rv8b:
7329 case AArch64::LD1Rv8h:
7330 case AArch64::LD1Rv16b:
7331 case AArch64::LD1Twov2d:
7332 case AArch64::LD1Threev2d:
7333 case AArch64::LD1Fourv2d:
7334 case AArch64::LD1Twov1d:
7335 case AArch64::LD1Threev1d:
7336 case AArch64::LD1Fourv1d:
7337 case AArch64::ST1Twov2d:
7338 case AArch64::ST1Threev2d:
7339 case AArch64::ST1Fourv2d:
7340 case AArch64::ST1Twov1d:
7341 case AArch64::ST1Threev1d:
7342 case AArch64::ST1Fourv1d:
7343 case AArch64::ST1i8:
7344 case AArch64::ST1i16:
7345 case AArch64::ST1i32:
7346 case AArch64::ST1i64:
7348 case AArch64::IRGstack:
7349 case AArch64::STGloop:
7350 case AArch64::STZGloop:
7355 TypeSize ScaleValue(0U,
false), Width(0U,
false);
7356 int64_t MinOff, MaxOff;
7362 bool IsMulVL = ScaleValue.isScalable();
7363 unsigned Scale = ScaleValue.getKnownMinValue();
7373 std::optional<unsigned> UnscaledOp =
7375 bool useUnscaledOp = UnscaledOp && (
Offset % Scale ||
Offset < 0);
7376 if (useUnscaledOp &&
7381 Scale = ScaleValue.getKnownMinValue();
7382 assert(IsMulVL == ScaleValue.isScalable() &&
7383 "Unscaled opcode has different value for scalable");
7385 int64_t Remainder =
Offset % Scale;
7386 assert(!(Remainder && useUnscaledOp) &&
7387 "Cannot have remainder when using unscaled op");
7389 assert(MinOff < MaxOff &&
"Unexpected Min/Max offsets");
7390 int64_t NewOffset =
Offset / Scale;
7391 if (MinOff <= NewOffset && NewOffset <= MaxOff)
7399 int64_t HighPart =
Offset & ~0xFFF;
7400 int64_t LowPart =
Offset & 0xFFF;
7401 int64_t LowScaled = LowPart / Scale;
7402 if (!IsMulVL && NewOffset >= 0 && LowPart % Scale == 0 &&
7403 MinOff <= LowScaled && LowScaled <= MaxOff &&
7405 NewOffset = LowScaled;
7410 NewOffset = NewOffset < 0 ? MinOff : MaxOff;
7415 if (EmittableOffset)
7416 *EmittableOffset = NewOffset;
7417 if (OutUseUnscaledOp)
7418 *OutUseUnscaledOp = useUnscaledOp;
7419 if (OutUnscaledOp && UnscaledOp)
7420 *OutUnscaledOp = *UnscaledOp;
7433 unsigned Opcode =
MI.getOpcode();
7434 unsigned ImmIdx = FrameRegIdx + 1;
7436 if (Opcode == AArch64::ADDSXri || Opcode == AArch64::ADDXri) {
7441 MI.eraseFromParent();
7447 unsigned UnscaledOp;
7450 &UnscaledOp, &NewOffset);
7454 MI.getOperand(FrameRegIdx).ChangeToRegister(FrameReg,
false);
7456 MI.setDesc(
TII->get(UnscaledOp));
7458 MI.getOperand(ImmIdx).ChangeToImmediate(NewOffset);
7474bool AArch64InstrInfo::useMachineCombiner()
const {
return true; }
7479 case AArch64::ADDSWrr:
7480 case AArch64::ADDSWri:
7481 case AArch64::ADDSXrr:
7482 case AArch64::ADDSXri:
7483 case AArch64::SUBSWrr:
7484 case AArch64::SUBSXrr:
7486 case AArch64::SUBSWri:
7487 case AArch64::SUBSXri:
7498 case AArch64::ADDWrr:
7499 case AArch64::ADDWri:
7500 case AArch64::SUBWrr:
7501 case AArch64::ADDSWrr:
7502 case AArch64::ADDSWri:
7503 case AArch64::SUBSWrr:
7505 case AArch64::SUBWri:
7506 case AArch64::SUBSWri:
7517 case AArch64::ADDXrr:
7518 case AArch64::ADDXri:
7519 case AArch64::SUBXrr:
7520 case AArch64::ADDSXrr:
7521 case AArch64::ADDSXri:
7522 case AArch64::SUBSXrr:
7524 case AArch64::SUBXri:
7525 case AArch64::SUBSXri:
7526 case AArch64::ADDv8i8:
7527 case AArch64::ADDv16i8:
7528 case AArch64::ADDv4i16:
7529 case AArch64::ADDv8i16:
7530 case AArch64::ADDv2i32:
7531 case AArch64::ADDv4i32:
7532 case AArch64::SUBv8i8:
7533 case AArch64::SUBv16i8:
7534 case AArch64::SUBv4i16:
7535 case AArch64::SUBv8i16:
7536 case AArch64::SUBv2i32:
7537 case AArch64::SUBv4i32:
7550 case AArch64::FADDHrr:
7551 case AArch64::FADDSrr:
7552 case AArch64::FADDDrr:
7553 case AArch64::FADDv4f16:
7554 case AArch64::FADDv8f16:
7555 case AArch64::FADDv2f32:
7556 case AArch64::FADDv2f64:
7557 case AArch64::FADDv4f32:
7558 case AArch64::FSUBHrr:
7559 case AArch64::FSUBSrr:
7560 case AArch64::FSUBDrr:
7561 case AArch64::FSUBv4f16:
7562 case AArch64::FSUBv8f16:
7563 case AArch64::FSUBv2f32:
7564 case AArch64::FSUBv2f64:
7565 case AArch64::FSUBv4f32:
7584 unsigned CombineOpc,
unsigned ZeroReg = 0,
7585 bool CheckZeroReg =
false) {
7592 if (!
MI ||
MI->getParent() != &
MBB ||
MI->getOpcode() != CombineOpc)
7599 assert(
MI->getNumOperands() >= 4 &&
MI->getOperand(0).isReg() &&
7600 MI->getOperand(1).isReg() &&
MI->getOperand(2).isReg() &&
7601 MI->getOperand(3).isReg() &&
"MAdd/MSub must have a least 4 regs");
7603 if (
MI->getOperand(3).getReg() != ZeroReg)
7608 MI->findRegisterDefOperandIdx(AArch64::NZCV,
nullptr,
true) == -1)
7617 unsigned MulOpc,
unsigned ZeroReg) {
7632bool AArch64InstrInfo::isAssociativeAndCommutative(
const MachineInstr &Inst,
7633 bool Invert)
const {
7639 case AArch64::FADDHrr:
7640 case AArch64::FADDSrr:
7641 case AArch64::FADDDrr:
7642 case AArch64::FMULHrr:
7643 case AArch64::FMULSrr:
7644 case AArch64::FMULDrr:
7645 case AArch64::FMULX16:
7646 case AArch64::FMULX32:
7647 case AArch64::FMULX64:
7649 case AArch64::FADDv4f16:
7650 case AArch64::FADDv8f16:
7651 case AArch64::FADDv2f32:
7652 case AArch64::FADDv4f32:
7653 case AArch64::FADDv2f64:
7654 case AArch64::FMULv4f16:
7655 case AArch64::FMULv8f16:
7656 case AArch64::FMULv2f32:
7657 case AArch64::FMULv4f32:
7658 case AArch64::FMULv2f64:
7659 case AArch64::FMULXv4f16:
7660 case AArch64::FMULXv8f16:
7661 case AArch64::FMULXv2f32:
7662 case AArch64::FMULXv4f32:
7663 case AArch64::FMULXv2f64:
7667 case AArch64::FADD_ZZZ_H:
7668 case AArch64::FADD_ZZZ_S:
7669 case AArch64::FADD_ZZZ_D:
7670 case AArch64::FMUL_ZZZ_H:
7671 case AArch64::FMUL_ZZZ_S:
7672 case AArch64::FMUL_ZZZ_D:
7683 case AArch64::ADDWrr:
7684 case AArch64::ADDXrr:
7685 case AArch64::ANDWrr:
7686 case AArch64::ANDXrr:
7687 case AArch64::ORRWrr:
7688 case AArch64::ORRXrr:
7689 case AArch64::EORWrr:
7690 case AArch64::EORXrr:
7691 case AArch64::EONWrr:
7692 case AArch64::EONXrr:
7696 case AArch64::ADDv8i8:
7697 case AArch64::ADDv16i8:
7698 case AArch64::ADDv4i16:
7699 case AArch64::ADDv8i16:
7700 case AArch64::ADDv2i32:
7701 case AArch64::ADDv4i32:
7702 case AArch64::ADDv1i64:
7703 case AArch64::ADDv2i64:
7704 case AArch64::MULv8i8:
7705 case AArch64::MULv16i8:
7706 case AArch64::MULv4i16:
7707 case AArch64::MULv8i16:
7708 case AArch64::MULv2i32:
7709 case AArch64::MULv4i32:
7710 case AArch64::ANDv8i8:
7711 case AArch64::ANDv16i8:
7712 case AArch64::ORRv8i8:
7713 case AArch64::ORRv16i8:
7714 case AArch64::EORv8i8:
7715 case AArch64::EORv16i8:
7717 case AArch64::ADD_ZZZ_B:
7718 case AArch64::ADD_ZZZ_H:
7719 case AArch64::ADD_ZZZ_S:
7720 case AArch64::ADD_ZZZ_D:
7721 case AArch64::MUL_ZZZ_B:
7722 case AArch64::MUL_ZZZ_H:
7723 case AArch64::MUL_ZZZ_S:
7724 case AArch64::MUL_ZZZ_D:
7725 case AArch64::AND_ZZZ:
7726 case AArch64::ORR_ZZZ:
7727 case AArch64::EOR_ZZZ:
7758 auto setFound = [&](
int Opcode,
int Operand,
unsigned ZeroReg,
7766 auto setVFound = [&](
int Opcode,
int Operand,
unsigned Pattern) {
7778 case AArch64::ADDWrr:
7780 "ADDWrr does not have register operands");
7781 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULADDW_OP1);
7782 setFound(AArch64::MADDWrrr, 2, AArch64::WZR, MCP::MULADDW_OP2);
7784 case AArch64::ADDXrr:
7785 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULADDX_OP1);
7786 setFound(AArch64::MADDXrrr, 2, AArch64::XZR, MCP::MULADDX_OP2);
7788 case AArch64::SUBWrr:
7789 setFound(AArch64::MADDWrrr, 2, AArch64::WZR, MCP::MULSUBW_OP2);
7790 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULSUBW_OP1);
7792 case AArch64::SUBXrr:
7793 setFound(AArch64::MADDXrrr, 2, AArch64::XZR, MCP::MULSUBX_OP2);
7794 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULSUBX_OP1);
7796 case AArch64::ADDWri:
7797 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULADDWI_OP1);
7799 case AArch64::ADDXri:
7800 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULADDXI_OP1);
7802 case AArch64::SUBWri:
7803 setFound(AArch64::MADDWrrr, 1, AArch64::WZR, MCP::MULSUBWI_OP1);
7805 case AArch64::SUBXri:
7806 setFound(AArch64::MADDXrrr, 1, AArch64::XZR, MCP::MULSUBXI_OP1);
7808 case AArch64::ADDv8i8:
7809 setVFound(AArch64::MULv8i8, 1, MCP::MULADDv8i8_OP1);
7810 setVFound(AArch64::MULv8i8, 2, MCP::MULADDv8i8_OP2);
7812 case AArch64::ADDv16i8:
7813 setVFound(AArch64::MULv16i8, 1, MCP::MULADDv16i8_OP1);
7814 setVFound(AArch64::MULv16i8, 2, MCP::MULADDv16i8_OP2);
7816 case AArch64::ADDv4i16:
7817 setVFound(AArch64::MULv4i16, 1, MCP::MULADDv4i16_OP1);
7818 setVFound(AArch64::MULv4i16, 2, MCP::MULADDv4i16_OP2);
7819 setVFound(AArch64::MULv4i16_indexed, 1, MCP::MULADDv4i16_indexed_OP1);
7820 setVFound(AArch64::MULv4i16_indexed, 2, MCP::MULADDv4i16_indexed_OP2);
7822 case AArch64::ADDv8i16:
7823 setVFound(AArch64::MULv8i16, 1, MCP::MULADDv8i16_OP1);
7824 setVFound(AArch64::MULv8i16, 2, MCP::MULADDv8i16_OP2);
7825 setVFound(AArch64::MULv8i16_indexed, 1, MCP::MULADDv8i16_indexed_OP1);
7826 setVFound(AArch64::MULv8i16_indexed, 2, MCP::MULADDv8i16_indexed_OP2);
7828 case AArch64::ADDv2i32:
7829 setVFound(AArch64::MULv2i32, 1, MCP::MULADDv2i32_OP1);
7830 setVFound(AArch64::MULv2i32, 2, MCP::MULADDv2i32_OP2);
7831 setVFound(AArch64::MULv2i32_indexed, 1, MCP::MULADDv2i32_indexed_OP1);
7832 setVFound(AArch64::MULv2i32_indexed, 2, MCP::MULADDv2i32_indexed_OP2);
7834 case AArch64::ADDv4i32:
7835 setVFound(AArch64::MULv4i32, 1, MCP::MULADDv4i32_OP1);
7836 setVFound(AArch64::MULv4i32, 2, MCP::MULADDv4i32_OP2);
7837 setVFound(AArch64::MULv4i32_indexed, 1, MCP::MULADDv4i32_indexed_OP1);
7838 setVFound(AArch64::MULv4i32_indexed, 2, MCP::MULADDv4i32_indexed_OP2);
7840 case AArch64::SUBv8i8:
7841 setVFound(AArch64::MULv8i8, 1, MCP::MULSUBv8i8_OP1);
7842 setVFound(AArch64::MULv8i8, 2, MCP::MULSUBv8i8_OP2);
7844 case AArch64::SUBv16i8:
7845 setVFound(AArch64::MULv16i8, 1, MCP::MULSUBv16i8_OP1);
7846 setVFound(AArch64::MULv16i8, 2, MCP::MULSUBv16i8_OP2);
7848 case AArch64::SUBv4i16:
7849 setVFound(AArch64::MULv4i16, 1, MCP::MULSUBv4i16_OP1);
7850 setVFound(AArch64::MULv4i16, 2, MCP::MULSUBv4i16_OP2);
7851 setVFound(AArch64::MULv4i16_indexed, 1, MCP::MULSUBv4i16_indexed_OP1);
7852 setVFound(AArch64::MULv4i16_indexed, 2, MCP::MULSUBv4i16_indexed_OP2);
7854 case AArch64::SUBv8i16:
7855 setVFound(AArch64::MULv8i16, 1, MCP::MULSUBv8i16_OP1);
7856 setVFound(AArch64::MULv8i16, 2, MCP::MULSUBv8i16_OP2);
7857 setVFound(AArch64::MULv8i16_indexed, 1, MCP::MULSUBv8i16_indexed_OP1);
7858 setVFound(AArch64::MULv8i16_indexed, 2, MCP::MULSUBv8i16_indexed_OP2);
7860 case AArch64::SUBv2i32:
7861 setVFound(AArch64::MULv2i32, 1, MCP::MULSUBv2i32_OP1);
7862 setVFound(AArch64::MULv2i32, 2, MCP::MULSUBv2i32_OP2);
7863 setVFound(AArch64::MULv2i32_indexed, 1, MCP::MULSUBv2i32_indexed_OP1);
7864 setVFound(AArch64::MULv2i32_indexed, 2, MCP::MULSUBv2i32_indexed_OP2);
7866 case AArch64::SUBv4i32:
7867 setVFound(AArch64::MULv4i32, 1, MCP::MULSUBv4i32_OP1);
7868 setVFound(AArch64::MULv4i32, 2, MCP::MULSUBv4i32_OP2);
7869 setVFound(AArch64::MULv4i32_indexed, 1, MCP::MULSUBv4i32_indexed_OP1);
7870 setVFound(AArch64::MULv4i32_indexed, 2, MCP::MULSUBv4i32_indexed_OP2);
7876bool AArch64InstrInfo::isAccumulationOpcode(
unsigned Opcode)
const {
7880 case AArch64::UABALB_ZZZ_D:
7881 case AArch64::UABALB_ZZZ_H:
7882 case AArch64::UABALB_ZZZ_S:
7883 case AArch64::UABALT_ZZZ_D:
7884 case AArch64::UABALT_ZZZ_H:
7885 case AArch64::UABALT_ZZZ_S:
7886 case AArch64::SABALB_ZZZ_D:
7887 case AArch64::SABALB_ZZZ_S:
7888 case AArch64::SABALB_ZZZ_H:
7889 case AArch64::SABALT_ZZZ_D:
7890 case AArch64::SABALT_ZZZ_S:
7891 case AArch64::SABALT_ZZZ_H:
7892 case AArch64::UABALv16i8_v8i16:
7893 case AArch64::UABALv2i32_v2i64:
7894 case AArch64::UABALv4i16_v4i32:
7895 case AArch64::UABALv4i32_v2i64:
7896 case AArch64::UABALv8i16_v4i32:
7897 case AArch64::UABALv8i8_v8i16:
7898 case AArch64::UABAv16i8:
7899 case AArch64::UABAv2i32:
7900 case AArch64::UABAv4i16:
7901 case AArch64::UABAv4i32:
7902 case AArch64::UABAv8i16:
7903 case AArch64::UABAv8i8:
7904 case AArch64::SABALv16i8_v8i16:
7905 case AArch64::SABALv2i32_v2i64:
7906 case AArch64::SABALv4i16_v4i32:
7907 case AArch64::SABALv4i32_v2i64:
7908 case AArch64::SABALv8i16_v4i32:
7909 case AArch64::SABALv8i8_v8i16:
7910 case AArch64::SABAv16i8:
7911 case AArch64::SABAv2i32:
7912 case AArch64::SABAv4i16:
7913 case AArch64::SABAv4i32:
7914 case AArch64::SABAv8i16:
7915 case AArch64::SABAv8i8:
7922unsigned AArch64InstrInfo::getAccumulationStartOpcode(
7923 unsigned AccumulationOpcode)
const {
7924 switch (AccumulationOpcode) {
7927 case AArch64::UABALB_ZZZ_D:
7928 return AArch64::UABDLB_ZZZ_D;
7929 case AArch64::UABALB_ZZZ_H:
7930 return AArch64::UABDLB_ZZZ_H;
7931 case AArch64::UABALB_ZZZ_S:
7932 return AArch64::UABDLB_ZZZ_S;
7933 case AArch64::UABALT_ZZZ_D:
7934 return AArch64::UABDLT_ZZZ_D;
7935 case AArch64::UABALT_ZZZ_H:
7936 return AArch64::UABDLT_ZZZ_H;
7937 case AArch64::UABALT_ZZZ_S:
7938 return AArch64::UABDLT_ZZZ_S;
7939 case AArch64::UABALv16i8_v8i16:
7940 return AArch64::UABDLv16i8_v8i16;
7941 case AArch64::UABALv2i32_v2i64:
7942 return AArch64::UABDLv2i32_v2i64;
7943 case AArch64::UABALv4i16_v4i32:
7944 return AArch64::UABDLv4i16_v4i32;
7945 case AArch64::UABALv4i32_v2i64:
7946 return AArch64::UABDLv4i32_v2i64;
7947 case AArch64::UABALv8i16_v4i32:
7948 return AArch64::UABDLv8i16_v4i32;
7949 case AArch64::UABALv8i8_v8i16:
7950 return AArch64::UABDLv8i8_v8i16;
7951 case AArch64::UABAv16i8:
7952 return AArch64::UABDv16i8;
7953 case AArch64::UABAv2i32:
7954 return AArch64::UABDv2i32;
7955 case AArch64::UABAv4i16:
7956 return AArch64::UABDv4i16;
7957 case AArch64::UABAv4i32:
7958 return AArch64::UABDv4i32;
7959 case AArch64::UABAv8i16:
7960 return AArch64::UABDv8i16;
7961 case AArch64::UABAv8i8:
7962 return AArch64::UABDv8i8;
7963 case AArch64::SABALB_ZZZ_D:
7964 return AArch64::SABDLB_ZZZ_D;
7965 case AArch64::SABALB_ZZZ_S:
7966 return AArch64::SABDLB_ZZZ_S;
7967 case AArch64::SABALB_ZZZ_H:
7968 return AArch64::SABDLB_ZZZ_H;
7969 case AArch64::SABALT_ZZZ_D:
7970 return AArch64::SABDLT_ZZZ_D;
7971 case AArch64::SABALT_ZZZ_S:
7972 return AArch64::SABDLT_ZZZ_S;
7973 case AArch64::SABALT_ZZZ_H:
7974 return AArch64::SABDLT_ZZZ_H;
7975 case AArch64::SABALv16i8_v8i16:
7976 return AArch64::SABDLv16i8_v8i16;
7977 case AArch64::SABALv2i32_v2i64:
7978 return AArch64::SABDLv2i32_v2i64;
7979 case AArch64::SABALv4i16_v4i32:
7980 return AArch64::SABDLv4i16_v4i32;
7981 case AArch64::SABALv4i32_v2i64:
7982 return AArch64::SABDLv4i32_v2i64;
7983 case AArch64::SABALv8i16_v4i32:
7984 return AArch64::SABDLv8i16_v4i32;
7985 case AArch64::SABALv8i8_v8i16:
7986 return AArch64::SABDLv8i8_v8i16;
7987 case AArch64::SABAv16i8:
7988 return AArch64::SABDv16i8;
7989 case AArch64::SABAv2i32:
7990 return AArch64::SABAv2i32;
7991 case AArch64::SABAv4i16:
7992 return AArch64::SABDv4i16;
7993 case AArch64::SABAv4i32:
7994 return AArch64::SABDv4i32;
7995 case AArch64::SABAv8i16:
7996 return AArch64::SABDv8i16;
7997 case AArch64::SABAv8i8:
7998 return AArch64::SABDv8i8;
8014 auto Match = [&](
int Opcode,
int Operand,
unsigned Pattern) ->
bool {
8026 assert(
false &&
"Unsupported FP instruction in combiner\n");
8028 case AArch64::FADDHrr:
8030 "FADDHrr does not have register operands");
8032 Found = Match(AArch64::FMULHrr, 1, MCP::FMULADDH_OP1);
8033 Found |= Match(AArch64::FMULHrr, 2, MCP::FMULADDH_OP2);
8035 case AArch64::FADDSrr:
8037 "FADDSrr does not have register operands");
8039 Found |= Match(AArch64::FMULSrr, 1, MCP::FMULADDS_OP1) ||
8040 Match(AArch64::FMULv1i32_indexed, 1, MCP::FMLAv1i32_indexed_OP1);
8042 Found |= Match(AArch64::FMULSrr, 2, MCP::FMULADDS_OP2) ||
8043 Match(AArch64::FMULv1i32_indexed, 2, MCP::FMLAv1i32_indexed_OP2);
8045 case AArch64::FADDDrr:
8046 Found |= Match(AArch64::FMULDrr, 1, MCP::FMULADDD_OP1) ||
8047 Match(AArch64::FMULv1i64_indexed, 1, MCP::FMLAv1i64_indexed_OP1);
8049 Found |= Match(AArch64::FMULDrr, 2, MCP::FMULADDD_OP2) ||
8050 Match(AArch64::FMULv1i64_indexed, 2, MCP::FMLAv1i64_indexed_OP2);
8052 case AArch64::FADDv4f16:
8053 Found |= Match(AArch64::FMULv4i16_indexed, 1, MCP::FMLAv4i16_indexed_OP1) ||
8054 Match(AArch64::FMULv4f16, 1, MCP::FMLAv4f16_OP1);
8056 Found |= Match(AArch64::FMULv4i16_indexed, 2, MCP::FMLAv4i16_indexed_OP2) ||
8057 Match(AArch64::FMULv4f16, 2, MCP::FMLAv4f16_OP2);
8059 case AArch64::FADDv8f16:
8060 Found |= Match(AArch64::FMULv8i16_indexed, 1, MCP::FMLAv8i16_indexed_OP1) ||
8061 Match(AArch64::FMULv8f16, 1, MCP::FMLAv8f16_OP1);
8063 Found |= Match(AArch64::FMULv8i16_indexed, 2, MCP::FMLAv8i16_indexed_OP2) ||
8064 Match(AArch64::FMULv8f16, 2, MCP::FMLAv8f16_OP2);
8066 case AArch64::FADDv2f32:
8067 Found |= Match(AArch64::FMULv2i32_indexed, 1, MCP::FMLAv2i32_indexed_OP1) ||
8068 Match(AArch64::FMULv2f32, 1, MCP::FMLAv2f32_OP1);
8070 Found |= Match(AArch64::FMULv2i32_indexed, 2, MCP::FMLAv2i32_indexed_OP2) ||
8071 Match(AArch64::FMULv2f32, 2, MCP::FMLAv2f32_OP2);
8073 case AArch64::FADDv2f64:
8074 Found |= Match(AArch64::FMULv2i64_indexed, 1, MCP::FMLAv2i64_indexed_OP1) ||
8075 Match(AArch64::FMULv2f64, 1, MCP::FMLAv2f64_OP1);
8077 Found |= Match(AArch64::FMULv2i64_indexed, 2, MCP::FMLAv2i64_indexed_OP2) ||
8078 Match(AArch64::FMULv2f64, 2, MCP::FMLAv2f64_OP2);
8080 case AArch64::FADDv4f32:
8081 Found |= Match(AArch64::FMULv4i32_indexed, 1, MCP::FMLAv4i32_indexed_OP1) ||
8082 Match(AArch64::FMULv4f32, 1, MCP::FMLAv4f32_OP1);
8084 Found |= Match(AArch64::FMULv4i32_indexed, 2, MCP::FMLAv4i32_indexed_OP2) ||
8085 Match(AArch64::FMULv4f32, 2, MCP::FMLAv4f32_OP2);
8087 case AArch64::FSUBHrr:
8088 Found = Match(AArch64::FMULHrr, 1, MCP::FMULSUBH_OP1);
8089 Found |= Match(AArch64::FMULHrr, 2, MCP::FMULSUBH_OP2);
8090 Found |= Match(AArch64::FNMULHrr, 1, MCP::FNMULSUBH_OP1);
8092 case AArch64::FSUBSrr:
8093 Found = Match(AArch64::FMULSrr, 1, MCP::FMULSUBS_OP1);
8095 Found |= Match(AArch64::FMULSrr, 2, MCP::FMULSUBS_OP2) ||
8096 Match(AArch64::FMULv1i32_indexed, 2, MCP::FMLSv1i32_indexed_OP2);
8098 Found |= Match(AArch64::FNMULSrr, 1, MCP::FNMULSUBS_OP1);
8100 case AArch64::FSUBDrr:
8101 Found = Match(AArch64::FMULDrr, 1, MCP::FMULSUBD_OP1);
8103 Found |= Match(AArch64::FMULDrr, 2, MCP::FMULSUBD_OP2) ||
8104 Match(AArch64::FMULv1i64_indexed, 2, MCP::FMLSv1i64_indexed_OP2);
8106 Found |= Match(AArch64::FNMULDrr, 1, MCP::FNMULSUBD_OP1);
8108 case AArch64::FSUBv4f16:
8109 Found |= Match(AArch64::FMULv4i16_indexed, 2, MCP::FMLSv4i16_indexed_OP2) ||
8110 Match(AArch64::FMULv4f16, 2, MCP::FMLSv4f16_OP2);
8112 Found |= Match(AArch64::FMULv4i16_indexed, 1, MCP::FMLSv4i16_indexed_OP1) ||
8113 Match(AArch64::FMULv4f16, 1, MCP::FMLSv4f16_OP1);
8115 case AArch64::FSUBv8f16:
8116 Found |= Match(AArch64::FMULv8i16_indexed, 2, MCP::FMLSv8i16_indexed_OP2) ||
8117 Match(AArch64::FMULv8f16, 2, MCP::FMLSv8f16_OP2);
8119 Found |= Match(AArch64::FMULv8i16_indexed, 1, MCP::FMLSv8i16_indexed_OP1) ||
8120 Match(AArch64::FMULv8f16, 1, MCP::FMLSv8f16_OP1);
8122 case AArch64::FSUBv2f32:
8123 Found |= Match(AArch64::FMULv2i32_indexed, 2, MCP::FMLSv2i32_indexed_OP2) ||
8124 Match(AArch64::FMULv2f32, 2, MCP::FMLSv2f32_OP2);
8126 Found |= Match(AArch64::FMULv2i32_indexed, 1, MCP::FMLSv2i32_indexed_OP1) ||
8127 Match(AArch64::FMULv2f32, 1, MCP::FMLSv2f32_OP1);
8129 case AArch64::FSUBv2f64:
8130 Found |= Match(AArch64::FMULv2i64_indexed, 2, MCP::FMLSv2i64_indexed_OP2) ||
8131 Match(AArch64::FMULv2f64, 2, MCP::FMLSv2f64_OP2);
8133 Found |= Match(AArch64::FMULv2i64_indexed, 1, MCP::FMLSv2i64_indexed_OP1) ||
8134 Match(AArch64::FMULv2f64, 1, MCP::FMLSv2f64_OP1);
8136 case AArch64::FSUBv4f32:
8137 Found |= Match(AArch64::FMULv4i32_indexed, 2, MCP::FMLSv4i32_indexed_OP2) ||
8138 Match(AArch64::FMULv4f32, 2, MCP::FMLSv4f32_OP2);
8140 Found |= Match(AArch64::FMULv4i32_indexed, 1, MCP::FMLSv4i32_indexed_OP1) ||
8141 Match(AArch64::FMULv4f32, 1, MCP::FMLSv4f32_OP1);
8152 auto Match = [&](
unsigned Opcode,
int Operand,
unsigned Pattern) ->
bool {
8159 if (
MI &&
MI->getOpcode() == TargetOpcode::COPY &&
8160 MI->getOperand(1).getReg().isVirtual())
8162 if (
MI &&
MI->getOpcode() == Opcode) {
8174 case AArch64::FMULv2f32:
8175 Found = Match(AArch64::DUPv2i32lane, 1, MCP::FMULv2i32_indexed_OP1);
8176 Found |= Match(AArch64::DUPv2i32lane, 2, MCP::FMULv2i32_indexed_OP2);
8178 case AArch64::FMULv2f64:
8179 Found = Match(AArch64::DUPv2i64lane, 1, MCP::FMULv2i64_indexed_OP1);
8180 Found |= Match(AArch64::DUPv2i64lane, 2, MCP::FMULv2i64_indexed_OP2);
8182 case AArch64::FMULv4f16:
8183 Found = Match(AArch64::DUPv4i16lane, 1, MCP::FMULv4i16_indexed_OP1);
8184 Found |= Match(AArch64::DUPv4i16lane, 2, MCP::FMULv4i16_indexed_OP2);
8186 case AArch64::FMULv4f32:
8187 Found = Match(AArch64::DUPv4i32lane, 1, MCP::FMULv4i32_indexed_OP1);
8188 Found |= Match(AArch64::DUPv4i32lane, 2, MCP::FMULv4i32_indexed_OP2);
8190 case AArch64::FMULv8f16:
8191 Found = Match(AArch64::DUPv8i16lane, 1, MCP::FMULv8i16_indexed_OP1);
8192 Found |= Match(AArch64::DUPv8i16lane, 2, MCP::FMULv8i16_indexed_OP2);
8205 auto Match = [&](
unsigned Opcode,
unsigned Pattern) ->
bool {
8208 if (
MI !=
nullptr && (
MI->getOpcode() == Opcode) &&
8223 case AArch64::FNEGDr:
8225 case AArch64::FNEGSr:
8357 case AArch64::SUBWrr:
8358 case AArch64::SUBSWrr:
8359 case AArch64::SUBXrr:
8360 case AArch64::SUBSXrr:
8405 unsigned LoadLaneOpCode,
unsigned NumLanes) {
8428 while (!RemainingLanes.
empty() && CurrInstr &&
8429 CurrInstr->getOpcode() == LoadLaneOpCode &&
8431 CurrInstr->getNumOperands() == 4) {
8432 RemainingLanes.
erase(CurrInstr->getOperand(2).getImm());
8438 if (!RemainingLanes.
empty())
8442 if (CurrInstr->getOpcode() != TargetOpcode::SUBREG_TO_REG)
8446 auto Lane0LoadReg = CurrInstr->getOperand(1).getReg();
8447 unsigned SingleLaneSizeInBits = 128 / NumLanes;
8448 if (
TRI->getRegSizeInBits(Lane0LoadReg, MRI) != SingleLaneSizeInBits)
8464 RemainingLoadInstrs.
insert(LoadInstrs.
begin(), LoadInstrs.
end());
8467 for (; MBBItr !=
MBB->begin() && RemainingSteps > 0 &&
8468 !RemainingLoadInstrs.
empty();
8469 --MBBItr, --RemainingSteps) {
8473 RemainingLoadInstrs.
erase(&CurrInstr);
8483 if (RemainingSteps == 0 && !RemainingLoadInstrs.
empty())
8509 case AArch64::LD1i32:
8511 case AArch64::LD1i16:
8513 case AArch64::LD1i8:
8529 unsigned Pattern,
unsigned NumLanes) {
8537 for (
unsigned i = 0; i < NumLanes - 1; ++i) {
8545 return A->getOperand(2).getImm() >
B->getOperand(2).getImm();
8551 auto LoadToLaneInstrsAscending =
llvm::reverse(LoadToLaneInstrs);
8557 auto CreateLD1Instruction = [&](
MachineInstr *OriginalInstr,
8558 Register SrcRegister,
unsigned Lane,
8560 bool OffsetRegisterKillState) {
8569 InstrIdxForVirtReg.
insert(std::make_pair(NewRegister, InsInstrs.
size()));
8570 InsInstrs.
push_back(LoadIndexIntoRegister);
8576 auto CreateLDRInstruction =
8582 Opcode = AArch64::LDRSui;
8585 Opcode = AArch64::LDRHui;
8588 Opcode = AArch64::LDRBui;
8592 "Got unsupported number of lanes in machine-combiner gather pattern");
8602 auto LanesToLoadToReg0 =
8604 LoadToLaneInstrsAscending.begin() + NumLanes / 2);
8605 Register PrevReg = SubregToReg->getOperand(0).getReg();
8607 const MachineOperand &OffsetRegOperand = LoadInstr->getOperand(3);
8608 PrevReg = CreateLD1Instruction(LoadInstr, PrevReg, Index + 1,
8609 OffsetRegOperand.
getReg(),
8610 OffsetRegOperand.
isKill());
8617 MachineInstr *Lane0Load = *LoadToLaneInstrsAscending.begin();
8619 *std::next(LoadToLaneInstrsAscending.begin(), NumLanes / 2);
8626 CreateLDRInstruction(NumLanes, DestRegForMiddleIndex,
8627 OriginalSplitToLoadOffsetOperand.
getReg(),
8630 InstrIdxForVirtReg.
insert(
8631 std::make_pair(DestRegForMiddleIndex, InsInstrs.
size()));
8632 InsInstrs.
push_back(MiddleIndexLoadInstr);
8637 unsigned SubregType;
8640 SubregType = AArch64::ssub;
8643 SubregType = AArch64::hsub;
8646 SubregType = AArch64::bsub;
8650 "Got invalid NumLanes for machine-combiner gather pattern");
8653 auto SubRegToRegInstr =
8655 DestRegForSubregToReg)
8658 InstrIdxForVirtReg.
insert(
8659 std::make_pair(DestRegForSubregToReg, InsInstrs.
size()));
8663 auto LanesToLoadToReg1 =
8665 LoadToLaneInstrsAscending.end());
8666 PrevReg = SubRegToRegInstr->getOperand(0).getReg();
8668 const MachineOperand &OffsetRegOperand = LoadInstr->getOperand(3);
8669 PrevReg = CreateLD1Instruction(LoadInstr, PrevReg, Index + 1,
8670 OffsetRegOperand.
getReg(),
8671 OffsetRegOperand.
isKill());
8674 if (Index == NumLanes / 2 - 2) {
8709bool AArch64InstrInfo::getMachineCombinerPatterns(
8711 bool DoRegPressureReduce)
const {
8732 DoRegPressureReduce);
8761 const Register *ReplacedAddend =
nullptr) {
8762 assert(IdxMulOpd == 1 || IdxMulOpd == 2);
8764 unsigned IdxOtherOpd = IdxMulOpd == 1 ? 2 : 1;
8767 Register SrcReg0 = MUL->getOperand(1).getReg();
8768 bool Src0IsKill = MUL->getOperand(1).isKill();
8769 Register SrcReg1 = MUL->getOperand(2).getReg();
8770 bool Src1IsKill = MUL->getOperand(2).isKill();
8774 if (ReplacedAddend) {
8776 SrcReg2 = *ReplacedAddend;
8803 .
addImm(MUL->getOperand(3).getImm());
8810 assert(
false &&
"Invalid FMA instruction kind \n");
8824 if (AArch64::FPR32RegClass.hasSubClassEq(RC))
8825 Opc = AArch64::FNMADDSrrr;
8826 else if (AArch64::FPR64RegClass.hasSubClassEq(RC))
8827 Opc = AArch64::FNMADDDrrr;
8861 unsigned IdxDupOp,
unsigned MulOpc,
8863 assert(((IdxDupOp == 1) || (IdxDupOp == 2)) &&
8864 "Invalid index of FMUL operand");
8872 if (Dup->
getOpcode() == TargetOpcode::COPY)
8881 unsigned IdxMulOp = IdxDupOp == 1 ? 2 : 1;
8922 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
8937 genNeg(MF, MRI,
TII, Root, InsInstrs, InstrIdxForVirtReg, MnegOpc, RC);
8964 genNeg(MF, MRI,
TII, Root, InsInstrs, InstrIdxForVirtReg, MnegOpc, RC);
8992 unsigned IdxMulOpd,
unsigned MaddOpc,
unsigned VR,
8994 assert(IdxMulOpd == 1 || IdxMulOpd == 2);
8998 Register SrcReg0 = MUL->getOperand(1).getReg();
8999 bool Src0IsKill = MUL->getOperand(1).isKill();
9000 Register SrcReg1 = MUL->getOperand(2).getReg();
9001 bool Src1IsKill = MUL->getOperand(2).isKill();
9031 assert(IdxOpd1 == 1 || IdxOpd1 == 2);
9032 unsigned IdxOtherOpd = IdxOpd1 == 1 ? 2 : 1;
9046 if (Opcode == AArch64::SUBSWrr)
9047 Opcode = AArch64::SUBWrr;
9048 else if (Opcode == AArch64::SUBSXrr)
9049 Opcode = AArch64::SUBXrr;
9051 assert((Opcode == AArch64::SUBWrr || Opcode == AArch64::SUBXrr) &&
9052 "Unexpected instruction opcode.");
9069 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9076unsigned AArch64InstrInfo::getReduceOpcodeForAccumulator(
9077 unsigned int AccumulatorOpCode)
const {
9078 switch (AccumulatorOpCode) {
9079 case AArch64::UABALB_ZZZ_D:
9080 case AArch64::SABALB_ZZZ_D:
9081 case AArch64::UABALT_ZZZ_D:
9082 case AArch64::SABALT_ZZZ_D:
9083 return AArch64::ADD_ZZZ_D;
9084 case AArch64::UABALB_ZZZ_H:
9085 case AArch64::SABALB_ZZZ_H:
9086 case AArch64::UABALT_ZZZ_H:
9087 case AArch64::SABALT_ZZZ_H:
9088 return AArch64::ADD_ZZZ_H;
9089 case AArch64::UABALB_ZZZ_S:
9090 case AArch64::SABALB_ZZZ_S:
9091 case AArch64::UABALT_ZZZ_S:
9092 case AArch64::SABALT_ZZZ_S:
9093 return AArch64::ADD_ZZZ_S;
9094 case AArch64::UABALv16i8_v8i16:
9095 case AArch64::SABALv8i8_v8i16:
9096 case AArch64::SABAv8i16:
9097 case AArch64::UABAv8i16:
9098 return AArch64::ADDv8i16;
9099 case AArch64::SABALv2i32_v2i64:
9100 case AArch64::UABALv2i32_v2i64:
9101 case AArch64::SABALv4i32_v2i64:
9102 return AArch64::ADDv2i64;
9103 case AArch64::UABALv4i16_v4i32:
9104 case AArch64::SABALv4i16_v4i32:
9105 case AArch64::SABALv8i16_v4i32:
9106 case AArch64::SABAv4i32:
9107 case AArch64::UABAv4i32:
9108 return AArch64::ADDv4i32;
9109 case AArch64::UABALv4i32_v2i64:
9110 return AArch64::ADDv2i64;
9111 case AArch64::UABALv8i16_v4i32:
9112 return AArch64::ADDv4i32;
9113 case AArch64::UABALv8i8_v8i16:
9114 case AArch64::SABALv16i8_v8i16:
9115 return AArch64::ADDv8i16;
9116 case AArch64::UABAv16i8:
9117 case AArch64::SABAv16i8:
9118 return AArch64::ADDv16i8;
9119 case AArch64::UABAv4i16:
9120 case AArch64::SABAv4i16:
9121 return AArch64::ADDv4i16;
9122 case AArch64::UABAv2i32:
9123 case AArch64::SABAv2i32:
9124 return AArch64::ADDv2i32;
9125 case AArch64::UABAv8i8:
9126 case AArch64::SABAv8i8:
9127 return AArch64::ADDv8i8;
9136void AArch64InstrInfo::genAlternativeCodeSequence(
9146 MachineInstr *
MUL =
nullptr;
9153 DelInstrs, InstrIdxForVirtReg);
9159 InstrIdxForVirtReg);
9165 InstrIdxForVirtReg);
9174 Opc = AArch64::MADDWrrr;
9175 RC = &AArch64::GPR32RegClass;
9177 Opc = AArch64::MADDXrrr;
9178 RC = &AArch64::GPR64RegClass;
9189 Opc = AArch64::MADDWrrr;
9190 RC = &AArch64::GPR32RegClass;
9192 Opc = AArch64::MADDXrrr;
9193 RC = &AArch64::GPR64RegClass;
9207 unsigned BitSize, MovImm;
9210 MovImm = AArch64::MOVi32imm;
9211 RC = &AArch64::GPR32spRegClass;
9213 Opc = AArch64::MADDWrrr;
9214 RC = &AArch64::GPR32RegClass;
9216 MovImm = AArch64::MOVi64imm;
9217 RC = &AArch64::GPR64spRegClass;
9219 Opc = AArch64::MADDXrrr;
9220 RC = &AArch64::GPR64RegClass;
9235 if (Insn.
size() != 1)
9237 MachineInstrBuilder MIB1 =
9238 BuildMI(MF, MIMetadata(Root),
TII->get(MovImm), NewVR)
9241 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9253 unsigned SubOpc, ZeroReg;
9255 SubOpc = AArch64::SUBWrr;
9256 SubRC = &AArch64::GPR32spRegClass;
9257 ZeroReg = AArch64::WZR;
9258 Opc = AArch64::MADDWrrr;
9259 RC = &AArch64::GPR32RegClass;
9261 SubOpc = AArch64::SUBXrr;
9262 SubRC = &AArch64::GPR64spRegClass;
9263 ZeroReg = AArch64::XZR;
9264 Opc = AArch64::MADDXrrr;
9265 RC = &AArch64::GPR64RegClass;
9269 MachineInstrBuilder MIB1 =
9270 BuildMI(MF, MIMetadata(Root),
TII->get(SubOpc), NewVR)
9274 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9285 Opc = AArch64::MSUBWrrr;
9286 RC = &AArch64::GPR32RegClass;
9288 Opc = AArch64::MSUBXrrr;
9289 RC = &AArch64::GPR64RegClass;
9294 Opc = AArch64::MLAv8i8;
9295 RC = &AArch64::FPR64RegClass;
9299 Opc = AArch64::MLAv8i8;
9300 RC = &AArch64::FPR64RegClass;
9304 Opc = AArch64::MLAv16i8;
9305 RC = &AArch64::FPR128RegClass;
9309 Opc = AArch64::MLAv16i8;
9310 RC = &AArch64::FPR128RegClass;
9314 Opc = AArch64::MLAv4i16;
9315 RC = &AArch64::FPR64RegClass;
9319 Opc = AArch64::MLAv4i16;
9320 RC = &AArch64::FPR64RegClass;
9324 Opc = AArch64::MLAv8i16;
9325 RC = &AArch64::FPR128RegClass;
9329 Opc = AArch64::MLAv8i16;
9330 RC = &AArch64::FPR128RegClass;
9334 Opc = AArch64::MLAv2i32;
9335 RC = &AArch64::FPR64RegClass;
9339 Opc = AArch64::MLAv2i32;
9340 RC = &AArch64::FPR64RegClass;
9344 Opc = AArch64::MLAv4i32;
9345 RC = &AArch64::FPR128RegClass;
9349 Opc = AArch64::MLAv4i32;
9350 RC = &AArch64::FPR128RegClass;
9355 Opc = AArch64::MLAv8i8;
9356 RC = &AArch64::FPR64RegClass;
9358 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv8i8,
9362 Opc = AArch64::MLSv8i8;
9363 RC = &AArch64::FPR64RegClass;
9367 Opc = AArch64::MLAv16i8;
9368 RC = &AArch64::FPR128RegClass;
9370 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv16i8,
9374 Opc = AArch64::MLSv16i8;
9375 RC = &AArch64::FPR128RegClass;
9379 Opc = AArch64::MLAv4i16;
9380 RC = &AArch64::FPR64RegClass;
9382 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i16,
9386 Opc = AArch64::MLSv4i16;
9387 RC = &AArch64::FPR64RegClass;
9391 Opc = AArch64::MLAv8i16;
9392 RC = &AArch64::FPR128RegClass;
9394 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv8i16,
9398 Opc = AArch64::MLSv8i16;
9399 RC = &AArch64::FPR128RegClass;
9403 Opc = AArch64::MLAv2i32;
9404 RC = &AArch64::FPR64RegClass;
9406 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv2i32,
9410 Opc = AArch64::MLSv2i32;
9411 RC = &AArch64::FPR64RegClass;
9415 Opc = AArch64::MLAv4i32;
9416 RC = &AArch64::FPR128RegClass;
9418 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i32,
9422 Opc = AArch64::MLSv4i32;
9423 RC = &AArch64::FPR128RegClass;
9428 Opc = AArch64::MLAv4i16_indexed;
9429 RC = &AArch64::FPR64RegClass;
9433 Opc = AArch64::MLAv4i16_indexed;
9434 RC = &AArch64::FPR64RegClass;
9438 Opc = AArch64::MLAv8i16_indexed;
9439 RC = &AArch64::FPR128RegClass;
9443 Opc = AArch64::MLAv8i16_indexed;
9444 RC = &AArch64::FPR128RegClass;
9448 Opc = AArch64::MLAv2i32_indexed;
9449 RC = &AArch64::FPR64RegClass;
9453 Opc = AArch64::MLAv2i32_indexed;
9454 RC = &AArch64::FPR64RegClass;
9458 Opc = AArch64::MLAv4i32_indexed;
9459 RC = &AArch64::FPR128RegClass;
9463 Opc = AArch64::MLAv4i32_indexed;
9464 RC = &AArch64::FPR128RegClass;
9469 Opc = AArch64::MLAv4i16_indexed;
9470 RC = &AArch64::FPR64RegClass;
9472 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i16,
9476 Opc = AArch64::MLSv4i16_indexed;
9477 RC = &AArch64::FPR64RegClass;
9481 Opc = AArch64::MLAv8i16_indexed;
9482 RC = &AArch64::FPR128RegClass;
9484 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv8i16,
9488 Opc = AArch64::MLSv8i16_indexed;
9489 RC = &AArch64::FPR128RegClass;
9493 Opc = AArch64::MLAv2i32_indexed;
9494 RC = &AArch64::FPR64RegClass;
9496 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv2i32,
9500 Opc = AArch64::MLSv2i32_indexed;
9501 RC = &AArch64::FPR64RegClass;
9505 Opc = AArch64::MLAv4i32_indexed;
9506 RC = &AArch64::FPR128RegClass;
9508 InstrIdxForVirtReg, 1,
Opc, AArch64::NEGv4i32,
9512 Opc = AArch64::MLSv4i32_indexed;
9513 RC = &AArch64::FPR128RegClass;
9519 Opc = AArch64::FMADDHrrr;
9520 RC = &AArch64::FPR16RegClass;
9524 Opc = AArch64::FMADDSrrr;
9525 RC = &AArch64::FPR32RegClass;
9529 Opc = AArch64::FMADDDrrr;
9530 RC = &AArch64::FPR64RegClass;
9535 Opc = AArch64::FMADDHrrr;
9536 RC = &AArch64::FPR16RegClass;
9540 Opc = AArch64::FMADDSrrr;
9541 RC = &AArch64::FPR32RegClass;
9545 Opc = AArch64::FMADDDrrr;
9546 RC = &AArch64::FPR64RegClass;
9551 Opc = AArch64::FMLAv1i32_indexed;
9552 RC = &AArch64::FPR32RegClass;
9557 Opc = AArch64::FMLAv1i32_indexed;
9558 RC = &AArch64::FPR32RegClass;
9564 Opc = AArch64::FMLAv1i64_indexed;
9565 RC = &AArch64::FPR64RegClass;
9570 Opc = AArch64::FMLAv1i64_indexed;
9571 RC = &AArch64::FPR64RegClass;
9577 RC = &AArch64::FPR64RegClass;
9578 Opc = AArch64::FMLAv4i16_indexed;
9583 RC = &AArch64::FPR64RegClass;
9584 Opc = AArch64::FMLAv4f16;
9589 RC = &AArch64::FPR64RegClass;
9590 Opc = AArch64::FMLAv4i16_indexed;
9595 RC = &AArch64::FPR64RegClass;
9596 Opc = AArch64::FMLAv4f16;
9603 RC = &AArch64::FPR64RegClass;
9605 Opc = AArch64::FMLAv2i32_indexed;
9609 Opc = AArch64::FMLAv2f32;
9616 RC = &AArch64::FPR64RegClass;
9618 Opc = AArch64::FMLAv2i32_indexed;
9622 Opc = AArch64::FMLAv2f32;
9629 RC = &AArch64::FPR128RegClass;
9630 Opc = AArch64::FMLAv8i16_indexed;
9635 RC = &AArch64::FPR128RegClass;
9636 Opc = AArch64::FMLAv8f16;
9641 RC = &AArch64::FPR128RegClass;
9642 Opc = AArch64::FMLAv8i16_indexed;
9647 RC = &AArch64::FPR128RegClass;
9648 Opc = AArch64::FMLAv8f16;
9655 RC = &AArch64::FPR128RegClass;
9657 Opc = AArch64::FMLAv2i64_indexed;
9661 Opc = AArch64::FMLAv2f64;
9668 RC = &AArch64::FPR128RegClass;
9670 Opc = AArch64::FMLAv2i64_indexed;
9674 Opc = AArch64::FMLAv2f64;
9682 RC = &AArch64::FPR128RegClass;
9684 Opc = AArch64::FMLAv4i32_indexed;
9688 Opc = AArch64::FMLAv4f32;
9696 RC = &AArch64::FPR128RegClass;
9698 Opc = AArch64::FMLAv4i32_indexed;
9702 Opc = AArch64::FMLAv4f32;
9709 Opc = AArch64::FNMSUBHrrr;
9710 RC = &AArch64::FPR16RegClass;
9714 Opc = AArch64::FNMSUBSrrr;
9715 RC = &AArch64::FPR32RegClass;
9719 Opc = AArch64::FNMSUBDrrr;
9720 RC = &AArch64::FPR64RegClass;
9725 Opc = AArch64::FNMADDHrrr;
9726 RC = &AArch64::FPR16RegClass;
9730 Opc = AArch64::FNMADDSrrr;
9731 RC = &AArch64::FPR32RegClass;
9735 Opc = AArch64::FNMADDDrrr;
9736 RC = &AArch64::FPR64RegClass;
9741 Opc = AArch64::FMSUBHrrr;
9742 RC = &AArch64::FPR16RegClass;
9746 Opc = AArch64::FMSUBSrrr;
9747 RC = &AArch64::FPR32RegClass;
9751 Opc = AArch64::FMSUBDrrr;
9752 RC = &AArch64::FPR64RegClass;
9757 Opc = AArch64::FMLSv1i32_indexed;
9758 RC = &AArch64::FPR32RegClass;
9764 Opc = AArch64::FMLSv1i64_indexed;
9765 RC = &AArch64::FPR64RegClass;
9772 RC = &AArch64::FPR64RegClass;
9774 MachineInstrBuilder MIB1 =
9775 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv4f16), NewVR)
9778 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9780 Opc = AArch64::FMLAv4f16;
9784 Opc = AArch64::FMLAv4i16_indexed;
9791 RC = &AArch64::FPR64RegClass;
9792 Opc = AArch64::FMLSv4f16;
9797 RC = &AArch64::FPR64RegClass;
9798 Opc = AArch64::FMLSv4i16_indexed;
9805 RC = &AArch64::FPR64RegClass;
9807 Opc = AArch64::FMLSv2i32_indexed;
9811 Opc = AArch64::FMLSv2f32;
9819 RC = &AArch64::FPR128RegClass;
9821 MachineInstrBuilder MIB1 =
9822 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv8f16), NewVR)
9825 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9827 Opc = AArch64::FMLAv8f16;
9831 Opc = AArch64::FMLAv8i16_indexed;
9838 RC = &AArch64::FPR128RegClass;
9839 Opc = AArch64::FMLSv8f16;
9844 RC = &AArch64::FPR128RegClass;
9845 Opc = AArch64::FMLSv8i16_indexed;
9852 RC = &AArch64::FPR128RegClass;
9854 Opc = AArch64::FMLSv2i64_indexed;
9858 Opc = AArch64::FMLSv2f64;
9866 RC = &AArch64::FPR128RegClass;
9868 Opc = AArch64::FMLSv4i32_indexed;
9872 Opc = AArch64::FMLSv4f32;
9879 RC = &AArch64::FPR64RegClass;
9881 MachineInstrBuilder MIB1 =
9882 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv2f32), NewVR)
9885 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9887 Opc = AArch64::FMLAv2i32_indexed;
9891 Opc = AArch64::FMLAv2f32;
9899 RC = &AArch64::FPR128RegClass;
9901 MachineInstrBuilder MIB1 =
9902 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv4f32), NewVR)
9905 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9907 Opc = AArch64::FMLAv4i32_indexed;
9911 Opc = AArch64::FMLAv4f32;
9919 RC = &AArch64::FPR128RegClass;
9921 MachineInstrBuilder MIB1 =
9922 BuildMI(MF, MIMetadata(Root),
TII->get(AArch64::FNEGv2f64), NewVR)
9925 InstrIdxForVirtReg.
insert(std::make_pair(NewVR, 0));
9927 Opc = AArch64::FMLAv2i64_indexed;
9931 Opc = AArch64::FMLAv2f64;
9943 &AArch64::FPR128RegClass, MRI);
9952 &AArch64::FPR128RegClass, MRI);
9961 &AArch64::FPR128_loRegClass, MRI);
9970 &AArch64::FPR128RegClass, MRI);