66#define DEBUG_TYPE "hexagon-instrinfo"
68#define GET_INSTRINFO_CTOR_DTOR
69#define GET_INSTRMAP_INFO
71#include "HexagonGenDFAPacketizer.inc"
72#include "HexagonGenInstrInfo.inc"
76 "packetization boundary."));
83 cl::desc(
"Disable schedule adjustment for new value stores."));
87 cl::desc(
"Enable timing class latency"));
91 cl::desc(
"Enable vec alu forwarding"));
95 cl::desc(
"Enable vec acc forwarding"));
103 cl::desc(
"Use the DFA based hazard recognizer."));
118void HexagonInstrInfo::anchor() {}
125namespace HexagonFUnits {
131 return (Reg >= Hexagon::R0 && Reg <= Hexagon::R7) ||
132 (Reg >= Hexagon::R16 && Reg <= Hexagon::R23);
144 for (; MIB != MIE; ++MIB) {
145 if (!MIB->isDebugInstr())
156 if (!(
MI.getMF()->getFunction().hasOptSize()))
157 return MI.isAsCheapAsAMove();
159 if (
MI.getOpcode() == Hexagon::A2_tfrsi) {
160 auto Op =
MI.getOperand(1);
168 int64_t Imm = Op.getImm();
173 return MI.isAsCheapAsAMove();
188 if (
isFloat(
MI) &&
MI.hasRegisterImplicitUseOperand(Hexagon::USR))
202 if (EndLoopOp == Hexagon::ENDLOOP0) {
203 LOOPi = Hexagon::J2_loop0i;
204 LOOPr = Hexagon::J2_loop0r;
206 LOOPi = Hexagon::J2_loop1i;
207 LOOPr = Hexagon::J2_loop1r;
218 unsigned Opc =
I.getOpcode();
219 if (Opc == LOOPi || Opc == LOOPr)
223 if (Opc == EndLoopOp &&
I.getOperand(0).getMBB() != TargetBB)
250 Uses.push_back(MO.getReg());
289 int &FrameIndex)
const {
290 switch (
MI.getOpcode()) {
293 case Hexagon::L2_loadri_io:
294 case Hexagon::L2_loadrd_io:
295 case Hexagon::V6_vL32b_ai:
296 case Hexagon::V6_vL32b_nt_ai:
297 case Hexagon::V6_vL32Ub_ai:
298 case Hexagon::LDriw_pred:
299 case Hexagon::LDriw_ctr:
300 case Hexagon::PS_vloadrq_ai:
301 case Hexagon::PS_vloadrw_ai:
302 case Hexagon::PS_vloadrw_nt_ai: {
310 return MI.getOperand(0).getReg();
313 case Hexagon::L2_ploadrit_io:
314 case Hexagon::L2_ploadrif_io:
315 case Hexagon::L2_ploadrdt_io:
316 case Hexagon::L2_ploadrdf_io: {
324 return MI.getOperand(0).getReg();
337 int &FrameIndex)
const {
338 switch (
MI.getOpcode()) {
341 case Hexagon::S2_storerb_io:
342 case Hexagon::S2_storerh_io:
343 case Hexagon::S2_storeri_io:
344 case Hexagon::S2_storerd_io:
345 case Hexagon::V6_vS32b_ai:
346 case Hexagon::V6_vS32Ub_ai:
347 case Hexagon::STriw_pred:
348 case Hexagon::STriw_ctr:
349 case Hexagon::PS_vstorerq_ai:
350 case Hexagon::PS_vstorerw_ai: {
358 return MI.getOperand(2).getReg();
361 case Hexagon::S2_pstorerbt_io:
362 case Hexagon::S2_pstorerbf_io:
363 case Hexagon::S2_pstorerht_io:
364 case Hexagon::S2_pstorerhf_io:
365 case Hexagon::S2_pstorerit_io:
366 case Hexagon::S2_pstorerif_io:
367 case Hexagon::S2_pstorerdt_io:
368 case Hexagon::S2_pstorerdf_io: {
376 return MI.getOperand(3).getReg();
392 for (++MII; MII !=
MBB->
instr_end() && MII->isInsideBundle(); ++MII)
410 for (++MII; MII !=
MBB->
instr_end() && MII->isInsideBundle(); ++MII)
438 bool AllowModify)
const {
470 while (
I->isDebugInstr()) {
476 bool JumpToBlock =
I->getOpcode() == Hexagon::J2_jump &&
477 I->getOperand(0).isMBB();
479 if (AllowModify && JumpToBlock &&
482 I->eraseFromParent();
488 if (!isUnpredicatedTerminator(*
I))
496 if (&*
I != LastInst && !
I->isBundle() && isUnpredicatedTerminator(*
I)) {
498 SecondLastInst = &*
I;
509 int SecLastOpcode = SecondLastInst ? SecondLastInst->
getOpcode() : 0;
512 if (LastOpcode == Hexagon::J2_jump && !LastInst->
getOperand(0).
isMBB())
514 if (SecLastOpcode == Hexagon::J2_jump &&
525 if (LastInst && !SecondLastInst) {
526 if (LastOpcode == Hexagon::J2_jump) {
536 if (LastOpcodeHasJMP_c) {
551 <<
" with one jump\n";);
558 if (SecLastOpcodeHasJMP_c && (LastOpcode == Hexagon::J2_jump)) {
569 if (SecLastOpcodeHasNVJump &&
571 (LastOpcode == Hexagon::J2_jump)) {
582 if (SecLastOpcode == Hexagon::J2_jump && LastOpcode == Hexagon::J2_jump) {
586 I->eraseFromParent();
591 if (
isEndLoopN(SecLastOpcode) && LastOpcode == Hexagon::J2_jump) {
599 <<
" with two jumps";);
605 int *BytesRemoved)
const {
606 assert(!BytesRemoved &&
"code size not handled");
613 if (
I->isDebugInstr())
618 if (Count && (
I->getOpcode() == Hexagon::J2_jump))
632 int *BytesAdded)
const {
633 unsigned BOpc = Hexagon::J2_jump;
634 unsigned BccOpc = Hexagon::J2_jumpt;
636 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
637 assert(!BytesAdded &&
"code size not handled");
642 if (!
Cond.empty() &&
Cond[0].isImm())
643 BccOpc =
Cond[0].getImm();
663 int EndLoopOp =
Cond[0].getImm();
670 assert(
Loop !=
nullptr &&
"Inserting an ENDLOOP without a LOOP");
671 Loop->getOperand(0).setMBB(
TBB);
675 assert((
Cond.size() == 3) &&
"Only supporting rr/ri version of nvjump");
692 assert((
Cond.size() == 2) &&
"Malformed cond vector");
700 "Cond. cannot be empty when multiple branchings are required");
702 "NV-jump cannot be inserted with another branch");
705 int EndLoopOp =
Cond[0].getImm();
712 assert(
Loop !=
nullptr &&
"Inserting an ENDLOOP without a LOOP");
713 Loop->getOperand(0).setMBB(
TBB);
742 TripCount =
Loop->getOpcode() == Hexagon::J2_loop0r
744 :
Loop->getOperand(1).getImm();
746 LoopCount =
Loop->getOperand(1).getReg();
749 bool shouldIgnoreForPipelining(
const MachineInstr *
MI)
const override {
751 return MI == EndLoop;
754 std::optional<bool> createTripCountGreaterCondition(
757 if (TripCount == -1) {
761 TII->get(Hexagon::C2_cmpgtui),
Done)
769 return TripCount > TC;
777 void adjustTripCount(
int TripCountAdjust)
override {
780 if (
Loop->getOpcode() == Hexagon::J2_loop0i ||
781 Loop->getOpcode() == Hexagon::J2_loop1i) {
782 int64_t TripCount =
Loop->getOperand(1).getImm() + TripCountAdjust;
783 assert(TripCount > 0 &&
"Can't create an empty or negative loop!");
784 Loop->getOperand(1).setImm(TripCount);
793 TII->get(Hexagon::A2_addi), NewLoopCount)
796 Loop->getOperand(1).setReg(NewLoopCount);
799 void disposed()
override {
Loop->eraseFromParent(); }
803std::unique_ptr<TargetInstrInfo::PipelinerLoopInfo>
811 LoopBB,
I->getOpcode(),
I->getOperand(0).getMBB(), VisitedBBs);
813 return std::make_unique<HexagonPipelinerLoopInfo>(LoopInst, &*
I);
819 unsigned NumCycles,
unsigned ExtraPredCycles,
833 return NumInstrs <= 4;
841 for (
auto I =
B.begin();
I !=
E; ++
I) {
851 for (
auto I =
B.rbegin();
I !=
E; ++
I)
862 if (Hexagon::IntRegsRegClass.
contains(SrcReg, DestReg)) {
864 .
addReg(SrcReg, KillFlag);
867 if (Hexagon::DoubleRegsRegClass.
contains(SrcReg, DestReg)) {
869 .
addReg(SrcReg, KillFlag);
872 if (Hexagon::PredRegsRegClass.
contains(SrcReg, DestReg)) {
878 if (Hexagon::CtrRegsRegClass.
contains(DestReg) &&
879 Hexagon::IntRegsRegClass.
contains(SrcReg)) {
881 .
addReg(SrcReg, KillFlag);
884 if (Hexagon::IntRegsRegClass.
contains(DestReg) &&
885 Hexagon::CtrRegsRegClass.
contains(SrcReg)) {
887 .
addReg(SrcReg, KillFlag);
890 if (Hexagon::ModRegsRegClass.
contains(DestReg) &&
891 Hexagon::IntRegsRegClass.
contains(SrcReg)) {
893 .
addReg(SrcReg, KillFlag);
896 if (Hexagon::PredRegsRegClass.
contains(SrcReg) &&
897 Hexagon::IntRegsRegClass.
contains(DestReg)) {
899 .
addReg(SrcReg, KillFlag);
902 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
903 Hexagon::PredRegsRegClass.
contains(DestReg)) {
905 .
addReg(SrcReg, KillFlag);
908 if (Hexagon::PredRegsRegClass.
contains(SrcReg) &&
909 Hexagon::IntRegsRegClass.
contains(DestReg)) {
911 .
addReg(SrcReg, KillFlag);
914 if (Hexagon::HvxVRRegClass.
contains(SrcReg, DestReg)) {
916 addReg(SrcReg, KillFlag);
919 if (Hexagon::HvxWRRegClass.
contains(SrcReg, DestReg)) {
922 Register SrcLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
923 Register SrcHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
927 .
addReg(SrcHi, KillFlag | UndefHi)
928 .
addReg(SrcLo, KillFlag | UndefLo);
931 if (Hexagon::HvxQRRegClass.
contains(SrcReg, DestReg)) {
934 .
addReg(SrcReg, KillFlag);
937 if (Hexagon::HvxQRRegClass.
contains(SrcReg) &&
938 Hexagon::HvxVRRegClass.
contains(DestReg)) {
942 if (Hexagon::HvxQRRegClass.
contains(DestReg) &&
943 Hexagon::HvxVRRegClass.
contains(SrcReg)) {
958 Register SrcReg,
bool isKill,
int FI,
971 if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
975 }
else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
979 }
else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
983 }
else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
987 }
else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
991 }
else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
995 }
else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
1018 if (Hexagon::IntRegsRegClass.hasSubClassEq(RC)) {
1021 }
else if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC)) {
1024 }
else if (Hexagon::PredRegsRegClass.hasSubClassEq(RC)) {
1027 }
else if (Hexagon::ModRegsRegClass.hasSubClassEq(RC)) {
1030 }
else if (Hexagon::HvxQRRegClass.hasSubClassEq(RC)) {
1033 }
else if (Hexagon::HvxVRRegClass.hasSubClassEq(RC)) {
1036 }
else if (Hexagon::HvxWRRegClass.hasSubClassEq(RC)) {
1057 unsigned Opc =
MI.getOpcode();
1059 auto RealCirc = [&](
unsigned Opc,
bool HasImm,
unsigned MxOp) {
1061 Register CSx = (Mx == Hexagon::M0 ? Hexagon::CS0 : Hexagon::CS1);
1063 .
add(
MI.getOperand((HasImm ? 5 : 4)));
1067 MIB.
add(
MI.getOperand(4));
1074 if (
MI.memoperands().empty())
1077 return MMO->getAlign() >= NeedAlign;
1082 case Hexagon::PS_call_instrprof_custom: {
1083 auto Op0 =
MI.getOperand(0);
1085 "First operand must be a global containing handler name.");
1089 StringRef NameStr = Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
1115 MIB.addExternalSymbol(cstr);
1119 case TargetOpcode::COPY: {
1130 case Hexagon::PS_aligna:
1133 .
addImm(-
MI.getOperand(1).getImm());
1136 case Hexagon::V6_vassignp: {
1139 Register SrcLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1140 Register SrcHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1147 .
addReg(SrcLo, Kill | UndefLo);
1151 case Hexagon::V6_lo: {
1154 Register SrcSubLo = HRI.getSubReg(SrcReg, Hexagon::vsub_lo);
1157 MRI.clearKillFlags(SrcSubLo);
1160 case Hexagon::V6_hi: {
1163 Register SrcSubHi = HRI.getSubReg(SrcReg, Hexagon::vsub_hi);
1166 MRI.clearKillFlags(SrcSubHi);
1169 case Hexagon::PS_vloadrv_ai: {
1173 int Offset =
MI.getOperand(2).getImm();
1174 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1175 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vL32b_ai
1176 : Hexagon::V6_vL32Ub_ai;
1184 case Hexagon::PS_vloadrw_ai: {
1188 int Offset =
MI.getOperand(2).getImm();
1189 unsigned VecOffset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1190 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1191 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vL32b_ai
1192 : Hexagon::V6_vL32Ub_ai;
1194 HRI.getSubReg(DstReg, Hexagon::vsub_lo))
1199 HRI.getSubReg(DstReg, Hexagon::vsub_hi))
1206 case Hexagon::PS_vstorerv_ai: {
1211 int Offset =
MI.getOperand(1).getImm();
1212 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1213 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vS32b_ai
1214 : Hexagon::V6_vS32Ub_ai;
1223 case Hexagon::PS_vstorerw_ai: {
1227 int Offset =
MI.getOperand(1).getImm();
1228 unsigned VecOffset = HRI.getSpillSize(Hexagon::HvxVRRegClass);
1229 Align NeedAlign = HRI.getSpillAlign(Hexagon::HvxVRRegClass);
1230 unsigned NewOpc = UseAligned(
MI, NeedAlign) ? Hexagon::V6_vS32b_ai
1231 : Hexagon::V6_vS32Ub_ai;
1235 .
addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_lo))
1240 .
addReg(HRI.getSubReg(SrcReg, Hexagon::vsub_hi))
1245 case Hexagon::PS_true: {
1253 case Hexagon::PS_false: {
1261 case Hexagon::PS_qtrue: {
1268 case Hexagon::PS_qfalse: {
1275 case Hexagon::PS_vdd0: {
1283 case Hexagon::PS_vmulw: {
1286 Register Src1Reg =
MI.getOperand(1).getReg();
1287 Register Src2Reg =
MI.getOperand(2).getReg();
1288 Register Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1289 Register Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1290 Register Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1291 Register Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1293 HRI.getSubReg(DstReg, Hexagon::isub_hi))
1297 HRI.getSubReg(DstReg, Hexagon::isub_lo))
1301 MRI.clearKillFlags(Src1SubHi);
1302 MRI.clearKillFlags(Src1SubLo);
1303 MRI.clearKillFlags(Src2SubHi);
1304 MRI.clearKillFlags(Src2SubLo);
1307 case Hexagon::PS_vmulw_acc: {
1310 Register Src1Reg =
MI.getOperand(1).getReg();
1311 Register Src2Reg =
MI.getOperand(2).getReg();
1312 Register Src3Reg =
MI.getOperand(3).getReg();
1313 Register Src1SubHi = HRI.getSubReg(Src1Reg, Hexagon::isub_hi);
1314 Register Src1SubLo = HRI.getSubReg(Src1Reg, Hexagon::isub_lo);
1315 Register Src2SubHi = HRI.getSubReg(Src2Reg, Hexagon::isub_hi);
1316 Register Src2SubLo = HRI.getSubReg(Src2Reg, Hexagon::isub_lo);
1317 Register Src3SubHi = HRI.getSubReg(Src3Reg, Hexagon::isub_hi);
1318 Register Src3SubLo = HRI.getSubReg(Src3Reg, Hexagon::isub_lo);
1320 HRI.getSubReg(DstReg, Hexagon::isub_hi))
1325 HRI.getSubReg(DstReg, Hexagon::isub_lo))
1330 MRI.clearKillFlags(Src1SubHi);
1331 MRI.clearKillFlags(Src1SubLo);
1332 MRI.clearKillFlags(Src2SubHi);
1333 MRI.clearKillFlags(Src2SubLo);
1334 MRI.clearKillFlags(Src3SubHi);
1335 MRI.clearKillFlags(Src3SubLo);
1338 case Hexagon::PS_pselect: {
1353 .
addReg(Pu, (Rd == Rt) ? K1 : 0)
1362 case Hexagon::PS_vselect: {
1374 unsigned S = Op0.
getReg() != Op3.
getReg() ? PState & ~RegState::Kill
1395 case Hexagon::PS_wselect: {
1407 unsigned S = Op0.
getReg() != Op3.
getReg() ? PState & ~RegState::Kill
1435 case Hexagon::PS_crash: {
1452 OS <<
"MisalignedCrash";
1456 static const CrashPseudoSourceValue CrashPSV(MF.
getTarget());
1468 case Hexagon::PS_tailcall_i:
1469 MI.setDesc(
get(Hexagon::J2_jump));
1471 case Hexagon::PS_tailcall_r:
1472 case Hexagon::PS_jmpret:
1473 MI.setDesc(
get(Hexagon::J2_jumpr));
1475 case Hexagon::PS_jmprett:
1476 MI.setDesc(
get(Hexagon::J2_jumprt));
1478 case Hexagon::PS_jmpretf:
1479 MI.setDesc(
get(Hexagon::J2_jumprf));
1481 case Hexagon::PS_jmprettnewpt:
1482 MI.setDesc(
get(Hexagon::J2_jumprtnewpt));
1484 case Hexagon::PS_jmpretfnewpt:
1485 MI.setDesc(
get(Hexagon::J2_jumprfnewpt));
1487 case Hexagon::PS_jmprettnew:
1488 MI.setDesc(
get(Hexagon::J2_jumprtnew));
1490 case Hexagon::PS_jmpretfnew:
1491 MI.setDesc(
get(Hexagon::J2_jumprfnew));
1494 case Hexagon::PS_loadrub_pci:
1495 return RealCirc(Hexagon::L2_loadrub_pci,
true, 4);
1496 case Hexagon::PS_loadrb_pci:
1497 return RealCirc(Hexagon::L2_loadrb_pci,
true, 4);
1498 case Hexagon::PS_loadruh_pci:
1499 return RealCirc(Hexagon::L2_loadruh_pci,
true, 4);
1500 case Hexagon::PS_loadrh_pci:
1501 return RealCirc(Hexagon::L2_loadrh_pci,
true, 4);
1502 case Hexagon::PS_loadri_pci:
1503 return RealCirc(Hexagon::L2_loadri_pci,
true, 4);
1504 case Hexagon::PS_loadrd_pci:
1505 return RealCirc(Hexagon::L2_loadrd_pci,
true, 4);
1506 case Hexagon::PS_loadrub_pcr:
1507 return RealCirc(Hexagon::L2_loadrub_pcr,
false, 3);
1508 case Hexagon::PS_loadrb_pcr:
1509 return RealCirc(Hexagon::L2_loadrb_pcr,
false, 3);
1510 case Hexagon::PS_loadruh_pcr:
1511 return RealCirc(Hexagon::L2_loadruh_pcr,
false, 3);
1512 case Hexagon::PS_loadrh_pcr:
1513 return RealCirc(Hexagon::L2_loadrh_pcr,
false, 3);
1514 case Hexagon::PS_loadri_pcr:
1515 return RealCirc(Hexagon::L2_loadri_pcr,
false, 3);
1516 case Hexagon::PS_loadrd_pcr:
1517 return RealCirc(Hexagon::L2_loadrd_pcr,
false, 3);
1518 case Hexagon::PS_storerb_pci:
1519 return RealCirc(Hexagon::S2_storerb_pci,
true, 3);
1520 case Hexagon::PS_storerh_pci:
1521 return RealCirc(Hexagon::S2_storerh_pci,
true, 3);
1522 case Hexagon::PS_storerf_pci:
1523 return RealCirc(Hexagon::S2_storerf_pci,
true, 3);
1524 case Hexagon::PS_storeri_pci:
1525 return RealCirc(Hexagon::S2_storeri_pci,
true, 3);
1526 case Hexagon::PS_storerd_pci:
1527 return RealCirc(Hexagon::S2_storerd_pci,
true, 3);
1528 case Hexagon::PS_storerb_pcr:
1529 return RealCirc(Hexagon::S2_storerb_pcr,
false, 2);
1530 case Hexagon::PS_storerh_pcr:
1531 return RealCirc(Hexagon::S2_storerh_pcr,
false, 2);
1532 case Hexagon::PS_storerf_pcr:
1533 return RealCirc(Hexagon::S2_storerf_pcr,
false, 2);
1534 case Hexagon::PS_storeri_pcr:
1535 return RealCirc(Hexagon::S2_storeri_pcr,
false, 2);
1536 case Hexagon::PS_storerd_pcr:
1537 return RealCirc(Hexagon::S2_storerd_pcr,
false, 2);
1547 unsigned Opc =
MI.getOpcode();
1551 case Hexagon::V6_vgathermh_pseudo:
1553 .
add(
MI.getOperand(2))
1554 .
add(
MI.getOperand(3))
1555 .
add(
MI.getOperand(4));
1557 .
add(
MI.getOperand(0))
1561 return First.getInstrIterator();
1563 case Hexagon::V6_vgathermw_pseudo:
1565 .
add(
MI.getOperand(2))
1566 .
add(
MI.getOperand(3))
1567 .
add(
MI.getOperand(4));
1569 .
add(
MI.getOperand(0))
1573 return First.getInstrIterator();
1575 case Hexagon::V6_vgathermhw_pseudo:
1577 .
add(
MI.getOperand(2))
1578 .
add(
MI.getOperand(3))
1579 .
add(
MI.getOperand(4));
1581 .
add(
MI.getOperand(0))
1585 return First.getInstrIterator();
1587 case Hexagon::V6_vgathermhq_pseudo:
1589 .
add(
MI.getOperand(2))
1590 .
add(
MI.getOperand(3))
1591 .
add(
MI.getOperand(4))
1592 .
add(
MI.getOperand(5));
1594 .
add(
MI.getOperand(0))
1598 return First.getInstrIterator();
1600 case Hexagon::V6_vgathermwq_pseudo:
1602 .
add(
MI.getOperand(2))
1603 .
add(
MI.getOperand(3))
1604 .
add(
MI.getOperand(4))
1605 .
add(
MI.getOperand(5));
1607 .
add(
MI.getOperand(0))
1611 return First.getInstrIterator();
1613 case Hexagon::V6_vgathermhwq_pseudo:
1615 .
add(
MI.getOperand(2))
1616 .
add(
MI.getOperand(3))
1617 .
add(
MI.getOperand(4))
1618 .
add(
MI.getOperand(5));
1620 .
add(
MI.getOperand(0))
1624 return First.getInstrIterator();
1627 return MI.getIterator();
1636 assert(
Cond[0].
isImm() &&
"First entry in the cond vector not imm-val");
1637 unsigned opcode =
Cond[0].getImm();
1643 Cond[0].setImm(NewOpcode);
1677 int Opc =
MI.getOpcode();
1690 unsigned NOp = 0, NumOps =
MI.getNumOperands();
1691 while (NOp < NumOps) {
1693 if (!Op.isReg() || !Op.isDef() || Op.isImplicit())
1700 unsigned PredRegPos, PredRegFlags;
1701 bool GotPredReg =
getPredReg(
Cond, PredReg, PredRegPos, PredRegFlags);
1704 T.addReg(PredReg, PredRegFlags);
1705 while (NOp < NumOps)
1706 T.add(
MI.getOperand(NOp++));
1708 MI.setDesc(
get(PredOpc));
1709 while (
unsigned n =
MI.getNumOperands())
1710 MI.removeOperand(n-1);
1711 for (
unsigned i = 0, n =
T->getNumOperands(); i < n; ++i)
1712 MI.addOperand(
T->getOperand(i));
1718 MRI.clearKillFlags(PredReg);
1729 std::vector<MachineOperand> &Pred,
1730 bool SkipDead)
const {
1738 if (RC == &Hexagon::PredRegsRegClass) {
1743 }
else if (MO.isRegMask()) {
1744 for (
Register PR : Hexagon::PredRegsRegClass) {
1745 if (!
MI.modifiesRegister(PR, &HRI))
1756 if (!
MI.getDesc().isPredicable())
1766 switch (
MI.getOpcode()) {
1767 case Hexagon::V6_vL32b_ai:
1768 case Hexagon::V6_vL32b_pi:
1769 case Hexagon::V6_vL32b_ppu:
1770 case Hexagon::V6_vL32b_cur_ai:
1771 case Hexagon::V6_vL32b_cur_pi:
1772 case Hexagon::V6_vL32b_cur_ppu:
1773 case Hexagon::V6_vL32b_nt_ai:
1774 case Hexagon::V6_vL32b_nt_pi:
1775 case Hexagon::V6_vL32b_nt_ppu:
1776 case Hexagon::V6_vL32b_tmp_ai:
1777 case Hexagon::V6_vL32b_tmp_pi:
1778 case Hexagon::V6_vL32b_tmp_ppu:
1779 case Hexagon::V6_vL32b_nt_cur_ai:
1780 case Hexagon::V6_vL32b_nt_cur_pi:
1781 case Hexagon::V6_vL32b_nt_cur_ppu:
1782 case Hexagon::V6_vL32b_nt_tmp_ai:
1783 case Hexagon::V6_vL32b_nt_tmp_pi:
1784 case Hexagon::V6_vL32b_nt_tmp_ppu:
1800 if (
MI.isDebugInstr())
1816 if (
MI.getDesc().isTerminator() ||
MI.isPosition())
1820 if (
MI.getOpcode() == TargetOpcode::INLINEASM_BR)
1844 bool atInsnStart =
true;
1847 for (; *Str; ++Str) {
1851 if (atInsnStart && !isSpace(
static_cast<unsigned char>(*Str))) {
1853 atInsnStart =
false;
1857 atInsnStart =
false;
1880 int64_t &
Value)
const {
1881 unsigned Opc =
MI.getOpcode();
1885 case Hexagon::C2_cmpeq:
1886 case Hexagon::C2_cmpeqp:
1887 case Hexagon::C2_cmpgt:
1888 case Hexagon::C2_cmpgtp:
1889 case Hexagon::C2_cmpgtu:
1890 case Hexagon::C2_cmpgtup:
1891 case Hexagon::C4_cmpneq:
1892 case Hexagon::C4_cmplte:
1893 case Hexagon::C4_cmplteu:
1894 case Hexagon::C2_cmpeqi:
1895 case Hexagon::C2_cmpgti:
1896 case Hexagon::C2_cmpgtui:
1897 case Hexagon::C4_cmpneqi:
1898 case Hexagon::C4_cmplteui:
1899 case Hexagon::C4_cmpltei:
1900 SrcReg =
MI.getOperand(1).getReg();
1903 case Hexagon::A4_cmpbeq:
1904 case Hexagon::A4_cmpbgt:
1905 case Hexagon::A4_cmpbgtu:
1906 case Hexagon::A4_cmpbeqi:
1907 case Hexagon::A4_cmpbgti:
1908 case Hexagon::A4_cmpbgtui:
1909 SrcReg =
MI.getOperand(1).getReg();
1912 case Hexagon::A4_cmpheq:
1913 case Hexagon::A4_cmphgt:
1914 case Hexagon::A4_cmphgtu:
1915 case Hexagon::A4_cmpheqi:
1916 case Hexagon::A4_cmphgti:
1917 case Hexagon::A4_cmphgtui:
1918 SrcReg =
MI.getOperand(1).getReg();
1925 case Hexagon::C2_cmpeq:
1926 case Hexagon::C2_cmpeqp:
1927 case Hexagon::C2_cmpgt:
1928 case Hexagon::C2_cmpgtp:
1929 case Hexagon::C2_cmpgtu:
1930 case Hexagon::C2_cmpgtup:
1931 case Hexagon::A4_cmpbeq:
1932 case Hexagon::A4_cmpbgt:
1933 case Hexagon::A4_cmpbgtu:
1934 case Hexagon::A4_cmpheq:
1935 case Hexagon::A4_cmphgt:
1936 case Hexagon::A4_cmphgtu:
1937 case Hexagon::C4_cmpneq:
1938 case Hexagon::C4_cmplte:
1939 case Hexagon::C4_cmplteu:
1940 SrcReg2 =
MI.getOperand(2).getReg();
1944 case Hexagon::C2_cmpeqi:
1945 case Hexagon::C2_cmpgtui:
1946 case Hexagon::C2_cmpgti:
1947 case Hexagon::C4_cmpneqi:
1948 case Hexagon::C4_cmplteui:
1949 case Hexagon::C4_cmpltei:
1950 case Hexagon::A4_cmpbeqi:
1951 case Hexagon::A4_cmpbgti:
1952 case Hexagon::A4_cmpbgtui:
1953 case Hexagon::A4_cmpheqi:
1954 case Hexagon::A4_cmphgti:
1955 case Hexagon::A4_cmphgtui: {
1960 Value =
MI.getOperand(2).getImm();
1970 unsigned *PredCost)
const {
1996 unsigned BasePosA, OffsetPosA;
2004 unsigned BasePosB, OffsetPosB;
2011 if (BaseRegA != BaseRegB || BaseSubA != BaseSubB)
2029 if (OffsetA > OffsetB) {
2031 return SizeB <= OffDiff;
2033 if (OffsetA < OffsetB) {
2035 return SizeA <= OffDiff;
2045 unsigned BasePos = 0, OffsetPos = 0;
2049 if (OffsetOp.
isImm()) {
2053 }
else if (
MI.getOpcode() == Hexagon::A2_addi) {
2055 if (AddOp.
isImm()) {
2064std::pair<unsigned, unsigned>
2072 using namespace HexagonII;
2074 static const std::pair<unsigned, const char*>
Flags[] = {
2075 {MO_PCREL,
"hexagon-pcrel"},
2076 {MO_GOT,
"hexagon-got"},
2077 {MO_LO16,
"hexagon-lo16"},
2078 {MO_HI16,
"hexagon-hi16"},
2079 {MO_GPREL,
"hexagon-gprel"},
2080 {MO_GDGOT,
"hexagon-gdgot"},
2081 {MO_GDPLT,
"hexagon-gdplt"},
2082 {MO_IE,
"hexagon-ie"},
2083 {MO_IEGOT,
"hexagon-iegot"},
2084 {MO_TPREL,
"hexagon-tprel"}
2091 using namespace HexagonII;
2093 static const std::pair<unsigned, const char*>
Flags[] = {
2094 {HMOTF_ConstExtended,
"hexagon-ext"}
2103 TRC = &Hexagon::PredRegsRegClass;
2105 TRC = &Hexagon::IntRegsRegClass;
2107 TRC = &Hexagon::DoubleRegsRegClass;
2131 !
MI.getDesc().mayStore() &&
2132 MI.getDesc().getOpcode() != Hexagon::S2_allocframe &&
2133 MI.getDesc().getOpcode() != Hexagon::L2_deallocframe &&
2178 assert(MO.
isImm() &&
"Extendable operand must be Immediate type");
2182 int ImmValue = MO.
getImm();
2184 return (ImmValue < MinValue || ImmValue > MaxValue);
2188 switch (
MI.getOpcode()) {
2189 case Hexagon::L4_return:
2190 case Hexagon::L4_return_t:
2191 case Hexagon::L4_return_f:
2192 case Hexagon::L4_return_tnew_pnt:
2193 case Hexagon::L4_return_fnew_pnt:
2194 case Hexagon::L4_return_tnew_pt:
2195 case Hexagon::L4_return_fnew_pt:
2216 for (
auto &RegA : DefsA)
2217 for (
auto &RegB : UsesB) {
2222 if (RegA.isPhysical())
2224 if (RegB == *SubRegs)
2227 if (RegB.isPhysical())
2229 if (RegA == *SubRegs)
2238 switch (
MI.getOpcode()) {
2239 case Hexagon::V6_vL32b_cur_pi:
2240 case Hexagon::V6_vL32b_cur_ai:
2264 return (Opcode == Hexagon::ENDLOOP0 ||
2265 Opcode == Hexagon::ENDLOOP1);
2290 switch (
MI.getOpcode()) {
2292 case Hexagon::PS_fi:
2293 case Hexagon::PS_fia:
2318 unsigned Opcode =
MI.getOpcode();
2328 if (!
I.mayLoad() && !
I.mayStore())
2334 switch (
MI.getOpcode()) {
2335 case Hexagon::J2_callr:
2336 case Hexagon::J2_callrf:
2337 case Hexagon::J2_callrt:
2338 case Hexagon::PS_call_nr:
2345 switch (
MI.getOpcode()) {
2346 case Hexagon::L4_return:
2347 case Hexagon::L4_return_t:
2348 case Hexagon::L4_return_f:
2349 case Hexagon::L4_return_fnew_pnt:
2350 case Hexagon::L4_return_fnew_pt:
2351 case Hexagon::L4_return_tnew_pnt:
2352 case Hexagon::L4_return_tnew_pt:
2359 switch (
MI.getOpcode()) {
2360 case Hexagon::J2_jumpr:
2361 case Hexagon::J2_jumprt:
2362 case Hexagon::J2_jumprf:
2363 case Hexagon::J2_jumprtnewpt:
2364 case Hexagon::J2_jumprfnewpt:
2365 case Hexagon::J2_jumprtnew:
2366 case Hexagon::J2_jumprfnew:
2377 unsigned offset)
const {
2381 return isInt<11>(offset);
2383 switch (
MI.getOpcode()) {
2387 case Hexagon::J2_jump:
2388 case Hexagon::J2_call:
2389 case Hexagon::PS_call_nr:
2390 return isInt<24>(offset);
2391 case Hexagon::J2_jumpt:
2392 case Hexagon::J2_jumpf:
2393 case Hexagon::J2_jumptnew:
2394 case Hexagon::J2_jumptnewpt:
2395 case Hexagon::J2_jumpfnew:
2396 case Hexagon::J2_jumpfnewpt:
2397 case Hexagon::J2_callt:
2398 case Hexagon::J2_callf:
2399 return isInt<17>(offset);
2400 case Hexagon::J2_loop0i:
2401 case Hexagon::J2_loop0iext:
2402 case Hexagon::J2_loop0r:
2403 case Hexagon::J2_loop0rext:
2404 case Hexagon::J2_loop1i:
2405 case Hexagon::J2_loop1iext:
2406 case Hexagon::J2_loop1r:
2407 case Hexagon::J2_loop1rext:
2408 return isInt<9>(offset);
2410 case Hexagon::J4_cmpeqi_tp0_jump_nt:
2411 case Hexagon::J4_cmpeqi_tp1_jump_nt:
2412 case Hexagon::J4_cmpeqn1_tp0_jump_nt:
2413 case Hexagon::J4_cmpeqn1_tp1_jump_nt:
2414 return isInt<11>(offset);
2425 unsigned Opcode =
MI.getOpcode();
2426 return Opcode == Hexagon::J2_loop0i ||
2427 Opcode == Hexagon::J2_loop0r ||
2428 Opcode == Hexagon::J2_loop0iext ||
2429 Opcode == Hexagon::J2_loop0rext ||
2430 Opcode == Hexagon::J2_loop1i ||
2431 Opcode == Hexagon::J2_loop1r ||
2432 Opcode == Hexagon::J2_loop1iext ||
2433 Opcode == Hexagon::J2_loop1rext;
2437 switch (
MI.getOpcode()) {
2438 default:
return false;
2439 case Hexagon::L4_iadd_memopw_io:
2440 case Hexagon::L4_isub_memopw_io:
2441 case Hexagon::L4_add_memopw_io:
2442 case Hexagon::L4_sub_memopw_io:
2443 case Hexagon::L4_and_memopw_io:
2444 case Hexagon::L4_or_memopw_io:
2445 case Hexagon::L4_iadd_memoph_io:
2446 case Hexagon::L4_isub_memoph_io:
2447 case Hexagon::L4_add_memoph_io:
2448 case Hexagon::L4_sub_memoph_io:
2449 case Hexagon::L4_and_memoph_io:
2450 case Hexagon::L4_or_memoph_io:
2451 case Hexagon::L4_iadd_memopb_io:
2452 case Hexagon::L4_isub_memopb_io:
2453 case Hexagon::L4_add_memopb_io:
2454 case Hexagon::L4_sub_memopb_io:
2455 case Hexagon::L4_and_memopb_io:
2456 case Hexagon::L4_or_memopb_io:
2457 case Hexagon::L4_ior_memopb_io:
2458 case Hexagon::L4_ior_memoph_io:
2459 case Hexagon::L4_ior_memopw_io:
2460 case Hexagon::L4_iand_memopb_io:
2461 case Hexagon::L4_iand_memoph_io:
2462 case Hexagon::L4_iand_memopw_io:
2502 unsigned OperandNum)
const {
2552 return MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4 ||
2553 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT ||
2554 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_PIC ||
2555 MI.getOpcode() == Hexagon::SAVE_REGISTERS_CALL_V4_EXT_PIC;
2559 switch (
MI.getOpcode()) {
2561 case Hexagon::L2_loadrb_io:
2562 case Hexagon::L4_loadrb_ur:
2563 case Hexagon::L4_loadrb_ap:
2564 case Hexagon::L2_loadrb_pr:
2565 case Hexagon::L2_loadrb_pbr:
2566 case Hexagon::L2_loadrb_pi:
2567 case Hexagon::L2_loadrb_pci:
2568 case Hexagon::L2_loadrb_pcr:
2569 case Hexagon::L2_loadbsw2_io:
2570 case Hexagon::L4_loadbsw2_ur:
2571 case Hexagon::L4_loadbsw2_ap:
2572 case Hexagon::L2_loadbsw2_pr:
2573 case Hexagon::L2_loadbsw2_pbr:
2574 case Hexagon::L2_loadbsw2_pi:
2575 case Hexagon::L2_loadbsw2_pci:
2576 case Hexagon::L2_loadbsw2_pcr:
2577 case Hexagon::L2_loadbsw4_io:
2578 case Hexagon::L4_loadbsw4_ur:
2579 case Hexagon::L4_loadbsw4_ap:
2580 case Hexagon::L2_loadbsw4_pr:
2581 case Hexagon::L2_loadbsw4_pbr:
2582 case Hexagon::L2_loadbsw4_pi:
2583 case Hexagon::L2_loadbsw4_pci:
2584 case Hexagon::L2_loadbsw4_pcr:
2585 case Hexagon::L4_loadrb_rr:
2586 case Hexagon::L2_ploadrbt_io:
2587 case Hexagon::L2_ploadrbt_pi:
2588 case Hexagon::L2_ploadrbf_io:
2589 case Hexagon::L2_ploadrbf_pi:
2590 case Hexagon::L2_ploadrbtnew_io:
2591 case Hexagon::L2_ploadrbfnew_io:
2592 case Hexagon::L4_ploadrbt_rr:
2593 case Hexagon::L4_ploadrbf_rr:
2594 case Hexagon::L4_ploadrbtnew_rr:
2595 case Hexagon::L4_ploadrbfnew_rr:
2596 case Hexagon::L2_ploadrbtnew_pi:
2597 case Hexagon::L2_ploadrbfnew_pi:
2598 case Hexagon::L4_ploadrbt_abs:
2599 case Hexagon::L4_ploadrbf_abs:
2600 case Hexagon::L4_ploadrbtnew_abs:
2601 case Hexagon::L4_ploadrbfnew_abs:
2602 case Hexagon::L2_loadrbgp:
2604 case Hexagon::L2_loadrh_io:
2605 case Hexagon::L4_loadrh_ur:
2606 case Hexagon::L4_loadrh_ap:
2607 case Hexagon::L2_loadrh_pr:
2608 case Hexagon::L2_loadrh_pbr:
2609 case Hexagon::L2_loadrh_pi:
2610 case Hexagon::L2_loadrh_pci:
2611 case Hexagon::L2_loadrh_pcr:
2612 case Hexagon::L4_loadrh_rr:
2613 case Hexagon::L2_ploadrht_io:
2614 case Hexagon::L2_ploadrht_pi:
2615 case Hexagon::L2_ploadrhf_io:
2616 case Hexagon::L2_ploadrhf_pi:
2617 case Hexagon::L2_ploadrhtnew_io:
2618 case Hexagon::L2_ploadrhfnew_io:
2619 case Hexagon::L4_ploadrht_rr:
2620 case Hexagon::L4_ploadrhf_rr:
2621 case Hexagon::L4_ploadrhtnew_rr:
2622 case Hexagon::L4_ploadrhfnew_rr:
2623 case Hexagon::L2_ploadrhtnew_pi:
2624 case Hexagon::L2_ploadrhfnew_pi:
2625 case Hexagon::L4_ploadrht_abs:
2626 case Hexagon::L4_ploadrhf_abs:
2627 case Hexagon::L4_ploadrhtnew_abs:
2628 case Hexagon::L4_ploadrhfnew_abs:
2629 case Hexagon::L2_loadrhgp:
2642 switch (
MI.getOpcode()) {
2643 case Hexagon::STriw_pred:
2644 case Hexagon::LDriw_pred:
2655 for (
auto &Op :
MI.operands())
2656 if (Op.isGlobal() || Op.isSymbol())
2663 unsigned SchedClass =
MI.getDesc().getSchedClass();
2664 return is_TC1(SchedClass);
2668 unsigned SchedClass =
MI.getDesc().getSchedClass();
2669 return is_TC2(SchedClass);
2673 unsigned SchedClass =
MI.getDesc().getSchedClass();
2678 unsigned SchedClass =
MI.getDesc().getSchedClass();
2689 for (
int I = 0;
I <
N;
I++)
2694 if (MI2.
getOpcode() == Hexagon::V6_vS32b_pi)
2726 return isInt<4>(Count);
2736 return isInt<3>(Count);
2755 case Hexagon::PS_vstorerq_ai:
2756 case Hexagon::PS_vstorerv_ai:
2757 case Hexagon::PS_vstorerw_ai:
2758 case Hexagon::PS_vstorerw_nt_ai:
2759 case Hexagon::PS_vloadrq_ai:
2760 case Hexagon::PS_vloadrv_ai:
2761 case Hexagon::PS_vloadrw_ai:
2762 case Hexagon::PS_vloadrw_nt_ai:
2763 case Hexagon::V6_vL32b_ai:
2764 case Hexagon::V6_vS32b_ai:
2765 case Hexagon::V6_vS32b_qpred_ai:
2766 case Hexagon::V6_vS32b_nqpred_ai:
2767 case Hexagon::V6_vL32b_nt_ai:
2768 case Hexagon::V6_vS32b_nt_ai:
2769 case Hexagon::V6_vL32Ub_ai:
2770 case Hexagon::V6_vS32Ub_ai:
2771 case Hexagon::V6_vgathermh_pseudo:
2772 case Hexagon::V6_vgathermw_pseudo:
2773 case Hexagon::V6_vgathermhw_pseudo:
2774 case Hexagon::V6_vgathermhq_pseudo:
2775 case Hexagon::V6_vgathermwq_pseudo:
2776 case Hexagon::V6_vgathermhwq_pseudo: {
2777 unsigned VectorSize =
TRI->getSpillSize(Hexagon::HvxVRRegClass);
2779 if (
Offset & (VectorSize-1))
2784 case Hexagon::J2_loop0i:
2785 case Hexagon::J2_loop1i:
2786 return isUInt<10>(
Offset);
2788 case Hexagon::S4_storeirb_io:
2789 case Hexagon::S4_storeirbt_io:
2790 case Hexagon::S4_storeirbf_io:
2791 return isUInt<6>(
Offset);
2793 case Hexagon::S4_storeirh_io:
2794 case Hexagon::S4_storeirht_io:
2795 case Hexagon::S4_storeirhf_io:
2796 return isShiftedUInt<6,1>(
Offset);
2798 case Hexagon::S4_storeiri_io:
2799 case Hexagon::S4_storeirit_io:
2800 case Hexagon::S4_storeirif_io:
2801 return isShiftedUInt<6,2>(
Offset);
2803 case Hexagon::A4_cmpbeqi:
2804 return isUInt<8>(
Offset);
2805 case Hexagon::A4_cmpbgti:
2813 case Hexagon::L2_loadri_io:
2814 case Hexagon::S2_storeri_io:
2818 case Hexagon::L2_loadrd_io:
2819 case Hexagon::S2_storerd_io:
2823 case Hexagon::L2_loadrh_io:
2824 case Hexagon::L2_loadruh_io:
2825 case Hexagon::S2_storerh_io:
2826 case Hexagon::S2_storerf_io:
2830 case Hexagon::L2_loadrb_io:
2831 case Hexagon::L2_loadrub_io:
2832 case Hexagon::S2_storerb_io:
2836 case Hexagon::A2_addi:
2840 case Hexagon::L4_iadd_memopw_io:
2841 case Hexagon::L4_isub_memopw_io:
2842 case Hexagon::L4_add_memopw_io:
2843 case Hexagon::L4_sub_memopw_io:
2844 case Hexagon::L4_iand_memopw_io:
2845 case Hexagon::L4_ior_memopw_io:
2846 case Hexagon::L4_and_memopw_io:
2847 case Hexagon::L4_or_memopw_io:
2850 case Hexagon::L4_iadd_memoph_io:
2851 case Hexagon::L4_isub_memoph_io:
2852 case Hexagon::L4_add_memoph_io:
2853 case Hexagon::L4_sub_memoph_io:
2854 case Hexagon::L4_iand_memoph_io:
2855 case Hexagon::L4_ior_memoph_io:
2856 case Hexagon::L4_and_memoph_io:
2857 case Hexagon::L4_or_memoph_io:
2860 case Hexagon::L4_iadd_memopb_io:
2861 case Hexagon::L4_isub_memopb_io:
2862 case Hexagon::L4_add_memopb_io:
2863 case Hexagon::L4_sub_memopb_io:
2864 case Hexagon::L4_iand_memopb_io:
2865 case Hexagon::L4_ior_memopb_io:
2866 case Hexagon::L4_and_memopb_io:
2867 case Hexagon::L4_or_memopb_io:
2872 case Hexagon::STriw_pred:
2873 case Hexagon::LDriw_pred:
2874 case Hexagon::STriw_ctr:
2875 case Hexagon::LDriw_ctr:
2878 case Hexagon::PS_fi:
2879 case Hexagon::PS_fia:
2880 case Hexagon::INLINEASM:
2883 case Hexagon::L2_ploadrbt_io:
2884 case Hexagon::L2_ploadrbf_io:
2885 case Hexagon::L2_ploadrubt_io:
2886 case Hexagon::L2_ploadrubf_io:
2887 case Hexagon::S2_pstorerbt_io:
2888 case Hexagon::S2_pstorerbf_io:
2889 return isUInt<6>(
Offset);
2891 case Hexagon::L2_ploadrht_io:
2892 case Hexagon::L2_ploadrhf_io:
2893 case Hexagon::L2_ploadruht_io:
2894 case Hexagon::L2_ploadruhf_io:
2895 case Hexagon::S2_pstorerht_io:
2896 case Hexagon::S2_pstorerhf_io:
2897 return isShiftedUInt<6,1>(
Offset);
2899 case Hexagon::L2_ploadrit_io:
2900 case Hexagon::L2_ploadrif_io:
2901 case Hexagon::S2_pstorerit_io:
2902 case Hexagon::S2_pstorerif_io:
2903 return isShiftedUInt<6,2>(
Offset);
2905 case Hexagon::L2_ploadrdt_io:
2906 case Hexagon::L2_ploadrdf_io:
2907 case Hexagon::S2_pstorerdt_io:
2908 case Hexagon::S2_pstorerdf_io:
2909 return isShiftedUInt<6,3>(
Offset);
2911 case Hexagon::L2_loadbsw2_io:
2912 case Hexagon::L2_loadbzw2_io:
2913 return isShiftedInt<11,1>(
Offset);
2915 case Hexagon::L2_loadbsw4_io:
2916 case Hexagon::L2_loadbzw4_io:
2917 return isShiftedInt<11,2>(
Offset);
2920 dbgs() <<
"Failed Opcode is : " << Opcode <<
" (" <<
getName(Opcode)
2923 "Please define it in the above switch statement!");
2953 switch (
MI.getOpcode()) {
2955 case Hexagon::L2_loadrub_io:
2956 case Hexagon::L4_loadrub_ur:
2957 case Hexagon::L4_loadrub_ap:
2958 case Hexagon::L2_loadrub_pr:
2959 case Hexagon::L2_loadrub_pbr:
2960 case Hexagon::L2_loadrub_pi:
2961 case Hexagon::L2_loadrub_pci:
2962 case Hexagon::L2_loadrub_pcr:
2963 case Hexagon::L2_loadbzw2_io:
2964 case Hexagon::L4_loadbzw2_ur:
2965 case Hexagon::L4_loadbzw2_ap:
2966 case Hexagon::L2_loadbzw2_pr:
2967 case Hexagon::L2_loadbzw2_pbr:
2968 case Hexagon::L2_loadbzw2_pi:
2969 case Hexagon::L2_loadbzw2_pci:
2970 case Hexagon::L2_loadbzw2_pcr:
2971 case Hexagon::L2_loadbzw4_io:
2972 case Hexagon::L4_loadbzw4_ur:
2973 case Hexagon::L4_loadbzw4_ap:
2974 case Hexagon::L2_loadbzw4_pr:
2975 case Hexagon::L2_loadbzw4_pbr:
2976 case Hexagon::L2_loadbzw4_pi:
2977 case Hexagon::L2_loadbzw4_pci:
2978 case Hexagon::L2_loadbzw4_pcr:
2979 case Hexagon::L4_loadrub_rr:
2980 case Hexagon::L2_ploadrubt_io:
2981 case Hexagon::L2_ploadrubt_pi:
2982 case Hexagon::L2_ploadrubf_io:
2983 case Hexagon::L2_ploadrubf_pi:
2984 case Hexagon::L2_ploadrubtnew_io:
2985 case Hexagon::L2_ploadrubfnew_io:
2986 case Hexagon::L4_ploadrubt_rr:
2987 case Hexagon::L4_ploadrubf_rr:
2988 case Hexagon::L4_ploadrubtnew_rr:
2989 case Hexagon::L4_ploadrubfnew_rr:
2990 case Hexagon::L2_ploadrubtnew_pi:
2991 case Hexagon::L2_ploadrubfnew_pi:
2992 case Hexagon::L4_ploadrubt_abs:
2993 case Hexagon::L4_ploadrubf_abs:
2994 case Hexagon::L4_ploadrubtnew_abs:
2995 case Hexagon::L4_ploadrubfnew_abs:
2996 case Hexagon::L2_loadrubgp:
2998 case Hexagon::L2_loadruh_io:
2999 case Hexagon::L4_loadruh_ur:
3000 case Hexagon::L4_loadruh_ap:
3001 case Hexagon::L2_loadruh_pr:
3002 case Hexagon::L2_loadruh_pbr:
3003 case Hexagon::L2_loadruh_pi:
3004 case Hexagon::L2_loadruh_pci:
3005 case Hexagon::L2_loadruh_pcr:
3006 case Hexagon::L4_loadruh_rr:
3007 case Hexagon::L2_ploadruht_io:
3008 case Hexagon::L2_ploadruht_pi:
3009 case Hexagon::L2_ploadruhf_io:
3010 case Hexagon::L2_ploadruhf_pi:
3011 case Hexagon::L2_ploadruhtnew_io:
3012 case Hexagon::L2_ploadruhfnew_io:
3013 case Hexagon::L4_ploadruht_rr:
3014 case Hexagon::L4_ploadruhf_rr:
3015 case Hexagon::L4_ploadruhtnew_rr:
3016 case Hexagon::L4_ploadruhfnew_rr:
3017 case Hexagon::L2_ploadruhtnew_pi:
3018 case Hexagon::L2_ploadruhfnew_pi:
3019 case Hexagon::L4_ploadruht_abs:
3020 case Hexagon::L4_ploadruhf_abs:
3021 case Hexagon::L4_ploadruhtnew_abs:
3022 case Hexagon::L4_ploadruhfnew_abs:
3023 case Hexagon::L2_loadruhgp:
3042 int64_t &
Offset,
bool &OffsetIsScalable,
unsigned &Width,
3044 OffsetIsScalable =
false;
3046 if (!BaseOp || !BaseOp->
isReg())
3055 if (Second.
mayStore() && First.getOpcode() == Hexagon::S2_allocframe) {
3057 if (Op.isReg() && Op.isUse() && Op.getReg() == Hexagon::R29)
3067 if (!Stored.
isReg())
3069 for (
unsigned i = 0, e = First.getNumOperands(); i < e; ++i) {
3071 if (Op.isReg() && Op.isDef() && Op.getReg() == Stored.
getReg())
3080 return Opc == Hexagon::PS_call_nr || Opc == Hexagon::PS_callr_nr;
3096 if (Hexagon::getRegForm(
MI.getOpcode()) >= 0)
3099 if (
MI.getDesc().mayLoad() ||
MI.getDesc().mayStore()) {
3106 NonExtOpcode = Hexagon::changeAddrMode_abs_io(
MI.getOpcode());
3112 NonExtOpcode = Hexagon::changeAddrMode_io_rr(
MI.getOpcode());
3115 NonExtOpcode = Hexagon::changeAddrMode_ur_rr(
MI.getOpcode());
3120 if (NonExtOpcode < 0)
3128 return Hexagon::getRealHWInstr(
MI.getOpcode(),
3129 Hexagon::InstrType_Pseudo) >= 0;
3186 if (!MII->isBundle())
3189 for (++MII; MII != MIE && MII->isInsideBundle(); ++MII) {
3201 if (MO.isRegMask() && MO.clobbersPhysReg(PredReg))
3203 if (MO.isReg() && MO.isDef() && MO.isImplicit() && (MO.getReg() == PredReg))
3209 switch (
MI.getOpcode()) {
3210 case Hexagon::A4_addp_c:
3211 case Hexagon::A4_subp_c:
3212 case Hexagon::A4_tlbmatch:
3213 case Hexagon::A5_ACS:
3214 case Hexagon::F2_sfinvsqrta:
3215 case Hexagon::F2_sfrecipa:
3216 case Hexagon::J2_endloop0:
3217 case Hexagon::J2_endloop01:
3218 case Hexagon::J2_ploop1si:
3219 case Hexagon::J2_ploop1sr:
3220 case Hexagon::J2_ploop2si:
3221 case Hexagon::J2_ploop2sr:
3222 case Hexagon::J2_ploop3si:
3223 case Hexagon::J2_ploop3sr:
3224 case Hexagon::S2_cabacdecbin:
3225 case Hexagon::S2_storew_locked:
3226 case Hexagon::S4_stored_locked:
3233 return Opcode == Hexagon::J2_jumpt ||
3234 Opcode == Hexagon::J2_jumptpt ||
3235 Opcode == Hexagon::J2_jumpf ||
3236 Opcode == Hexagon::J2_jumpfpt ||
3237 Opcode == Hexagon::J2_jumptnew ||
3238 Opcode == Hexagon::J2_jumpfnew ||
3239 Opcode == Hexagon::J2_jumptnewpt ||
3240 Opcode == Hexagon::J2_jumpfnewpt;
3260 unsigned &AccessSize)
const {
3269 unsigned BasePos = 0, OffsetPos = 0;
3279 if (!OffsetOp.
isImm())
3292 unsigned &BasePos,
unsigned &OffsetPos)
const {
3300 }
else if (
MI.mayStore()) {
3303 }
else if (
MI.mayLoad()) {
3318 if (!
MI.getOperand(BasePos).isReg() || !
MI.getOperand(OffsetPos).isImm())
3357 while (
I->isDebugInstr()) {
3362 if (!isUnpredicatedTerminator(*
I))
3371 if (&*
I != LastInst && !
I->isBundle() && isUnpredicatedTerminator(*
I)) {
3372 if (!SecondLastInst) {
3373 SecondLastInst = &*
I;
3395 Register DstReg, SrcReg, Src1Reg, Src2Reg;
3397 switch (
MI.getOpcode()) {
3406 case Hexagon::C2_cmpeq:
3407 case Hexagon::C2_cmpgt:
3408 case Hexagon::C2_cmpgtu:
3409 DstReg =
MI.getOperand(0).getReg();
3410 Src1Reg =
MI.getOperand(1).getReg();
3411 Src2Reg =
MI.getOperand(2).getReg();
3412 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3413 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3417 case Hexagon::C2_cmpeqi:
3418 case Hexagon::C2_cmpgti:
3419 case Hexagon::C2_cmpgtui:
3421 DstReg =
MI.getOperand(0).getReg();
3422 SrcReg =
MI.getOperand(1).getReg();
3423 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3424 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3426 ((isUInt<5>(
MI.getOperand(2).getImm())) ||
3427 (
MI.getOperand(2).getImm() == -1)))
3430 case Hexagon::A2_tfr:
3432 DstReg =
MI.getOperand(0).getReg();
3433 SrcReg =
MI.getOperand(1).getReg();
3437 case Hexagon::A2_tfrsi:
3441 DstReg =
MI.getOperand(0).getReg();
3445 case Hexagon::S2_tstbit_i:
3446 DstReg =
MI.getOperand(0).getReg();
3447 Src1Reg =
MI.getOperand(1).getReg();
3448 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
3449 (Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) &&
3450 MI.getOperand(2).isImm() &&
3458 case Hexagon::J2_jumptnew:
3459 case Hexagon::J2_jumpfnew:
3460 case Hexagon::J2_jumptnewpt:
3461 case Hexagon::J2_jumpfnewpt:
3462 Src1Reg =
MI.getOperand(0).getReg();
3463 if (Hexagon::PredRegsRegClass.
contains(Src1Reg) &&
3464 (Hexagon::P0 == Src1Reg || Hexagon::P1 == Src1Reg))
3471 case Hexagon::J2_jump:
3472 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
3473 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
3485 if ((GA.
getOpcode() != Hexagon::C2_cmpeqi) ||
3486 (GB.
getOpcode() != Hexagon::J2_jumptnew))
3491 if (DestReg != Hexagon::P0 && DestReg != Hexagon::P1)
3499 return DestReg == Hexagon::P0 ? Hexagon::J4_cmpeqn1_tp0_jump_nt
3500 : Hexagon::J4_cmpeqn1_tp1_jump_nt;
3503 return DestReg == Hexagon::P0 ? Hexagon::J4_cmpeqi_tp0_jump_nt
3504 : Hexagon::J4_cmpeqi_tp1_jump_nt;
3509 bool ForBigCore)
const {
3517 static const std::map<unsigned, unsigned> DupMap = {
3518 {Hexagon::A2_add, Hexagon::dup_A2_add},
3519 {Hexagon::A2_addi, Hexagon::dup_A2_addi},
3520 {Hexagon::A2_andir, Hexagon::dup_A2_andir},
3521 {Hexagon::A2_combineii, Hexagon::dup_A2_combineii},
3522 {Hexagon::A2_sxtb, Hexagon::dup_A2_sxtb},
3523 {Hexagon::A2_sxth, Hexagon::dup_A2_sxth},
3524 {Hexagon::A2_tfr, Hexagon::dup_A2_tfr},
3525 {Hexagon::A2_tfrsi, Hexagon::dup_A2_tfrsi},
3526 {Hexagon::A2_zxtb, Hexagon::dup_A2_zxtb},
3527 {Hexagon::A2_zxth, Hexagon::dup_A2_zxth},
3528 {Hexagon::A4_combineii, Hexagon::dup_A4_combineii},
3529 {Hexagon::A4_combineir, Hexagon::dup_A4_combineir},
3530 {Hexagon::A4_combineri, Hexagon::dup_A4_combineri},
3531 {Hexagon::C2_cmoveif, Hexagon::dup_C2_cmoveif},
3532 {Hexagon::C2_cmoveit, Hexagon::dup_C2_cmoveit},
3533 {Hexagon::C2_cmovenewif, Hexagon::dup_C2_cmovenewif},
3534 {Hexagon::C2_cmovenewit, Hexagon::dup_C2_cmovenewit},
3535 {Hexagon::C2_cmpeqi, Hexagon::dup_C2_cmpeqi},
3536 {Hexagon::L2_deallocframe, Hexagon::dup_L2_deallocframe},
3537 {Hexagon::L2_loadrb_io, Hexagon::dup_L2_loadrb_io},
3538 {Hexagon::L2_loadrd_io, Hexagon::dup_L2_loadrd_io},
3539 {Hexagon::L2_loadrh_io, Hexagon::dup_L2_loadrh_io},
3540 {Hexagon::L2_loadri_io, Hexagon::dup_L2_loadri_io},
3541 {Hexagon::L2_loadrub_io, Hexagon::dup_L2_loadrub_io},
3542 {Hexagon::L2_loadruh_io, Hexagon::dup_L2_loadruh_io},
3543 {Hexagon::S2_allocframe, Hexagon::dup_S2_allocframe},
3544 {Hexagon::S2_storerb_io, Hexagon::dup_S2_storerb_io},
3545 {Hexagon::S2_storerd_io, Hexagon::dup_S2_storerd_io},
3546 {Hexagon::S2_storerh_io, Hexagon::dup_S2_storerh_io},
3547 {Hexagon::S2_storeri_io, Hexagon::dup_S2_storeri_io},
3548 {Hexagon::S4_storeirb_io, Hexagon::dup_S4_storeirb_io},
3549 {Hexagon::S4_storeiri_io, Hexagon::dup_S4_storeiri_io},
3551 unsigned OpNum =
MI.getOpcode();
3554 auto Iter = DupMap.find(OpNum);
3555 if (Iter != DupMap.end())
3556 return Iter->second;
3558 for (
const auto &Iter : DupMap)
3559 if (Iter.second == OpNum)
3566 enum Hexagon::PredSense inPredSense;
3567 inPredSense = invertPredicate ? Hexagon::PredSense_false :
3568 Hexagon::PredSense_true;
3569 int CondOpcode = Hexagon::getPredOpcode(Opc, inPredSense);
3570 if (CondOpcode >= 0)
3578 switch (
MI.getOpcode()) {
3580 case Hexagon::V6_vL32b_pi:
3581 return Hexagon::V6_vL32b_cur_pi;
3582 case Hexagon::V6_vL32b_ai:
3583 return Hexagon::V6_vL32b_cur_ai;
3584 case Hexagon::V6_vL32b_nt_pi:
3585 return Hexagon::V6_vL32b_nt_cur_pi;
3586 case Hexagon::V6_vL32b_nt_ai:
3587 return Hexagon::V6_vL32b_nt_cur_ai;
3588 case Hexagon::V6_vL32b_ppu:
3589 return Hexagon::V6_vL32b_cur_ppu;
3590 case Hexagon::V6_vL32b_nt_ppu:
3591 return Hexagon::V6_vL32b_nt_cur_ppu;
3598 switch (
MI.getOpcode()) {
3600 case Hexagon::V6_vL32b_cur_pi:
3601 return Hexagon::V6_vL32b_pi;
3602 case Hexagon::V6_vL32b_cur_ai:
3603 return Hexagon::V6_vL32b_ai;
3604 case Hexagon::V6_vL32b_nt_cur_pi:
3605 return Hexagon::V6_vL32b_nt_pi;
3606 case Hexagon::V6_vL32b_nt_cur_ai:
3607 return Hexagon::V6_vL32b_nt_ai;
3608 case Hexagon::V6_vL32b_cur_ppu:
3609 return Hexagon::V6_vL32b_ppu;
3610 case Hexagon::V6_vL32b_nt_cur_ppu:
3611 return Hexagon::V6_vL32b_nt_ppu;
3699 int NVOpcode = Hexagon::getNewValueOpcode(
MI.getOpcode());
3703 switch (
MI.getOpcode()) {
3706 std::to_string(
MI.getOpcode()));
3707 case Hexagon::S4_storerb_ur:
3708 return Hexagon::S4_storerbnew_ur;
3710 case Hexagon::S2_storerb_pci:
3711 return Hexagon::S2_storerb_pci;
3713 case Hexagon::S2_storeri_pci:
3714 return Hexagon::S2_storeri_pci;
3716 case Hexagon::S2_storerh_pci:
3717 return Hexagon::S2_storerh_pci;
3719 case Hexagon::S2_storerd_pci:
3720 return Hexagon::S2_storerd_pci;
3722 case Hexagon::S2_storerf_pci:
3723 return Hexagon::S2_storerf_pci;
3725 case Hexagon::V6_vS32b_ai:
3726 return Hexagon::V6_vS32b_new_ai;
3728 case Hexagon::V6_vS32b_pi:
3729 return Hexagon::V6_vS32b_new_pi;
3754 if (BrTarget.
isMBB()) {
3756 Taken = getEdgeProbability(Src, Dst) >= OneHalf;
3769 bool SawCond =
false, Bad =
false;
3773 if (
I.isConditionalBranch()) {
3780 if (
I.isUnconditionalBranch() && !SawCond) {
3788 if (NextIt ==
B.instr_end()) {
3791 if (!
B.isLayoutSuccessor(SB))
3793 Taken = getEdgeProbability(Src, SB) < OneHalf;
3797 assert(NextIt->isUnconditionalBranch());
3806 Taken =
BT && getEdgeProbability(Src,
BT) < OneHalf;
3813 switch (
MI.getOpcode()) {
3814 case Hexagon::J2_jumpt:
3815 return Taken ? Hexagon::J2_jumptnewpt : Hexagon::J2_jumptnew;
3816 case Hexagon::J2_jumpf:
3817 return Taken ? Hexagon::J2_jumpfnewpt : Hexagon::J2_jumpfnew;
3827 switch (
MI.getOpcode()) {
3829 case Hexagon::J2_jumpt:
3830 case Hexagon::J2_jumpf:
3834 int NewOpcode = Hexagon::getPredNewOpcode(
MI.getOpcode());
3841 int NewOp =
MI.getOpcode();
3843 NewOp = Hexagon::getPredOldOpcode(NewOp);
3847 if (!Subtarget.hasFeature(Hexagon::ArchV60)) {
3849 case Hexagon::J2_jumptpt:
3850 NewOp = Hexagon::J2_jumpt;
3852 case Hexagon::J2_jumpfpt:
3853 NewOp = Hexagon::J2_jumpf;
3855 case Hexagon::J2_jumprtpt:
3856 NewOp = Hexagon::J2_jumprt;
3858 case Hexagon::J2_jumprfpt:
3859 NewOp = Hexagon::J2_jumprf;
3864 "Couldn't change predicate new instruction to its old form.");
3868 NewOp = Hexagon::getNonNVStore(NewOp);
3869 assert(NewOp >= 0 &&
"Couldn't change new-value store to its old form.");
3877 case Hexagon::J2_jumpfpt:
3878 return Hexagon::J2_jumpf;
3879 case Hexagon::J2_jumptpt:
3880 return Hexagon::J2_jumpt;
3881 case Hexagon::J2_jumprfpt:
3882 return Hexagon::J2_jumprf;
3883 case Hexagon::J2_jumprtpt:
3884 return Hexagon::J2_jumprt;
3893 Register DstReg, SrcReg, Src1Reg, Src2Reg;
3896 switch (
MI.getOpcode()) {
3904 case Hexagon::L2_loadri_io:
3905 case Hexagon::dup_L2_loadri_io:
3906 DstReg =
MI.getOperand(0).getReg();
3907 SrcReg =
MI.getOperand(1).getReg();
3911 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
3913 MI.getOperand(2).isImm() &&
3914 isShiftedUInt<5,2>(
MI.getOperand(2).getImm()))
3918 (
MI.getOperand(2).isImm() &&
3919 isShiftedUInt<4,2>(
MI.getOperand(2).getImm())))
3923 case Hexagon::L2_loadrub_io:
3924 case Hexagon::dup_L2_loadrub_io:
3926 DstReg =
MI.getOperand(0).getReg();
3927 SrcReg =
MI.getOperand(1).getReg();
3929 MI.getOperand(2).isImm() && isUInt<4>(
MI.getOperand(2).getImm()))
3942 case Hexagon::L2_loadrh_io:
3943 case Hexagon::L2_loadruh_io:
3944 case Hexagon::dup_L2_loadrh_io:
3945 case Hexagon::dup_L2_loadruh_io:
3947 DstReg =
MI.getOperand(0).getReg();
3948 SrcReg =
MI.getOperand(1).getReg();
3950 MI.getOperand(2).isImm() &&
3951 isShiftedUInt<3,1>(
MI.getOperand(2).getImm()))
3954 case Hexagon::L2_loadrb_io:
3955 case Hexagon::dup_L2_loadrb_io:
3957 DstReg =
MI.getOperand(0).getReg();
3958 SrcReg =
MI.getOperand(1).getReg();
3960 MI.getOperand(2).isImm() &&
3961 isUInt<3>(
MI.getOperand(2).getImm()))
3964 case Hexagon::L2_loadrd_io:
3965 case Hexagon::dup_L2_loadrd_io:
3967 DstReg =
MI.getOperand(0).getReg();
3968 SrcReg =
MI.getOperand(1).getReg();
3970 Hexagon::IntRegsRegClass.
contains(SrcReg) &&
3972 MI.getOperand(2).isImm() &&
3973 isShiftedUInt<5,3>(
MI.getOperand(2).getImm()))
3978 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4:
3979 case Hexagon::RESTORE_DEALLOC_RET_JMP_V4_PIC:
3980 case Hexagon::L4_return:
3981 case Hexagon::L2_deallocframe:
3982 case Hexagon::dup_L2_deallocframe:
3984 case Hexagon::EH_RETURN_JMPR:
3985 case Hexagon::PS_jmpret:
3986 case Hexagon::SL2_jumpr31:
3989 DstReg =
MI.getOperand(0).getReg();
3990 if (Hexagon::IntRegsRegClass.
contains(DstReg) && (Hexagon::R31 == DstReg))
3993 case Hexagon::PS_jmprett:
3994 case Hexagon::PS_jmpretf:
3995 case Hexagon::PS_jmprettnewpt:
3996 case Hexagon::PS_jmpretfnewpt:
3997 case Hexagon::PS_jmprettnew:
3998 case Hexagon::PS_jmpretfnew:
3999 case Hexagon::SL2_jumpr31_t:
4000 case Hexagon::SL2_jumpr31_f:
4001 case Hexagon::SL2_jumpr31_tnew:
4002 case Hexagon::SL2_jumpr31_fnew:
4003 DstReg =
MI.getOperand(1).getReg();
4004 SrcReg =
MI.getOperand(0).getReg();
4006 if ((Hexagon::PredRegsRegClass.
contains(SrcReg) &&
4007 (Hexagon::P0 == SrcReg)) &&
4008 (Hexagon::IntRegsRegClass.
contains(DstReg) && (Hexagon::R31 == DstReg)))
4011 case Hexagon::L4_return_t:
4012 case Hexagon::L4_return_f:
4013 case Hexagon::L4_return_tnew_pnt:
4014 case Hexagon::L4_return_fnew_pnt:
4015 case Hexagon::L4_return_tnew_pt:
4016 case Hexagon::L4_return_fnew_pt:
4018 SrcReg =
MI.getOperand(0).getReg();
4019 if (Hexagon::PredRegsRegClass.
contains(SrcReg) && (Hexagon::P0 == SrcReg))
4027 case Hexagon::S2_storeri_io:
4028 case Hexagon::dup_S2_storeri_io:
4031 Src1Reg =
MI.getOperand(0).getReg();
4032 Src2Reg =
MI.getOperand(2).getReg();
4033 if (Hexagon::IntRegsRegClass.
contains(Src1Reg) &&
4036 isShiftedUInt<5,2>(
MI.getOperand(1).getImm()))
4040 MI.getOperand(1).isImm() &&
4041 isShiftedUInt<4,2>(
MI.getOperand(1).getImm()))
4044 case Hexagon::S2_storerb_io:
4045 case Hexagon::dup_S2_storerb_io:
4047 Src1Reg =
MI.getOperand(0).getReg();
4048 Src2Reg =
MI.getOperand(2).getReg();
4050 MI.getOperand(1).isImm() && isUInt<4>(
MI.getOperand(1).getImm()))
4062 case Hexagon::S2_storerh_io:
4063 case Hexagon::dup_S2_storerh_io:
4065 Src1Reg =
MI.getOperand(0).getReg();
4066 Src2Reg =
MI.getOperand(2).getReg();
4068 MI.getOperand(1).isImm() &&
4069 isShiftedUInt<3,1>(
MI.getOperand(1).getImm()))
4072 case Hexagon::S2_storerd_io:
4073 case Hexagon::dup_S2_storerd_io:
4075 Src1Reg =
MI.getOperand(0).getReg();
4076 Src2Reg =
MI.getOperand(2).getReg();
4078 Hexagon::IntRegsRegClass.
contains(Src1Reg) &&
4080 isShiftedInt<6,3>(
MI.getOperand(1).getImm()))
4083 case Hexagon::S4_storeiri_io:
4084 case Hexagon::dup_S4_storeiri_io:
4086 Src1Reg =
MI.getOperand(0).getReg();
4088 isShiftedUInt<4,2>(
MI.getOperand(1).getImm()) &&
4089 MI.getOperand(2).isImm() && isUInt<1>(
MI.getOperand(2).getImm()))
4092 case Hexagon::S4_storeirb_io:
4093 case Hexagon::dup_S4_storeirb_io:
4095 Src1Reg =
MI.getOperand(0).getReg();
4097 MI.getOperand(1).isImm() && isUInt<4>(
MI.getOperand(1).getImm()) &&
4098 MI.getOperand(2).isImm() && isUInt<1>(
MI.getOperand(2).getImm()))
4101 case Hexagon::S2_allocframe:
4102 case Hexagon::dup_S2_allocframe:
4103 if (
MI.getOperand(2).isImm() &&
4104 isShiftedUInt<5,3>(
MI.getOperand(2).getImm()))
4125 case Hexagon::A2_addi:
4126 case Hexagon::dup_A2_addi:
4127 DstReg =
MI.getOperand(0).getReg();
4128 SrcReg =
MI.getOperand(1).getReg();
4131 if (Hexagon::IntRegsRegClass.
contains(SrcReg) &&
4133 isShiftedUInt<6,2>(
MI.getOperand(2).getImm()))
4136 if ((DstReg == SrcReg) &&
MI.getOperand(2).isImm() &&
4137 isInt<7>(
MI.getOperand(2).getImm()))
4142 ((
MI.getOperand(2).getImm() == 1) ||
4143 (
MI.getOperand(2).getImm() == -1)))
4147 case Hexagon::A2_add:
4148 case Hexagon::dup_A2_add:
4150 DstReg =
MI.getOperand(0).getReg();
4151 Src1Reg =
MI.getOperand(1).getReg();
4152 Src2Reg =
MI.getOperand(2).getReg();
4157 case Hexagon::A2_andir:
4158 case Hexagon::dup_A2_andir:
4162 DstReg =
MI.getOperand(0).getReg();
4163 SrcReg =
MI.getOperand(1).getReg();
4165 MI.getOperand(2).isImm() &&
4166 ((
MI.getOperand(2).getImm() == 1) ||
4167 (
MI.getOperand(2).getImm() == 255)))
4170 case Hexagon::A2_tfr:
4171 case Hexagon::dup_A2_tfr:
4173 DstReg =
MI.getOperand(0).getReg();
4174 SrcReg =
MI.getOperand(1).getReg();
4178 case Hexagon::A2_tfrsi:
4179 case Hexagon::dup_A2_tfrsi:
4184 DstReg =
MI.getOperand(0).getReg();
4188 case Hexagon::C2_cmoveit:
4189 case Hexagon::C2_cmovenewit:
4190 case Hexagon::C2_cmoveif:
4191 case Hexagon::C2_cmovenewif:
4192 case Hexagon::dup_C2_cmoveit:
4193 case Hexagon::dup_C2_cmovenewit:
4194 case Hexagon::dup_C2_cmoveif:
4195 case Hexagon::dup_C2_cmovenewif:
4199 DstReg =
MI.getOperand(0).getReg();
4200 SrcReg =
MI.getOperand(1).getReg();
4202 Hexagon::PredRegsRegClass.
contains(SrcReg) && Hexagon::P0 == SrcReg &&
4203 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0)
4206 case Hexagon::C2_cmpeqi:
4207 case Hexagon::dup_C2_cmpeqi:
4209 DstReg =
MI.getOperand(0).getReg();
4210 SrcReg =
MI.getOperand(1).getReg();
4211 if (Hexagon::PredRegsRegClass.
contains(DstReg) &&
4213 MI.getOperand(2).isImm() && isUInt<2>(
MI.getOperand(2).getImm()))
4216 case Hexagon::A2_combineii:
4217 case Hexagon::A4_combineii:
4218 case Hexagon::dup_A2_combineii:
4219 case Hexagon::dup_A4_combineii:
4221 DstReg =
MI.getOperand(0).getReg();
4223 ((
MI.getOperand(1).isImm() && isUInt<2>(
MI.getOperand(1).getImm())) ||
4224 (
MI.getOperand(1).isGlobal() &&
4225 isUInt<2>(
MI.getOperand(1).getOffset()))) &&
4226 ((
MI.getOperand(2).isImm() && isUInt<2>(
MI.getOperand(2).getImm())) ||
4227 (
MI.getOperand(2).isGlobal() &&
4228 isUInt<2>(
MI.getOperand(2).getOffset()))))
4231 case Hexagon::A4_combineri:
4232 case Hexagon::dup_A4_combineri:
4235 DstReg =
MI.getOperand(0).getReg();
4236 SrcReg =
MI.getOperand(1).getReg();
4238 ((
MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) ||
4239 (
MI.getOperand(2).isGlobal() &&
MI.getOperand(2).getOffset() == 0)))
4242 case Hexagon::A4_combineir:
4243 case Hexagon::dup_A4_combineir:
4245 DstReg =
MI.getOperand(0).getReg();
4246 SrcReg =
MI.getOperand(2).getReg();
4248 ((
MI.getOperand(1).isImm() &&
MI.getOperand(1).getImm() == 0) ||
4249 (
MI.getOperand(1).isGlobal() &&
MI.getOperand(1).getOffset() == 0)))
4252 case Hexagon::A2_sxtb:
4253 case Hexagon::A2_sxth:
4254 case Hexagon::A2_zxtb:
4255 case Hexagon::A2_zxth:
4256 case Hexagon::dup_A2_sxtb:
4257 case Hexagon::dup_A2_sxth:
4258 case Hexagon::dup_A2_zxtb:
4259 case Hexagon::dup_A2_zxth:
4261 DstReg =
MI.getOperand(0).getReg();
4262 SrcReg =
MI.getOperand(1).getReg();
4272 return Hexagon::getRealHWInstr(
MI.getOpcode(), Hexagon::InstrType_Real);
4282 if (
MI.isTransient())
4299 unsigned UseIdx)
const {
4308 int Idx =
DefMI.findRegisterDefOperandIdx(*SR,
false,
false, &HRI);
4319 int Idx =
UseMI.findRegisterUseOperandIdx(*SR,
false, &HRI);
4346 Cond[0].setImm(Opc);
4353 : Hexagon::getTruePredOpcode(Opc);
4354 if (InvPredOpcode >= 0)
4355 return InvPredOpcode;
4369 return ~(-1U << (
bits - 1));
4371 return ~(-1U <<
bits);
4376 switch (
MI.getOpcode()) {
4377 case Hexagon::L2_loadrbgp:
4378 case Hexagon::L2_loadrdgp:
4379 case Hexagon::L2_loadrhgp:
4380 case Hexagon::L2_loadrigp:
4381 case Hexagon::L2_loadrubgp:
4382 case Hexagon::L2_loadruhgp:
4383 case Hexagon::S2_storerbgp:
4384 case Hexagon::S2_storerbnewgp:
4385 case Hexagon::S2_storerhgp:
4386 case Hexagon::S2_storerhnewgp:
4387 case Hexagon::S2_storerigp:
4388 case Hexagon::S2_storerinewgp:
4389 case Hexagon::S2_storerdgp:
4390 case Hexagon::S2_storerfgp:
4408 if (
MI.getOpcode() == Hexagon::A4_ext)
4422 bool ToBigInstrs)
const {
4434 MII->setDesc(
get(Opcode));
4440 bool ToBigInstrs)
const {
4443 End = MB.instr_end();
4444 Instr != End; ++Instr)
4452 while ((MII !=
MBB->
instr_end()) && MII->isInsideBundle()) {
4459 using namespace HexagonII;
4462 unsigned S = (
F >> MemAccessSizePos) & MemAccesSizeMask;
4463 unsigned Size = getMemAccessSizeInBytes(MemAccessSize(S));
4467 if (
MI.getOpcode() == Hexagon::Y2_dcfetchbo)
4474 return HRI.getSpillSize(Hexagon::HvxVRRegClass);
4489 return -1U << (
bits - 1);
4498 short NonExtOpcode = Hexagon::getRegForm(
MI.getOpcode());
4499 if (NonExtOpcode >= 0)
4500 return NonExtOpcode;
4502 if (
MI.getDesc().mayLoad() ||
MI.getDesc().mayStore()) {
4506 return Hexagon::changeAddrMode_abs_io(
MI.getOpcode());
4508 return Hexagon::changeAddrMode_io_rr(
MI.getOpcode());
4510 return Hexagon::changeAddrMode_ur_rr(
MI.getOpcode());
4520 Register &PredReg,
unsigned &PredRegPos,
unsigned &PredRegFlags)
const {
4528 PredReg =
Cond[1].getReg();
4532 if (
Cond[1].isImplicit())
4540 return Hexagon::getRealHWInstr(
MI.getOpcode(), Hexagon::InstrType_Pseudo);
4544 return Hexagon::getRegForm(
MI.getOpcode());