Lines Matching refs:ARM

1 //===-- ARMBaseInstrInfo.cpp - ARM Instruction Information ----------------===//
9 // This file contains the Base ARM implementation of the TargetInstrInfo class.
75 cl::desc("Enable ARM 2-addr to 3-addr conv"));
89 { ARM::VMLAS, ARM::VMULS, ARM::VADDS, false, false },
90 { ARM::VMLSS, ARM::VMULS, ARM::VSUBS, false, false },
91 { ARM::VMLAD, ARM::VMULD, ARM::VADDD, false, false },
92 { ARM::VMLSD, ARM::VMULD, ARM::VSUBD, false, false },
93 { ARM::VNMLAS, ARM::VNMULS, ARM::VSUBS, true, false },
94 { ARM::VNMLSS, ARM::VMULS, ARM::VSUBS, true, false },
95 { ARM::VNMLAD, ARM::VNMULD, ARM::VSUBD, true, false },
96 { ARM::VNMLSD, ARM::VMULD, ARM::VSUBD, true, false },
99 { ARM::VMLAfd, ARM::VMULfd, ARM::VADDfd, false, false },
100 { ARM::VMLSfd, ARM::VMULfd, ARM::VSUBfd, false, false },
101 { ARM::VMLAfq, ARM::VMULfq, ARM::VADDfq, false, false },
102 { ARM::VMLSfq, ARM::VMULfq, ARM::VSUBfq, false, false },
103 { ARM::VMLAslfd, ARM::VMULslfd, ARM::VADDfd, false, true },
104 { ARM::VMLSslfd, ARM::VMULslfd, ARM::VSUBfd, false, true },
105 { ARM::VMLAslfq, ARM::VMULslfq, ARM::VADDfq, false, true },
106 { ARM::VMLSslfq, ARM::VMULslfq, ARM::VSUBfq, false, true },
110 : ARMGenInstrInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
120 // Use a ScoreboardHazardRecognizer for prepass ARM scheduling. TargetInstrImpl
191 get(isSub ? ARM::SUBri : ARM::ADDri), WBReg)
200 get(isSub ? ARM::SUBrsi : ARM::ADDrsi), WBReg)
209 get(isSub ? ARM::SUBrr : ARM::ADDrr), WBReg)
222 get(isSub ? ARM::SUBri : ARM::ADDri), WBReg)
229 get(isSub ? ARM::SUBrr : ARM::ADDrr), WBReg)
437 ? ARM::B : (AFI->isThumb2Function() ? ARM::t2B : ARM::tB);
439 ? ARM::Bcc : (AFI->isThumb2Function() ? ARM::t2Bcc : ARM::tBcc);
445 "ARM branch conditions have two components!");
550 if ((MO.isRegMask() && MO.clobbersPhysReg(ARM::CPSR)) ||
551 (MO.isReg() && MO.isDef() && MO.getReg() == ARM::CPSR)) {
562 if (MO.isReg() && MO.getReg() == ARM::CPSR && MO.isDef() && !MO.isDead())
625 case ARM::tADC: // ADC (register) T1
626 case ARM::tADDi3: // ADD (immediate) T1
627 case ARM::tADDi8: // ADD (immediate) T2
628 case ARM::tADDrr: // ADD (register) T1
629 case ARM::tAND: // AND (register) T1
630 case ARM::tASRri: // ASR (immediate) T1
631 case ARM::tASRrr: // ASR (register) T1
632 case ARM::tBIC: // BIC (register) T1
633 case ARM::tEOR: // EOR (register) T1
634 case ARM::tLSLri: // LSL (immediate) T1
635 case ARM::tLSLrr: // LSL (register) T1
636 case ARM::tLSRri: // LSR (immediate) T1
637 case ARM::tLSRrr: // LSR (register) T1
638 case ARM::tMUL: // MUL T1
639 case ARM::tMVN: // MVN (register) T1
640 case ARM::tORR: // ORR (register) T1
641 case ARM::tROR: // ROR (register) T1
642 case ARM::tRSB: // RSB (immediate) T1
643 case ARM::tSBC: // SBC (register) T1
644 case ARM::tSUBi3: // SUB (immediate) T1
645 case ARM::tSUBi8: // SUB (immediate) T2
646 case ARM::tSUBrr: // SUB (register) T1
668 // In their ARM encoding, they can't be encoded in a conditional form.
687 if (MO.getReg() != ARM::CPSR)
715 case ARM::MOVi16_ga_pcrel:
716 case ARM::MOVTi16_ga_pcrel:
717 case ARM::t2MOVi16_ga_pcrel:
718 case ARM::t2MOVTi16_ga_pcrel:
720 case ARM::MOVi32imm:
721 case ARM::t2MOVi32imm:
723 case ARM::CONSTPOOL_ENTRY:
724 case ARM::JUMPTABLE_INSTS:
725 case ARM::JUMPTABLE_ADDRS:
726 case ARM::JUMPTABLE_TBB:
727 case ARM::JUMPTABLE_TBH:
731 case ARM::Int_eh_sjlj_longjmp:
733 case ARM::tInt_eh_sjlj_longjmp:
735 case ARM::tInt_WIN_eh_sjlj_longjmp:
737 case ARM::Int_eh_sjlj_setjmp:
738 case ARM::Int_eh_sjlj_setjmp_nofp:
740 case ARM::tInt_eh_sjlj_setjmp:
741 case ARM::t2Int_eh_sjlj_setjmp:
742 case ARM::t2Int_eh_sjlj_setjmp_nofp:
744 case ARM::SPACE:
746 case ARM::INLINEASM:
747 case ARM::INLINEASM_BR: {
773 ? (Subtarget.isMClass() ? ARM::t2MRS_M : ARM::t2MRS_AR)
774 : ARM::MRS;
785 .addReg(ARM::CPSR, RegState::Implicit | getKillRegState(KillSrc));
793 ? (Subtarget.isMClass() ? ARM::t2MSR_M : ARM::t2MSR_AR)
794 : ARM::MSR;
805 .addReg(ARM::CPSR, RegState::Implicit | RegState::Define);
821 MIB.addReg(ARM::VPR, RegState::Implicit);
834 bool GPRDest = ARM::GPRRegClass.contains(DestReg);
835 bool GPRSrc = ARM::GPRRegClass.contains(SrcReg);
838 BuildMI(MBB, I, DL, get(ARM::MOVr), DestReg)
845 bool SPRDest = ARM::SPRRegClass.contains(DestReg);
846 bool SPRSrc = ARM::SPRRegClass.contains(SrcReg);
850 Opc = ARM::VMOVS;
852 Opc = ARM::VMOVRS;
854 Opc = ARM::VMOVSR;
855 else if (ARM::DPRRegClass.contains(DestReg, SrcReg) && Subtarget.hasFP64())
856 Opc = ARM::VMOVD;
857 else if (ARM::QPRRegClass.contains(DestReg, SrcReg))
858 Opc = Subtarget.hasNEON() ? ARM::VORRq : ARM::MVE_VORR;
863 if (Opc == ARM::VORRq || Opc == ARM::MVE_VORR)
865 if (Opc == ARM::MVE_VORR)
878 if (ARM::QQPRRegClass.contains(DestReg, SrcReg)) {
879 Opc = Subtarget.hasNEON() ? ARM::VORRq : ARM::MVE_VORR;
880 BeginIdx = ARM::qsub_0;
882 } else if (ARM::QQQQPRRegClass.contains(DestReg, SrcReg)) {
883 Opc = Subtarget.hasNEON() ? ARM::VORRq : ARM::MVE_VORR;
884 BeginIdx = ARM::qsub_0;
887 } else if (ARM::DPairRegClass.contains(DestReg, SrcReg)) {
888 Opc = ARM::VMOVD;
889 BeginIdx = ARM::dsub_0;
891 } else if (ARM::DTripleRegClass.contains(DestReg, SrcReg)) {
892 Opc = ARM::VMOVD;
893 BeginIdx = ARM::dsub_0;
895 } else if (ARM::DQuadRegClass.contains(DestReg, SrcReg)) {
896 Opc = ARM::VMOVD;
897 BeginIdx = ARM::dsub_0;
899 } else if (ARM::GPRPairRegClass.contains(DestReg, SrcReg)) {
900 Opc = Subtarget.isThumb2() ? ARM::tMOVr : ARM::MOVr;
901 BeginIdx = ARM::gsub_0;
903 } else if (ARM::DPairSpcRegClass.contains(DestReg, SrcReg)) {
904 Opc = ARM::VMOVD;
905 BeginIdx = ARM::dsub_0;
908 } else if (ARM::DTripleSpcRegClass.contains(DestReg, SrcReg)) {
909 Opc = ARM::VMOVD;
910 BeginIdx = ARM::dsub_0;
913 } else if (ARM::DQuadSpcRegClass.contains(DestReg, SrcReg)) {
914 Opc = ARM::VMOVD;
915 BeginIdx = ARM::dsub_0;
918 } else if (ARM::DPRRegClass.contains(DestReg, SrcReg) &&
920 Opc = ARM::VMOVS;
921 BeginIdx = ARM::ssub_0;
923 } else if (SrcReg == ARM::CPSR) {
926 } else if (DestReg == ARM::CPSR) {
929 } else if (DestReg == ARM::VPR) {
930 assert(ARM::GPRRegClass.contains(SrcReg));
931 BuildMI(MBB, I, I->getDebugLoc(), get(ARM::VMSR_P0), DestReg)
935 } else if (SrcReg == ARM::VPR) {
936 assert(ARM::GPRRegClass.contains(DestReg));
937 BuildMI(MBB, I, I->getDebugLoc(), get(ARM::VMRS_P0), DestReg)
941 } else if (DestReg == ARM::FPSCR_NZCV) {
942 assert(ARM::GPRRegClass.contains(SrcReg));
943 BuildMI(MBB, I, I->getDebugLoc(), get(ARM::VMSR_FPSCR_NZCVQC), DestReg)
947 } else if (SrcReg == ARM::FPSCR_NZCV) {
948 assert(ARM::GPRRegClass.contains(DestReg));
949 BuildMI(MBB, I, I->getDebugLoc(), get(ARM::VMRS_FPSCR_NZCVQC), DestReg)
978 if (Opc == ARM::VORRq || Opc == ARM::MVE_VORR) {
982 if (Opc == ARM::MVE_VORR)
987 if (Opc == ARM::MOVr)
1006 (MI.getOpcode() == ARM::VORRq &&
1039 if (ARM::HPRRegClass.hasSubClassEq(RC)) {
1040 BuildMI(MBB, I, DebugLoc(), get(ARM::VSTRH))
1050 if (ARM::GPRRegClass.hasSubClassEq(RC)) {
1051 BuildMI(MBB, I, DebugLoc(), get(ARM::STRi12))
1057 } else if (ARM::SPRRegClass.hasSubClassEq(RC)) {
1058 BuildMI(MBB, I, DebugLoc(), get(ARM::VSTRS))
1064 } else if (ARM::VCCRRegClass.hasSubClassEq(RC)) {
1065 BuildMI(MBB, I, DebugLoc(), get(ARM::VSTR_P0_off))
1075 if (ARM::DPRRegClass.hasSubClassEq(RC)) {
1076 BuildMI(MBB, I, DebugLoc(), get(ARM::VSTRD))
1082 } else if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
1084 MachineInstrBuilder MIB = BuildMI(MBB, I, DebugLoc(), get(ARM::STRD));
1085 AddDReg(MIB, SrcReg, ARM::gsub_0, getKillRegState(isKill), TRI);
1086 AddDReg(MIB, SrcReg, ARM::gsub_1, 0, TRI);
1092 MachineInstrBuilder MIB = BuildMI(MBB, I, DebugLoc(), get(ARM::STMIA))
1096 AddDReg(MIB, SrcReg, ARM::gsub_0, getKillRegState(isKill), TRI);
1097 AddDReg(MIB, SrcReg, ARM::gsub_1, 0, TRI);
1103 if (ARM::DPairRegClass.hasSubClassEq(RC) && Subtarget.hasNEON()) {
1106 BuildMI(MBB, I, DebugLoc(), get(ARM::VST1q64))
1113 BuildMI(MBB, I, DebugLoc(), get(ARM::VSTMQIA))
1119 } else if (ARM::QPRRegClass.hasSubClassEq(RC) &&
1121 auto MIB = BuildMI(MBB, I, DebugLoc(), get(ARM::MVE_VSTRWU32));
1131 if (ARM::DTripleRegClass.hasSubClassEq(RC)) {
1135 BuildMI(MBB, I, DebugLoc(), get(ARM::VST1d64TPseudo))
1143 get(ARM::VSTMDIA))
1147 MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
1148 MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
1149 AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
1155 if (ARM::QQPRRegClass.hasSubClassEq(RC) || ARM::DQuadRegClass.hasSubClassEq(RC)) {
1160 BuildMI(MBB, I, DebugLoc(), get(ARM::VST1d64QPseudo))
1168 get(ARM::VSTMDIA))
1172 MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
1173 MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
1174 MIB = AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
1175 AddDReg(MIB, SrcReg, ARM::dsub_3, 0, TRI);
1181 if (ARM::QQQQPRRegClass.hasSubClassEq(RC)) {
1182 MachineInstrBuilder MIB = BuildMI(MBB, I, DebugLoc(), get(ARM::VSTMDIA))
1186 MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
1187 MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
1188 MIB = AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
1189 MIB = AddDReg(MIB, SrcReg, ARM::dsub_3, 0, TRI);
1190 MIB = AddDReg(MIB, SrcReg, ARM::dsub_4, 0, TRI);
1191 MIB = AddDReg(MIB, SrcReg, ARM::dsub_5, 0, TRI);
1192 MIB = AddDReg(MIB, SrcReg, ARM::dsub_6, 0, TRI);
1193 AddDReg(MIB, SrcReg, ARM::dsub_7, 0, TRI);
1206 case ARM::STRrs:
1207 case ARM::t2STRs: // FIXME: don't use t2STRs to access frame.
1215 case ARM::STRi12:
1216 case ARM::t2STRi12:
1217 case ARM::tSTRspi:
1218 case ARM::VSTRD:
1219 case ARM::VSTRS:
1226 case ARM::VSTR_P0_off:
1230 return ARM::P0;
1233 case ARM::VST1q64:
1234 case ARM::VST1d64TPseudo:
1235 case ARM::VST1d64QPseudo:
1241 case ARM::VSTMQIA:
1281 if (ARM::HPRRegClass.hasSubClassEq(RC)) {
1282 BuildMI(MBB, I, DL, get(ARM::VLDRH), DestReg)
1291 if (ARM::GPRRegClass.hasSubClassEq(RC)) {
1292 BuildMI(MBB, I, DL, get(ARM::LDRi12), DestReg)
1297 } else if (ARM::SPRRegClass.hasSubClassEq(RC)) {
1298 BuildMI(MBB, I, DL, get(ARM::VLDRS), DestReg)
1303 } else if (ARM::VCCRRegClass.hasSubClassEq(RC)) {
1304 BuildMI(MBB, I, DL, get(ARM::VLDR_P0_off), DestReg)
1313 if (ARM::DPRRegClass.hasSubClassEq(RC)) {
1314 BuildMI(MBB, I, DL, get(ARM::VLDRD), DestReg)
1319 } else if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
1323 MIB = BuildMI(MBB, I, DL, get(ARM::LDRD));
1324 AddDReg(MIB, DestReg, ARM::gsub_0, RegState::DefineNoRead, TRI);
1325 AddDReg(MIB, DestReg, ARM::gsub_1, RegState::DefineNoRead, TRI);
1331 MIB = BuildMI(MBB, I, DL, get(ARM::LDMIA))
1335 MIB = AddDReg(MIB, DestReg, ARM::gsub_0, RegState::DefineNoRead, TRI);
1336 MIB = AddDReg(MIB, DestReg, ARM::gsub_1, RegState::DefineNoRead, TRI);
1345 if (ARM::DPairRegClass.hasSubClassEq(RC) && Subtarget.hasNEON()) {
1347 BuildMI(MBB, I, DL, get(ARM::VLD1q64), DestReg)
1353 BuildMI(MBB, I, DL, get(ARM::VLDMQIA), DestReg)
1358 } else if (ARM::QPRRegClass.hasSubClassEq(RC) &&
1360 auto MIB = BuildMI(MBB, I, DL, get(ARM::MVE_VLDRWU32), DestReg);
1369 if (ARM::DTripleRegClass.hasSubClassEq(RC)) {
1372 BuildMI(MBB, I, DL, get(ARM::VLD1d64TPseudo), DestReg)
1378 MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VLDMDIA))
1382 MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::DefineNoRead, TRI);
1383 MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::DefineNoRead, TRI);
1384 MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::DefineNoRead, TRI);
1392 if (ARM::QQPRRegClass.hasSubClassEq(RC) || ARM::DQuadRegClass.hasSubClassEq(RC)) {
1395 BuildMI(MBB, I, DL, get(ARM::VLD1d64QPseudo), DestReg)
1401 MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VLDMDIA))
1405 MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::DefineNoRead, TRI);
1406 MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::DefineNoRead, TRI);
1407 MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::DefineNoRead, TRI);
1408 MIB = AddDReg(MIB, DestReg, ARM::dsub_3, RegState::DefineNoRead, TRI);
1416 if (ARM::QQQQPRRegClass.hasSubClassEq(RC)) {
1417 MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VLDMDIA))
1421 MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::DefineNoRead, TRI);
1422 MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::DefineNoRead, TRI);
1423 MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::DefineNoRead, TRI);
1424 MIB = AddDReg(MIB, DestReg, ARM::dsub_3, RegState::DefineNoRead, TRI);
1425 MIB = AddDReg(MIB, DestReg, ARM::dsub_4, RegState::DefineNoRead, TRI);
1426 MIB = AddDReg(MIB, DestReg, ARM::dsub_5, RegState::DefineNoRead, TRI);
1427 MIB = AddDReg(MIB, DestReg, ARM::dsub_6, RegState::DefineNoRead, TRI);
1428 MIB = AddDReg(MIB, DestReg, ARM::dsub_7, RegState::DefineNoRead, TRI);
1443 case ARM::LDRrs:
1444 case ARM::t2LDRs: // FIXME: don't use t2LDRs to access frame.
1452 case ARM::LDRi12:
1453 case ARM::t2LDRi12:
1454 case ARM::tLDRspi:
1455 case ARM::VLDRD:
1456 case ARM::VLDRS:
1463 case ARM::VLDR_P0_off:
1467 return ARM::P0;
1470 case ARM::VLD1q64:
1471 case ARM::VLD1d8TPseudo:
1472 case ARM::VLD1d16TPseudo:
1473 case ARM::VLD1d32TPseudo:
1474 case ARM::VLD1d64TPseudo:
1475 case ARM::VLD1d8QPseudo:
1476 case ARM::VLD1d16QPseudo:
1477 case ARM::VLD1d32QPseudo:
1478 case ARM::VLD1d64QPseudo:
1484 case ARM::VLDMQIA:
1521 LDM = BuildMI(*BB, MI, dl, TII->get(isThumb2 ? ARM::t2LDMIA_UPD
1522 : isThumb1 ? ARM::tLDMIA_UPD
1523 : ARM::LDMIA_UPD))
1526 LDM = BuildMI(*BB, MI, dl, TII->get(isThumb2 ? ARM::t2LDMIA : ARM::LDMIA));
1531 STM = BuildMI(*BB, MI, dl, TII->get(isThumb2 ? ARM::t2STMIA_UPD
1532 : isThumb1 ? ARM::tSTMIA_UPD
1533 : ARM::STMIA_UPD))
1536 STM = BuildMI(*BB, MI, dl, TII->get(isThumb2 ? ARM::t2STMIA : ARM::STMIA));
1573 if (MI.getOpcode() == ARM::MEMCPY) {
1589 if (!ARM::SPRRegClass.contains(DstRegS, SrcRegS))
1593 unsigned DstRegD = TRI->getMatchingSuperReg(DstRegS, ARM::ssub_0,
1594 &ARM::DPRRegClass);
1595 unsigned SrcRegD = TRI->getMatchingSuperReg(SrcRegS, ARM::ssub_0,
1596 &ARM::DPRRegClass);
1621 MI.setDesc(get(ARM::VMOVD));
1660 // is Thumb mode (t1 or t2). PCAdjustment would be 8 for ARM mode PIC, and
1661 // zero for non-PIC in ARM or Thumb. The callers are all of thumb LDR
1684 llvm_unreachable("Unexpected ARM constantpool value type!!");
1702 case ARM::tLDRpci_pic:
1703 case ARM::t2LDRpci_pic: {
1724 case ARM::tLDRpci_pic:
1725 case ARM::t2LDRpci_pic: {
1745 if (Opcode == ARM::t2LDRpci ||
1746 Opcode == ARM::t2LDRpci_pic ||
1747 Opcode == ARM::tLDRpci ||
1748 Opcode == ARM::tLDRpci_pic ||
1749 Opcode == ARM::LDRLIT_ga_pcrel ||
1750 Opcode == ARM::LDRLIT_ga_pcrel_ldr ||
1751 Opcode == ARM::tLDRLIT_ga_pcrel ||
1752 Opcode == ARM::MOV_ga_pcrel ||
1753 Opcode == ARM::MOV_ga_pcrel_ldr ||
1754 Opcode == ARM::t2MOV_ga_pcrel) {
1765 if (Opcode == ARM::LDRLIT_ga_pcrel ||
1766 Opcode == ARM::LDRLIT_ga_pcrel_ldr ||
1767 Opcode == ARM::tLDRLIT_ga_pcrel ||
1768 Opcode == ARM::MOV_ga_pcrel ||
1769 Opcode == ARM::MOV_ga_pcrel_ldr ||
1770 Opcode == ARM::t2MOV_ga_pcrel)
1792 } else if (Opcode == ARM::PICLDR) {
1838 // Don't worry about Thumb: just ARM and Thumb2.
1847 case ARM::LDRi12:
1848 case ARM::LDRBi12:
1849 case ARM::LDRD:
1850 case ARM::LDRH:
1851 case ARM::LDRSB:
1852 case ARM::LDRSH:
1853 case ARM::VLDRD:
1854 case ARM::VLDRS:
1855 case ARM::t2LDRi8:
1856 case ARM::t2LDRBi8:
1857 case ARM::t2LDRDi8:
1858 case ARM::t2LDRSHi8:
1859 case ARM::t2LDRi12:
1860 case ARM::t2LDRBi12:
1861 case ARM::t2LDRSHi12:
1868 case ARM::LDRi12:
1869 case ARM::LDRBi12:
1870 case ARM::LDRD:
1871 case ARM::LDRH:
1872 case ARM::LDRSB:
1873 case ARM::LDRSH:
1874 case ARM::VLDRD:
1875 case ARM::VLDRS:
1876 case ARM::t2LDRi8:
1877 case ARM::t2LDRBi8:
1878 case ARM::t2LDRSHi8:
1879 case ARM::t2LDRi12:
1880 case ARM::t2LDRBi12:
1881 case ARM::t2LDRSHi12:
1919 // Don't worry about Thumb: just ARM and Thumb2.
1933 !((Load1->getMachineOpcode() == ARM::t2LDRBi8 &&
1934 Load2->getMachineOpcode() == ARM::t2LDRBi12) ||
1935 (Load1->getMachineOpcode() == ARM::t2LDRBi12 &&
1936 Load2->getMachineOpcode() == ARM::t2LDRBi8)))
1972 if (I != MBB->end() && I->getOpcode() == ARM::t2IT)
1981 // No ARM calling conventions change the stack pointer. (X86 calling
1983 if (!MI.isCall() && MI.definesRegister(ARM::SP))
2003 if (LastMI->getOpcode() == ARM::t2Bcc) {
2083 // ARM has a condition code field in every predicable instruction, using it
2093 if (MI.getOpcode() == ARM::t2Bcc &&
2135 if (Opc == ARM::B)
2136 return ARM::Bcc;
2137 if (Opc == ARM::tB)
2138 return ARM::tBcc;
2139 if (Opc == ARM::t2B)
2140 return ARM::t2Bcc;
2150 case ARM::MOVCCr:
2151 case ARM::t2MOVCCr: {
2156 if (CC == ARMCC::AL || PredReg != ARM::CPSR)
2213 assert((MI.getOpcode() == ARM::MOVCCr || MI.getOpcode() == ARM::t2MOVCCr) &&
2234 assert((MI.getOpcode() == ARM::MOVCCr || MI.getOpcode() == ARM::t2MOVCCr) &&
2309 {ARM::ADDSri, ARM::ADDri},
2310 {ARM::ADDSrr, ARM::ADDrr},
2311 {ARM::ADDSrsi, ARM::ADDrsi},
2312 {ARM::ADDSrsr, ARM::ADDrsr},
2314 {ARM::SUBSri, ARM::SUBri},
2315 {ARM::SUBSrr, ARM::SUBrr},
2316 {ARM::SUBSrsi, ARM::SUBrsi},
2317 {ARM::SUBSrsr, ARM::SUBrsr},
2319 {ARM::RSBSri, ARM::RSBri},
2320 {ARM::RSBSrsi, ARM::RSBrsi},
2321 {ARM::RSBSrsr, ARM::RSBrsr},
2323 {ARM::tADDSi3, ARM::tADDi3},
2324 {ARM::tADDSi8, ARM::tADDi8},
2325 {ARM::tADDSrr, ARM::tADDrr},
2326 {ARM::tADCS, ARM::tADC},
2328 {ARM::tSUBSi3, ARM::tSUBi3},
2329 {ARM::tSUBSi8, ARM::tSUBi8},
2330 {ARM::tSUBSrr, ARM::tSUBrr},
2331 {ARM::tSBCS, ARM::tSBC},
2332 {ARM::tRSBS, ARM::tRSB},
2333 {ARM::tLSLSri, ARM::tLSLri},
2335 {ARM::t2ADDSri, ARM::t2ADDri},
2336 {ARM::t2ADDSrr, ARM::t2ADDrr},
2337 {ARM::t2ADDSrs, ARM::t2ADDrs},
2339 {ARM::t2SUBSri, ARM::t2SUBri},
2340 {ARM::t2SUBSrr, ARM::t2SUBrr},
2341 {ARM::t2SUBSrs, ARM::t2SUBrs},
2343 {ARM::t2RSBSri, ARM::t2RSBri},
2344 {ARM::t2RSBSrs, ARM::t2RSBrs},
2362 BuildMI(MBB, MBBI, dl, TII.get(ARM::MOVr), DestReg)
2384 unsigned Opc = isSub ? ARM::SUBri : ARM::ADDri;
2411 bool IsVFPPushPop = MI->getOpcode() == ARM::VSTMDDB_UPD ||
2412 MI->getOpcode() == ARM::VLDMDIA_UPD;
2413 bool IsT1PushPop = MI->getOpcode() == ARM::tPUSH ||
2414 MI->getOpcode() == ARM::tPOP ||
2415 MI->getOpcode() == ARM::tPOP_RET;
2417 assert((IsT1PushPop || (MI->getOperand(0).getReg() == ARM::SP &&
2418 MI->getOperand(1).getReg() == ARM::SP)) &&
2427 // ARM and Thumb2 push/pop insts have explicit "sp, sp" operands (+
2436 RegClass = &ARM::DPRRegClass;
2439 RegClass = &ARM::GPRRegClass;
2467 if (IsT1PushPop && CurRegEnc > TRI->getEncodingValue(ARM::R7))
2526 if (Opcode == ARM::INLINEASM || Opcode == ARM::INLINEASM_BR)
2529 if (Opcode == ARM::ADDri) {
2533 MI.setDesc(TII.get(ARM::MOVr));
2541 MI.setDesc(TII.get(ARM::SUBri));
2679 case ARM::CMPri:
2680 case ARM::t2CMPri:
2681 case ARM::tCMPi8:
2687 case ARM::CMPrr:
2688 case ARM::t2CMPrr:
2689 case ARM::tCMPr:
2695 case ARM::TSTri:
2696 case ARM::t2TSTri:
2714 case ARM::ANDri:
2715 case ARM::t2ANDri:
2749 if ((CmpI->getOpcode() == ARM::CMPrr || CmpI->getOpcode() == ARM::t2CMPrr) &&
2750 (OI->getOpcode() == ARM::SUBrr || OI->getOpcode() == ARM::t2SUBrr) &&
2759 if (CmpI->getOpcode() == ARM::tCMPr && OI->getOpcode() == ARM::tSUBrr &&
2768 if ((CmpI->getOpcode() == ARM::CMPri || CmpI->getOpcode() == ARM::t2CMPri) &&
2769 (OI->getOpcode() == ARM::SUBri || OI->getOpcode() == ARM::t2SUBri) &&
2776 if (CmpI->getOpcode() == ARM::tCMPi8 &&
2777 (OI->getOpcode() == ARM::tSUBi8 || OI->getOpcode() == ARM::tSUBi3) &&
2784 if ((CmpI->getOpcode() == ARM::CMPrr || CmpI->getOpcode() == ARM::t2CMPrr) &&
2785 (OI->getOpcode() == ARM::ADDrr || OI->getOpcode() == ARM::t2ADDrr ||
2786 OI->getOpcode() == ARM::ADDri || OI->getOpcode() == ARM::t2ADDri) &&
2794 if (CmpI->getOpcode() == ARM::tCMPr &&
2795 (OI->getOpcode() == ARM::tADDi3 || OI->getOpcode() == ARM::tADDi8 ||
2796 OI->getOpcode() == ARM::tADDrr) &&
2809 case ARM::tLSLri:
2810 case ARM::tLSRri:
2811 case ARM::tLSLrr:
2812 case ARM::tLSRrr:
2813 case ARM::tSUBrr:
2814 case ARM::tADDrr:
2815 case ARM::tADDi3:
2816 case ARM::tADDi8:
2817 case ARM::tSUBi3:
2818 case ARM::tSUBi8:
2819 case ARM::tMUL:
2820 case ARM::tADC:
2821 case ARM::tSBC:
2822 case ARM::tRSB:
2823 case ARM::tAND:
2824 case ARM::tORR:
2825 case ARM::tEOR:
2826 case ARM::tBIC:
2827 case ARM::tMVN:
2828 case ARM::tASRri:
2829 case ARM::tASRrr:
2830 case ARM::tROR:
2833 case ARM::RSBrr:
2834 case ARM::RSBri:
2835 case ARM::RSCrr:
2836 case ARM::RSCri:
2837 case ARM::ADDrr:
2838 case ARM::ADDri:
2839 case ARM::ADCrr:
2840 case ARM::ADCri:
2841 case ARM::SUBrr:
2842 case ARM::SUBri:
2843 case ARM::SBCrr:
2844 case ARM::SBCri:
2845 case ARM::t2RSBri:
2846 case ARM::t2ADDrr:
2847 case ARM::t2ADDri:
2848 case ARM::t2ADCrr:
2849 case ARM::t2ADCri:
2850 case ARM::t2SUBrr:
2851 case ARM::t2SUBri:
2852 case ARM::t2SBCrr:
2853 case ARM::t2SBCri:
2854 case ARM::ANDrr:
2855 case ARM::ANDri:
2856 case ARM::t2ANDrr:
2857 case ARM::t2ANDri:
2858 case ARM::ORRrr:
2859 case ARM::ORRri:
2860 case ARM::t2ORRrr:
2861 case ARM::t2ORRri:
2862 case ARM::EORrr:
2863 case ARM::EORri:
2864 case ARM::t2EORrr:
2865 case ARM::t2EORri:
2866 case ARM::t2LSRri:
2867 case ARM::t2LSRrr:
2868 case ARM::t2LSLri:
2869 case ARM::t2LSLrr:
2929 if (CmpInstr.getOpcode() == ARM::CMPri ||
2930 CmpInstr.getOpcode() == ARM::t2CMPri ||
2931 CmpInstr.getOpcode() == ARM::tCMPi8)
2956 if (I != E && !MI->readsRegister(ARM::CPSR, TRI)) {
2959 if (I->getOpcode() != ARM::tMOVi8) {
2991 if (Instr.modifiesRegister(ARM::CPSR, TRI) ||
2992 Instr.readsRegister(ARM::CPSR, TRI))
3037 if (MO.isRegMask() && MO.clobbersPhysReg(ARM::CPSR)) {
3041 if (!MO.isReg() || MO.getReg() != ARM::CPSR)
3055 case ARM::VSELEQD:
3056 case ARM::VSELEQS:
3057 case ARM::VSELEQH:
3060 case ARM::VSELGTD:
3061 case ARM::VSELGTS:
3062 case ARM::VSELGTH:
3065 case ARM::VSELGED:
3066 case ARM::VSELGES:
3067 case ARM::VSELGEH:
3070 case ARM::VSELVSD:
3071 case ARM::VSELVSS:
3072 case ARM::VSELVSH:
3086 bool IsSub = Opc == ARM::SUBrr || Opc == ARM::t2SUBrr ||
3087 Opc == ARM::SUBri || Opc == ARM::t2SUBri ||
3088 Opc == ARM::tSUBrr || Opc == ARM::tSUBi3 ||
3089 Opc == ARM::tSUBi8;
3090 unsigned OpI = Opc != ARM::tSUBrr ? 1 : 2;
3137 if ((*SI)->isLiveIn(ARM::CPSR))
3144 MI->getOperand(5).setReg(ARM::CPSR);
3156 MI->clearRegisterDeads(ARM::CPSR);
3184 if (DefOpc != ARM::t2MOVi32imm && DefOpc != ARM::MOVi32imm)
3197 if (MO.getReg() == ARM::CPSR && !MO.isDead())
3206 if (UseMI.getOperand(NumOps - 1).getReg() == ARM::CPSR)
3219 case ARM::SUBrr:
3220 case ARM::ADDrr:
3221 case ARM::ORRrr:
3222 case ARM::EORrr:
3223 case ARM::t2SUBrr:
3224 case ARM::t2ADDrr:
3225 case ARM::t2ORRrr:
3226 case ARM::t2EORrr: {
3230 case ARM::ADDrr:
3231 case ARM::SUBrr:
3232 if (UseOpc == ARM::SUBrr && Commute)
3238 NewUseOpc = UseOpc == ARM::ADDrr ? ARM::ADDri : ARM::SUBri;
3241 NewUseOpc = UseOpc == ARM::ADDrr ? ARM::SUBri : ARM::ADDri;
3247 case ARM::ORRrr:
3248 case ARM::EORrr:
3255 case ARM::ORRrr: NewUseOpc = ARM::ORRri; break;
3256 case ARM::EORrr: NewUseOpc = ARM::EORri; break;
3259 case ARM::t2ADDrr:
3260 case ARM::t2SUBrr: {
3261 if (UseOpc == ARM::t2SUBrr && Commute)
3266 const bool ToSP = DefMI.getOperand(0).getReg() == ARM::SP;
3267 const unsigned t2ADD = ToSP ? ARM::t2ADDspImm : ARM::t2ADDri;
3268 const unsigned t2SUB = ToSP ? ARM::t2SUBspImm : ARM::t2SUBri;
3270 NewUseOpc = UseOpc == ARM::t2ADDrr ? t2ADD : t2SUB;
3273 NewUseOpc = UseOpc == ARM::t2ADDrr ? t2SUB : t2ADD;
3280 case ARM::t2ORRrr:
3281 case ARM::t2EORrr:
3288 case ARM::t2ORRrr: NewUseOpc = ARM::t2ORRri; break;
3289 case ARM::t2EORrr: NewUseOpc = ARM::t2EORri; break;
3318 case ARM::t2ADDspImm:
3319 case ARM::t2SUBspImm:
3320 case ARM::t2ADDri:
3321 case ARM::t2SUBri:
3337 case ARM::LDRrs:
3338 case ARM::LDRBrs:
3339 case ARM::STRrs:
3340 case ARM::STRBrs: {
3352 case ARM::LDRH:
3353 case ARM::STRH: {
3368 case ARM::LDRSB:
3369 case ARM::LDRSH:
3372 case ARM::LDRSB_POST:
3373 case ARM::LDRSH_POST: {
3379 case ARM::LDR_PRE_REG:
3380 case ARM::LDRB_PRE_REG: {
3396 case ARM::STR_PRE_REG:
3397 case ARM::STRB_PRE_REG: {
3409 case ARM::LDRH_PRE:
3410 case ARM::STRH_PRE: {
3420 case ARM::LDR_POST_REG:
3421 case ARM::LDRB_POST_REG:
3422 case ARM::LDRH_POST: {
3428 case ARM::LDR_PRE_IMM:
3429 case ARM::LDRB_PRE_IMM:
3430 case ARM::LDR_POST_IMM:
3431 case ARM::LDRB_POST_IMM:
3432 case ARM::STRB_POST_IMM:
3433 case ARM::STRB_POST_REG:
3434 case ARM::STRB_PRE_IMM:
3435 case ARM::STRH_POST:
3436 case ARM::STR_POST_IMM:
3437 case ARM::STR_POST_REG:
3438 case ARM::STR_PRE_IMM:
3441 case ARM::LDRSB_PRE:
3442 case ARM::LDRSH_PRE: {
3460 case ARM::LDRD: {
3470 case ARM::STRD: {
3478 case ARM::LDRD_POST:
3479 case ARM::t2LDRD_POST:
3482 case ARM::STRD_POST:
3483 case ARM::t2STRD_POST:
3486 case ARM::LDRD_PRE: {
3496 case ARM::t2LDRD_PRE: {
3502 case ARM::STRD_PRE: {
3510 case ARM::t2STRD_PRE:
3513 case ARM::t2LDR_POST:
3514 case ARM::t2LDRB_POST:
3515 case ARM::t2LDRB_PRE:
3516 case ARM::t2LDRSBi12:
3517 case ARM::t2LDRSBi8:
3518 case ARM::t2LDRSBpci:
3519 case ARM::t2LDRSBs:
3520 case ARM::t2LDRH_POST:
3521 case ARM::t2LDRH_PRE:
3522 case ARM::t2LDRSBT:
3523 case ARM::t2LDRSB_POST:
3524 case ARM::t2LDRSB_PRE:
3525 case ARM::t2LDRSH_POST:
3526 case ARM::t2LDRSH_PRE:
3527 case ARM::t2LDRSHi12:
3528 case ARM::t2LDRSHi8:
3529 case ARM::t2LDRSHpci:
3530 case ARM::t2LDRSHs:
3533 case ARM::t2LDRDi8: {
3539 case ARM::t2STRB_POST:
3540 case ARM::t2STRB_PRE:
3541 case ARM::t2STRBs:
3542 case ARM::t2STRDi8:
3543 case ARM::t2STRH_POST:
3544 case ARM::t2STRH_PRE:
3545 case ARM::t2STRHs:
3546 case ARM::t2STR_POST:
3547 case ARM::t2STR_PRE:
3548 case ARM::t2STRs:
3596 case ARM::VLDMDIA_UPD:
3597 case ARM::VLDMDDB_UPD:
3598 case ARM::VLDMSIA_UPD:
3599 case ARM::VLDMSDB_UPD:
3600 case ARM::VSTMDIA_UPD:
3601 case ARM::VSTMDDB_UPD:
3602 case ARM::VSTMSIA_UPD:
3603 case ARM::VSTMSDB_UPD:
3604 case ARM::LDMIA_UPD:
3605 case ARM::LDMDA_UPD:
3606 case ARM::LDMDB_UPD:
3607 case ARM::LDMIB_UPD:
3608 case ARM::STMIA_UPD:
3609 case ARM::STMDA_UPD:
3610 case ARM::STMDB_UPD:
3611 case ARM::STMIB_UPD:
3612 case ARM::tLDMIA_UPD:
3613 case ARM::tSTMIA_UPD:
3614 case ARM::t2LDMIA_UPD:
3615 case ARM::t2LDMDB_UPD:
3616 case ARM::t2STMIA_UPD:
3617 case ARM::t2STMDB_UPD:
3620 case ARM::LDMIA_RET:
3621 case ARM::tPOP_RET:
3622 case ARM::t2LDMIA_RET:
3648 case ARM::VLDMQIA:
3649 case ARM::VSTMQIA:
3662 case ARM::VLDMDIA:
3663 case ARM::VLDMDIA_UPD:
3664 case ARM::VLDMDDB_UPD:
3665 case ARM::VLDMSIA:
3666 case ARM::VLDMSIA_UPD:
3667 case ARM::VLDMSDB_UPD:
3668 case ARM::VSTMDIA:
3669 case ARM::VSTMDIA_UPD:
3670 case ARM::VSTMDDB_UPD:
3671 case ARM::VSTMSIA:
3672 case ARM::VSTMSIA_UPD:
3673 case ARM::VSTMSDB_UPD: {
3678 case ARM::LDMIA_RET:
3679 case ARM::LDMIA:
3680 case ARM::LDMDA:
3681 case ARM::LDMDB:
3682 case ARM::LDMIB:
3683 case ARM::LDMIA_UPD:
3684 case ARM::LDMDA_UPD:
3685 case ARM::LDMDB_UPD:
3686 case ARM::LDMIB_UPD:
3687 case ARM::STMIA:
3688 case ARM::STMDA:
3689 case ARM::STMDB:
3690 case ARM::STMIB:
3691 case ARM::STMIA_UPD:
3692 case ARM::STMDA_UPD:
3693 case ARM::STMDB_UPD:
3694 case ARM::STMIB_UPD:
3695 case ARM::tLDMIA:
3696 case ARM::tLDMIA_UPD:
3697 case ARM::tSTMIA_UPD:
3698 case ARM::tPOP_RET:
3699 case ARM::tPOP:
3700 case ARM::tPUSH:
3701 case ARM::t2LDMIA_RET:
3702 case ARM::t2LDMIA:
3703 case ARM::t2LDMDB:
3704 case ARM::t2LDMIA_UPD:
3705 case ARM::t2LDMDB_UPD:
3706 case ARM::t2STMIA:
3707 case ARM::t2STMDB:
3708 case ARM::t2STMIA_UPD:
3709 case ARM::t2STMDB_UPD: {
3764 case ARM::VLDMSIA:
3765 case ARM::VLDMSIA_UPD:
3766 case ARM::VLDMSDB_UPD:
3855 case ARM::VSTMSIA:
3856 case ARM::VSTMSIA_UPD:
3857 case ARM::VSTMSDB_UPD:
3925 case ARM::VLDMDIA:
3926 case ARM::VLDMDIA_UPD:
3927 case ARM::VLDMDDB_UPD:
3928 case ARM::VLDMSIA:
3929 case ARM::VLDMSIA_UPD:
3930 case ARM::VLDMSDB_UPD:
3934 case ARM::LDMIA_RET:
3935 case ARM::LDMIA:
3936 case ARM::LDMDA:
3937 case ARM::LDMDB:
3938 case ARM::LDMIB:
3939 case ARM::LDMIA_UPD:
3940 case ARM::LDMDA_UPD:
3941 case ARM::LDMDB_UPD:
3942 case ARM::LDMIB_UPD:
3943 case ARM::tLDMIA:
3944 case ARM::tLDMIA_UPD:
3945 case ARM::tPUSH:
3946 case ARM::t2LDMIA_RET:
3947 case ARM::t2LDMIA:
3948 case ARM::t2LDMDB:
3949 case ARM::t2LDMIA_UPD:
3950 case ARM::t2LDMDB_UPD:
3966 case ARM::VSTMDIA:
3967 case ARM::VSTMDIA_UPD:
3968 case ARM::VSTMDDB_UPD:
3969 case ARM::VSTMSIA:
3970 case ARM::VSTMSIA_UPD:
3971 case ARM::VSTMSDB_UPD:
3975 case ARM::STMIA:
3976 case ARM::STMDA:
3977 case ARM::STMDB:
3978 case ARM::STMIB:
3979 case ARM::STMIA_UPD:
3980 case ARM::STMDA_UPD:
3981 case ARM::STMDB_UPD:
3982 case ARM::STMIB_UPD:
3983 case ARM::tSTMIA_UPD:
3984 case ARM::tPOP_RET:
3985 case ARM::tPOP:
3986 case ARM::t2STMIA:
3987 case ARM::t2STMDB:
3988 case ARM::t2STMIA_UPD:
3989 case ARM::t2STMDB_UPD:
4053 if (II->getOpcode() != ARM::t2IT)
4079 case ARM::LDRrs:
4080 case ARM::LDRBrs: {
4088 case ARM::t2LDRs:
4089 case ARM::t2LDRBs:
4090 case ARM::t2LDRHs:
4091 case ARM::t2LDRSHs: {
4104 case ARM::LDRrs:
4105 case ARM::LDRBrs: {
4119 case ARM::t2LDRs:
4120 case ARM::t2LDRBs:
4121 case ARM::t2LDRHs:
4122 case ARM::t2LDRSHs: {
4135 case ARM::VLD1q8:
4136 case ARM::VLD1q16:
4137 case ARM::VLD1q32:
4138 case ARM::VLD1q64:
4139 case ARM::VLD1q8wb_fixed:
4140 case ARM::VLD1q16wb_fixed:
4141 case ARM::VLD1q32wb_fixed:
4142 case ARM::VLD1q64wb_fixed:
4143 case ARM::VLD1q8wb_register:
4144 case ARM::VLD1q16wb_register:
4145 case ARM::VLD1q32wb_register:
4146 case ARM::VLD1q64wb_register:
4147 case ARM::VLD2d8:
4148 case ARM::VLD2d16:
4149 case ARM::VLD2d32:
4150 case ARM::VLD2q8:
4151 case ARM::VLD2q16:
4152 case ARM::VLD2q32:
4153 case ARM::VLD2d8wb_fixed:
4154 case ARM::VLD2d16wb_fixed:
4155 case ARM::VLD2d32wb_fixed:
4156 case ARM::VLD2q8wb_fixed:
4157 case ARM::VLD2q16wb_fixed:
4158 case ARM::VLD2q32wb_fixed:
4159 case ARM::VLD2d8wb_register:
4160 case ARM::VLD2d16wb_register:
4161 case ARM::VLD2d32wb_register:
4162 case ARM::VLD2q8wb_register:
4163 case ARM::VLD2q16wb_register:
4164 case ARM::VLD2q32wb_register:
4165 case ARM::VLD3d8:
4166 case ARM::VLD3d16:
4167 case ARM::VLD3d32:
4168 case ARM::VLD1d64T:
4169 case ARM::VLD3d8_UPD:
4170 case ARM::VLD3d16_UPD:
4171 case ARM::VLD3d32_UPD:
4172 case ARM::VLD1d64Twb_fixed:
4173 case ARM::VLD1d64Twb_register:
4174 case ARM::VLD3q8_UPD:
4175 case ARM::VLD3q16_UPD:
4176 case ARM::VLD3q32_UPD:
4177 case ARM::VLD4d8:
4178 case ARM::VLD4d16:
4179 case ARM::VLD4d32:
4180 case ARM::VLD1d64Q:
4181 case ARM::VLD4d8_UPD:
4182 case ARM::VLD4d16_UPD:
4183 case ARM::VLD4d32_UPD:
4184 case ARM::VLD1d64Qwb_fixed:
4185 case ARM::VLD1d64Qwb_register:
4186 case ARM::VLD4q8_UPD:
4187 case ARM::VLD4q16_UPD:
4188 case ARM::VLD4q32_UPD:
4189 case ARM::VLD1DUPq8:
4190 case ARM::VLD1DUPq16:
4191 case ARM::VLD1DUPq32:
4192 case ARM::VLD1DUPq8wb_fixed:
4193 case ARM::VLD1DUPq16wb_fixed:
4194 case ARM::VLD1DUPq32wb_fixed:
4195 case ARM::VLD1DUPq8wb_register:
4196 case ARM::VLD1DUPq16wb_register:
4197 case ARM::VLD1DUPq32wb_register:
4198 case ARM::VLD2DUPd8:
4199 case ARM::VLD2DUPd16:
4200 case ARM::VLD2DUPd32:
4201 case ARM::VLD2DUPd8wb_fixed:
4202 case ARM::VLD2DUPd16wb_fixed:
4203 case ARM::VLD2DUPd32wb_fixed:
4204 case ARM::VLD2DUPd8wb_register:
4205 case ARM::VLD2DUPd16wb_register:
4206 case ARM::VLD2DUPd32wb_register:
4207 case ARM::VLD4DUPd8:
4208 case ARM::VLD4DUPd16:
4209 case ARM::VLD4DUPd32:
4210 case ARM::VLD4DUPd8_UPD:
4211 case ARM::VLD4DUPd16_UPD:
4212 case ARM::VLD4DUPd32_UPD:
4213 case ARM::VLD1LNd8:
4214 case ARM::VLD1LNd16:
4215 case ARM::VLD1LNd32:
4216 case ARM::VLD1LNd8_UPD:
4217 case ARM::VLD1LNd16_UPD:
4218 case ARM::VLD1LNd32_UPD:
4219 case ARM::VLD2LNd8:
4220 case ARM::VLD2LNd16:
4221 case ARM::VLD2LNd32:
4222 case ARM::VLD2LNq16:
4223 case ARM::VLD2LNq32:
4224 case ARM::VLD2LNd8_UPD:
4225 case ARM::VLD2LNd16_UPD:
4226 case ARM::VLD2LNd32_UPD:
4227 case ARM::VLD2LNq16_UPD:
4228 case ARM::VLD2LNq32_UPD:
4229 case ARM::VLD4LNd8:
4230 case ARM::VLD4LNd16:
4231 case ARM::VLD4LNd32:
4232 case ARM::VLD4LNq16:
4233 case ARM::VLD4LNq32:
4234 case ARM::VLD4LNd8_UPD:
4235 case ARM::VLD4LNd16_UPD:
4236 case ARM::VLD4LNd32_UPD:
4237 case ARM::VLD4LNq16_UPD:
4238 case ARM::VLD4LNq32_UPD:
4289 if (Reg == ARM::CPSR) {
4290 if (DefMI.getOpcode() == ARM::FMSTAT) {
4383 case ARM::LDRrs:
4384 case ARM::LDRBrs: {
4393 case ARM::t2LDRs:
4394 case ARM::t2LDRBs:
4395 case ARM::t2LDRHs:
4396 case ARM::t2LDRSHs: {
4410 case ARM::LDRrs:
4411 case ARM::LDRBrs: {
4423 case ARM::t2LDRs:
4424 case ARM::t2LDRBs:
4425 case ARM::t2LDRHs:
4426 case ARM::t2LDRSHs:
4436 case ARM::VLD1q8:
4437 case ARM::VLD1q16:
4438 case ARM::VLD1q32:
4439 case ARM::VLD1q64:
4440 case ARM::VLD1q8wb_register:
4441 case ARM::VLD1q16wb_register:
4442 case ARM::VLD1q32wb_register:
4443 case ARM::VLD1q64wb_register:
4444 case ARM::VLD1q8wb_fixed:
4445 case ARM::VLD1q16wb_fixed:
4446 case ARM::VLD1q32wb_fixed:
4447 case ARM::VLD1q64wb_fixed:
4448 case ARM::VLD2d8:
4449 case ARM::VLD2d16:
4450 case ARM::VLD2d32:
4451 case ARM::VLD2q8Pseudo:
4452 case ARM::VLD2q16Pseudo:
4453 case ARM::VLD2q32Pseudo:
4454 case ARM::VLD2d8wb_fixed:
4455 case ARM::VLD2d16wb_fixed:
4456 case ARM::VLD2d32wb_fixed:
4457 case ARM::VLD2q8PseudoWB_fixed:
4458 case ARM::VLD2q16PseudoWB_fixed:
4459 case ARM::VLD2q32PseudoWB_fixed:
4460 case ARM::VLD2d8wb_register:
4461 case ARM::VLD2d16wb_register:
4462 case ARM::VLD2d32wb_register:
4463 case ARM::VLD2q8PseudoWB_register:
4464 case ARM::VLD2q16PseudoWB_register:
4465 case ARM::VLD2q32PseudoWB_register:
4466 case ARM::VLD3d8Pseudo:
4467 case ARM::VLD3d16Pseudo:
4468 case ARM::VLD3d32Pseudo:
4469 case ARM::VLD1d8TPseudo:
4470 case ARM::VLD1d16TPseudo:
4471 case ARM::VLD1d32TPseudo:
4472 case ARM::VLD1d64TPseudo:
4473 case ARM::VLD1d64TPseudoWB_fixed:
4474 case ARM::VLD1d64TPseudoWB_register:
4475 case ARM::VLD3d8Pseudo_UPD:
4476 case ARM::VLD3d16Pseudo_UPD:
4477 case ARM::VLD3d32Pseudo_UPD:
4478 case ARM::VLD3q8Pseudo_UPD:
4479 case ARM::VLD3q16Pseudo_UPD:
4480 case ARM::VLD3q32Pseudo_UPD:
4481 case ARM::VLD3q8oddPseudo:
4482 case ARM::VLD3q16oddPseudo:
4483 case ARM::VLD3q32oddPseudo:
4484 case ARM::VLD3q8oddPseudo_UPD:
4485 case ARM::VLD3q16oddPseudo_UPD:
4486 case ARM::VLD3q32oddPseudo_UPD:
4487 case ARM::VLD4d8Pseudo:
4488 case ARM::VLD4d16Pseudo:
4489 case ARM::VLD4d32Pseudo:
4490 case ARM::VLD1d8QPseudo:
4491 case ARM::VLD1d16QPseudo:
4492 case ARM::VLD1d32QPseudo:
4493 case ARM::VLD1d64QPseudo:
4494 case ARM::VLD1d64QPseudoWB_fixed:
4495 case ARM::VLD1d64QPseudoWB_register:
4496 case ARM::VLD1q8HighQPseudo:
4497 case ARM::VLD1q8LowQPseudo_UPD:
4498 case ARM::VLD1q8HighTPseudo:
4499 case ARM::VLD1q8LowTPseudo_UPD:
4500 case ARM::VLD1q16HighQPseudo:
4501 case ARM::VLD1q16LowQPseudo_UPD:
4502 case ARM::VLD1q16HighTPseudo:
4503 case ARM::VLD1q16LowTPseudo_UPD:
4504 case ARM::VLD1q32HighQPseudo:
4505 case ARM::VLD1q32LowQPseudo_UPD:
4506 case ARM::VLD1q32HighTPseudo:
4507 case ARM::VLD1q32LowTPseudo_UPD:
4508 case ARM::VLD1q64HighQPseudo:
4509 case ARM::VLD1q64LowQPseudo_UPD:
4510 case ARM::VLD1q64HighTPseudo:
4511 case ARM::VLD1q64LowTPseudo_UPD:
4512 case ARM::VLD4d8Pseudo_UPD:
4513 case ARM::VLD4d16Pseudo_UPD:
4514 case ARM::VLD4d32Pseudo_UPD:
4515 case ARM::VLD4q8Pseudo_UPD:
4516 case ARM::VLD4q16Pseudo_UPD:
4517 case ARM::VLD4q32Pseudo_UPD:
4518 case ARM::VLD4q8oddPseudo:
4519 case ARM::VLD4q16oddPseudo:
4520 case ARM::VLD4q32oddPseudo:
4521 case ARM::VLD4q8oddPseudo_UPD:
4522 case ARM::VLD4q16oddPseudo_UPD:
4523 case ARM::VLD4q32oddPseudo_UPD:
4524 case ARM::VLD1DUPq8:
4525 case ARM::VLD1DUPq16:
4526 case ARM::VLD1DUPq32:
4527 case ARM::VLD1DUPq8wb_fixed:
4528 case ARM::VLD1DUPq16wb_fixed:
4529 case ARM::VLD1DUPq32wb_fixed:
4530 case ARM::VLD1DUPq8wb_register:
4531 case ARM::VLD1DUPq16wb_register:
4532 case ARM::VLD1DUPq32wb_register:
4533 case ARM::VLD2DUPd8:
4534 case ARM::VLD2DUPd16:
4535 case ARM::VLD2DUPd32:
4536 case ARM::VLD2DUPd8wb_fixed:
4537 case ARM::VLD2DUPd16wb_fixed:
4538 case ARM::VLD2DUPd32wb_fixed:
4539 case ARM::VLD2DUPd8wb_register:
4540 case ARM::VLD2DUPd16wb_register:
4541 case ARM::VLD2DUPd32wb_register:
4542 case ARM::VLD2DUPq8EvenPseudo:
4543 case ARM::VLD2DUPq8OddPseudo:
4544 case ARM::VLD2DUPq16EvenPseudo:
4545 case ARM::VLD2DUPq16OddPseudo:
4546 case ARM::VLD2DUPq32EvenPseudo:
4547 case ARM::VLD2DUPq32OddPseudo:
4548 case ARM::VLD3DUPq8EvenPseudo:
4549 case ARM::VLD3DUPq8OddPseudo:
4550 case ARM::VLD3DUPq16EvenPseudo:
4551 case ARM::VLD3DUPq16OddPseudo:
4552 case ARM::VLD3DUPq32EvenPseudo:
4553 case ARM::VLD3DUPq32OddPseudo:
4554 case ARM::VLD4DUPd8Pseudo:
4555 case ARM::VLD4DUPd16Pseudo:
4556 case ARM::VLD4DUPd32Pseudo:
4557 case ARM::VLD4DUPd8Pseudo_UPD:
4558 case ARM::VLD4DUPd16Pseudo_UPD:
4559 case ARM::VLD4DUPd32Pseudo_UPD:
4560 case ARM::VLD4DUPq8EvenPseudo:
4561 case ARM::VLD4DUPq8OddPseudo:
4562 case ARM::VLD4DUPq16EvenPseudo:
4563 case ARM::VLD4DUPq16OddPseudo:
4564 case ARM::VLD4DUPq32EvenPseudo:
4565 case ARM::VLD4DUPq32OddPseudo:
4566 case ARM::VLD1LNq8Pseudo:
4567 case ARM::VLD1LNq16Pseudo:
4568 case ARM::VLD1LNq32Pseudo:
4569 case ARM::VLD1LNq8Pseudo_UPD:
4570 case ARM::VLD1LNq16Pseudo_UPD:
4571 case ARM::VLD1LNq32Pseudo_UPD:
4572 case ARM::VLD2LNd8Pseudo:
4573 case ARM::VLD2LNd16Pseudo:
4574 case ARM::VLD2LNd32Pseudo:
4575 case ARM::VLD2LNq16Pseudo:
4576 case ARM::VLD2LNq32Pseudo:
4577 case ARM::VLD2LNd8Pseudo_UPD:
4578 case ARM::VLD2LNd16Pseudo_UPD:
4579 case ARM::VLD2LNd32Pseudo_UPD:
4580 case ARM::VLD2LNq16Pseudo_UPD:
4581 case ARM::VLD2LNq32Pseudo_UPD:
4582 case ARM::VLD4LNd8Pseudo:
4583 case ARM::VLD4LNd16Pseudo:
4584 case ARM::VLD4LNd32Pseudo:
4585 case ARM::VLD4LNq16Pseudo:
4586 case ARM::VLD4LNq32Pseudo:
4587 case ARM::VLD4LNd8Pseudo_UPD:
4588 case ARM::VLD4LNd16Pseudo_UPD:
4589 case ARM::VLD4LNd32Pseudo_UPD:
4590 case ARM::VLD4LNq16Pseudo_UPD:
4591 case ARM::VLD4LNq32Pseudo_UPD:
4611 if (MCID.isCall() || (MCID.hasImplicitDefOfPhysReg(ARM::CPSR) &&
4634 if (I->getOpcode() != ARM::t2IT)
4641 if (PredCost && (MCID.isCall() || (MCID.hasImplicitDefOfPhysReg(ARM::CPSR) &&
4683 case ARM::VLDMQIA:
4684 case ARM::VSTMQIA:
4732 if (MI.getOpcode() == ARM::tMOVr && !Subtarget.hasV6Ops()) {
4734 if (!ARM::hGPRRegClass.contains(MI.getOperand(0).getReg()) &&
4735 !ARM::hGPRRegClass.contains(MI.getOperand(1).getReg())) {
4740 if (MI.getOpcode() == ARM::tPUSH ||
4741 MI.getOpcode() == ARM::tPOP ||
4742 MI.getOpcode() == ARM::tPOP_RET) {
4748 if (Reg < ARM::R0 || Reg > ARM::R7) {
4749 if (!(MI.getOpcode() == ARM::tPUSH && Reg == ARM::LR) &&
4750 !(MI.getOpcode() == ARM::tPOP_RET && Reg == ARM::PC)) {
4839 if (MI.getOpcode() == ARM::VMOVD && !isPredicated(MI))
4845 (MI.getOpcode() == ARM::VMOVRS || MI.getOpcode() == ARM::VMOVSR ||
4846 MI.getOpcode() == ARM::VMOVS))
4868 unsigned DReg = TRI->getMatchingSuperReg(SReg, ARM::ssub_0, &ARM::DPRRegClass);
4871 if (DReg != ARM::NoRegister)
4875 DReg = TRI->getMatchingSuperReg(SReg, ARM::ssub_1, &ARM::DPRRegClass);
4908 (Lane & 1) ? ARM::ssub_0 : ARM::ssub_1);
4933 case ARM::VMOVD:
4951 MI.setDesc(get(ARM::VORRd));
4957 case ARM::VMOVRS:
4974 MI.setDesc(get(ARM::VGETLNi32));
4984 case ARM::VMOVSR: {
5004 MI.setDesc(get(ARM::VSETLNi32));
5018 case ARM::VMOVS: {
5040 MI.setDesc(get(ARM::VDUPLN32d));
5068 NewMIB = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), get(ARM::VEXTd32),
5087 MI.setDesc(get(ARM::VEXTd32));
5148 case ARM::VLDRS:
5149 case ARM::FCONSTS:
5150 case ARM::VMOVSR:
5151 case ARM::VMOVv8i8:
5152 case ARM::VMOVv4i16:
5153 case ARM::VMOVv2i32:
5154 case ARM::VMOVv2f32:
5155 case ARM::VMOVv1i64:
5160 case ARM::VLD1LNd32:
5177 } else if (ARM::SPRRegClass.contains(Reg)) {
5179 unsigned DReg = TRI->getMatchingSuperReg(Reg, ARM::ssub_0,
5180 &ARM::DPRRegClass);
5204 if (ARM::SPRRegClass.contains(Reg)) {
5205 DReg = ARM::D0 + (Reg - ARM::S0) / 2;
5209 assert(ARM::DPRRegClass.contains(DReg) && "Can only break D-reg deps");
5220 BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), get(ARM::FCONSTD), DReg)
5227 return Subtarget.getFeatureBits()[ARM::HasV6KOps];
5251 case ARM::VMOVDRR:
5260 MOReg->getSubReg(), ARM::ssub_0));
5265 MOReg->getSubReg(), ARM::ssub_1));
5278 case ARM::VMOVRRD:
5288 InputReg.SubIdx = DefIdx == 0 ? ARM::ssub_0 : ARM::ssub_1;
5301 case ARM::VSETLNi32:
5313 InsertedReg.SubIdx = MOIndex.getImm() == 0 ? ARM::ssub_0 : ARM::ssub_1;
5360 if (Opcode == ARM::SUBri)
5362 else if (Opcode != ARM::ADDri)
5394 if (CmpMI->modifiesRegister(ARM::CPSR, TRI))
5396 if (CmpMI->readsRegister(ARM::CPSR, TRI))
5402 if (CmpMI->getOpcode() != ARM::tCMPi8 && CmpMI->getOpcode() != ARM::t2CMPri)