Lines Matching full:arm
1 //===-- ARMBaseInstrInfo.cpp - ARM Instruction Information ----------------===//
10 // This file contains the Base ARM implementation of the TargetInstrInfo class.
15 #include "ARM.h"
45 EnableARM3Addr("enable-arm-3-addr-conv", cl::Hidden,
46 cl::desc("Enable ARM 2-addr to 3-addr conv"));
50 cl::desc("Widen ARM vmovs to vmovd when possible"));
69 { ARM::VMLAS, ARM::VMULS, ARM::VADDS, false, false },
70 { ARM::VMLSS, ARM::VMULS, ARM::VSUBS, false, false },
71 { ARM::VMLAD, ARM::VMULD, ARM::VADDD, false, false },
72 { ARM::VMLSD, ARM::VMULD, ARM::VSUBD, false, false },
73 { ARM::VNMLAS, ARM::VNMULS, ARM::VSUBS, true, false },
74 { ARM::VNMLSS, ARM::VMULS, ARM::VSUBS, true, false },
75 { ARM::VNMLAD, ARM::VNMULD, ARM::VSUBD, true, false },
76 { ARM::VNMLSD, ARM::VMULD, ARM::VSUBD, true, false },
79 { ARM::VMLAfd, ARM::VMULfd, ARM::VADDfd, false, false },
80 { ARM::VMLSfd, ARM::VMULfd, ARM::VSUBfd, false, false },
81 { ARM::VMLAfq, ARM::VMULfq, ARM::VADDfq, false, false },
82 { ARM::VMLSfq, ARM::VMULfq, ARM::VSUBfq, false, false },
83 { ARM::VMLAslfd, ARM::VMULslfd, ARM::VADDfd, false, true },
84 { ARM::VMLSslfd, ARM::VMULslfd, ARM::VSUBfd, false, true },
85 { ARM::VMLAslfq, ARM::VMULslfq, ARM::VADDfq, false, true },
86 { ARM::VMLSslfq, ARM::VMULslfq, ARM::VSUBfq, false, true },
90 : ARMGenInstrInfo(ARM::ADJCALLSTACKDOWN, ARM::ADJCALLSTACKUP),
100 // Use a ScoreboardHazardRecognizer for prepass ARM scheduling. TargetInstrImpl
173 get(isSub ? ARM::SUBri : ARM::ADDri), WBReg)
180 get(isSub ? ARM::SUBrsi : ARM::ADDrsi), WBReg)
185 get(isSub ? ARM::SUBrr : ARM::ADDrr), WBReg)
196 get(isSub ? ARM::SUBri : ARM::ADDri), WBReg)
201 get(isSub ? ARM::SUBrr : ARM::ADDrr), WBReg)
397 ? ARM::B : (AFI->isThumb2Function() ? ARM::t2B : ARM::tB);
399 ? ARM::Bcc : (AFI->isThumb2Function() ? ARM::t2Bcc : ARM::tBcc);
405 "ARM branch conditions have two components!");
506 if ((MO.isRegMask() && MO.clobbersPhysReg(ARM::CPSR)) ||
507 (MO.isReg() && MO.isDef() && MO.getReg() == ARM::CPSR)) {
553 if (MI->getOpcode() == ARM::INLINEASM)
567 case ARM::MOVi16_ga_pcrel:
568 case ARM::MOVTi16_ga_pcrel:
569 case ARM::t2MOVi16_ga_pcrel:
570 case ARM::t2MOVTi16_ga_pcrel:
572 case ARM::MOVi32imm:
573 case ARM::t2MOVi32imm:
575 case ARM::CONSTPOOL_ENTRY:
579 case ARM::Int_eh_sjlj_longjmp:
581 case ARM::tInt_eh_sjlj_longjmp:
583 case ARM::Int_eh_sjlj_setjmp:
584 case ARM::Int_eh_sjlj_setjmp_nofp:
586 case ARM::tInt_eh_sjlj_setjmp:
587 case ARM::t2Int_eh_sjlj_setjmp:
588 case ARM::t2Int_eh_sjlj_setjmp_nofp:
590 case ARM::BR_JTr:
591 case ARM::BR_JTm:
592 case ARM::BR_JTadd:
593 case ARM::tBR_JTr:
594 case ARM::t2BR_JT:
595 case ARM::t2TBB_JT:
596 case ARM::t2TBH_JT: {
600 unsigned EntrySize = (Opc == ARM::t2TBB_JT)
601 ? 1 : ((Opc == ARM::t2TBH_JT) ? 2 : 4);
617 unsigned InstSize = (Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT) ? 2 : 4;
619 if (Opc == ARM::t2TBB_JT && (NumEntries & 1))
647 bool GPRDest = ARM::GPRRegClass.contains(DestReg);
648 bool GPRSrc = ARM::GPRRegClass.contains(SrcReg);
651 AddDefaultCC(AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::MOVr), DestReg)
656 bool SPRDest = ARM::SPRRegClass.contains(DestReg);
657 bool SPRSrc = ARM::SPRRegClass.contains(SrcReg);
661 Opc = ARM::VMOVS;
663 Opc = ARM::VMOVRS;
665 Opc = ARM::VMOVSR;
666 else if (ARM::DPRRegClass.contains(DestReg, SrcReg))
667 Opc = ARM::VMOVD;
668 else if (ARM::QPRRegClass.contains(DestReg, SrcReg))
669 Opc = ARM::VORRq;
674 if (Opc == ARM::VORRq)
686 if (ARM::QQPRRegClass.contains(DestReg, SrcReg))
687 Opc = ARM::VORRq, BeginIdx = ARM::qsub_0, SubRegs = 2;
688 else if (ARM::QQQQPRRegClass.contains(DestReg, SrcReg))
689 Opc = ARM::VORRq, BeginIdx = ARM::qsub_0, SubRegs = 4;
691 else if (ARM::DPairRegClass.contains(DestReg, SrcReg))
692 Opc = ARM::VMOVD, BeginIdx = ARM::dsub_0, SubRegs = 2;
693 else if (ARM::DTripleRegClass.contains(DestReg, SrcReg))
694 Opc = ARM::VMOVD, BeginIdx = ARM::dsub_0, SubRegs = 3;
695 else if (ARM::DQuadRegClass.contains(DestReg, SrcReg))
696 Opc = ARM::VMOVD, BeginIdx = ARM::dsub_0, SubRegs = 4;
697 else if (ARM::GPRPairRegClass.contains(DestReg, SrcReg))
698 Opc = ARM::MOVr, BeginIdx = ARM::gsub_0, SubRegs = 2;
700 else if (ARM::DPairSpcRegClass.contains(DestReg, SrcReg))
701 Opc = ARM::VMOVD, BeginIdx = ARM::dsub_0, SubRegs = 2, Spacing = 2;
702 else if (ARM::DTripleSpcRegClass.contains(DestReg, SrcReg))
703 Opc = ARM::VMOVD, BeginIdx = ARM::dsub_0, SubRegs = 3, Spacing = 2;
704 else if (ARM::DQuadSpcRegClass.contains(DestReg, SrcReg))
705 Opc = ARM::VMOVD, BeginIdx = ARM::dsub_0, SubRegs = 4, Spacing = 2;
731 if (Opc == ARM::VORRq)
735 if (Opc == ARM::MOVr)
775 if (ARM::GPRRegClass.hasSubClassEq(RC)) {
776 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::STRi12))
779 } else if (ARM::SPRRegClass.hasSubClassEq(RC)) {
780 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTRS))
787 if (ARM::DPRRegClass.hasSubClassEq(RC)) {
788 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTRD))
791 } else if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
793 MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::STRD));
794 AddDReg(MIB, SrcReg, ARM::gsub_0, getKillRegState(isKill), TRI);
795 AddDReg(MIB, SrcReg, ARM::gsub_1, 0, TRI);
803 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::STMIA))
805 AddDReg(MIB, SrcReg, ARM::gsub_0, getKillRegState(isKill), TRI);
806 AddDReg(MIB, SrcReg, ARM::gsub_1, 0, TRI);
812 if (ARM::DPairRegClass.hasSubClassEq(RC)) {
815 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1q64))
820 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTMQIA))
829 if (ARM::DTripleRegClass.hasSubClassEq(RC)) {
832 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1d64TPseudo))
838 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTMDIA))
841 MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
842 MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
843 AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
849 if (ARM::QQPRRegClass.hasSubClassEq(RC) || ARM::DQuadRegClass.hasSubClassEq(RC)) {
853 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1d64QPseudo))
859 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTMDIA))
862 MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
863 MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
864 MIB = AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
865 AddDReg(MIB, SrcReg, ARM::dsub_3, 0, TRI);
871 if (ARM::QQQQPRRegClass.hasSubClassEq(RC)) {
873 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTMDIA))
876 MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
877 MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
878 MIB = AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
879 MIB = AddDReg(MIB, SrcReg, ARM::dsub_3, 0, TRI);
880 MIB = AddDReg(MIB, SrcReg, ARM::dsub_4, 0, TRI);
881 MIB = AddDReg(MIB, SrcReg, ARM::dsub_5, 0, TRI);
882 MIB = AddDReg(MIB, SrcReg, ARM::dsub_6, 0, TRI);
883 AddDReg(MIB, SrcReg, ARM::dsub_7, 0, TRI);
897 case ARM::STRrs:
898 case ARM::t2STRs: // FIXME: don't use t2STRs to access frame.
908 case ARM::STRi12:
909 case ARM::t2STRi12:
910 case ARM::tSTRspi:
911 case ARM::VSTRD:
912 case ARM::VSTRS:
920 case ARM::VST1q64:
921 case ARM::VST1d64TPseudo:
922 case ARM::VST1d64QPseudo:
929 case ARM::VSTMQIA:
966 if (ARM::GPRRegClass.hasSubClassEq(RC)) {
967 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::LDRi12), DestReg)
970 } else if (ARM::SPRRegClass.hasSubClassEq(RC)) {
971 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDRS), DestReg)
977 if (ARM::DPRRegClass.hasSubClassEq(RC)) {
978 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDRD), DestReg)
980 } else if (ARM::GPRPairRegClass.hasSubClassEq(RC)) {
984 MIB = BuildMI(MBB, I, DL, get(ARM::LDRD));
985 AddDReg(MIB, DestReg, ARM::gsub_0, RegState::DefineNoRead, TRI);
986 AddDReg(MIB, DestReg, ARM::gsub_1, RegState::DefineNoRead, TRI);
993 MIB = AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::LDMIA))
995 MIB = AddDReg(MIB, DestReg, ARM::gsub_0, RegState::DefineNoRead, TRI);
996 MIB = AddDReg(MIB, DestReg, ARM::gsub_1, RegState::DefineNoRead, TRI);
1005 if (ARM::DPairRegClass.hasSubClassEq(RC)) {
1007 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1q64), DestReg)
1011 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDMQIA), DestReg)
1019 if (ARM::DTripleRegClass.hasSubClassEq(RC)) {
1021 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1d64TPseudo), DestReg)
1026 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDMDIA))
1029 MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::DefineNoRead, TRI);
1030 MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::DefineNoRead, TRI);
1031 MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::DefineNoRead, TRI);
1039 if (ARM::QQPRRegClass.hasSubClassEq(RC) || ARM::DQuadRegClass.hasSubClassEq(RC)) {
1041 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1d64QPseudo), DestReg)
1046 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDMDIA))
1049 MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::DefineNoRead, TRI);
1050 MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::DefineNoRead, TRI);
1051 MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::DefineNoRead, TRI);
1052 MIB = AddDReg(MIB, DestReg, ARM::dsub_3, RegState::DefineNoRead, TRI);
1060 if (ARM::QQQQPRRegClass.hasSubClassEq(RC)) {
1062 AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDMDIA))
1065 MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::DefineNoRead, TRI);
1066 MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::DefineNoRead, TRI);
1067 MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::DefineNoRead, TRI);
1068 MIB = AddDReg(MIB, DestReg, ARM::dsub_3, RegState::DefineNoRead, TRI);
1069 MIB = AddDReg(MIB, DestReg, ARM::dsub_4, RegState::DefineNoRead, TRI);
1070 MIB = AddDReg(MIB, DestReg, ARM::dsub_5, RegState::DefineNoRead, TRI);
1071 MIB = AddDReg(MIB, DestReg, ARM::dsub_6, RegState::DefineNoRead, TRI);
1072 MIB = AddDReg(MIB, DestReg, ARM::dsub_7, RegState::DefineNoRead, TRI);
1088 case ARM::LDRrs:
1089 case ARM::t2LDRs: // FIXME: don't use t2LDRs to access frame.
1099 case ARM::LDRi12:
1100 case ARM::t2LDRi12:
1101 case ARM::tLDRspi:
1102 case ARM::VLDRD:
1103 case ARM::VLDRS:
1111 case ARM::VLD1q64:
1112 case ARM::VLD1d64TPseudo:
1113 case ARM::VLD1d64QPseudo:
1120 case ARM::VLDMQIA:
1150 if (!ARM::SPRRegClass.contains(DstRegS, SrcRegS))
1154 unsigned DstRegD = TRI->getMatchingSuperReg(DstRegS, ARM::ssub_0,
1155 &ARM::DPRRegClass);
1156 unsigned SrcRegD = TRI->getMatchingSuperReg(SrcRegS, ARM::ssub_0,
1157 &ARM::DPRRegClass);
1182 MI->setDesc(get(ARM::VMOVD));
1220 // is Thumb mode (t1 or t2). PCAdjustment would be 8 for ARM mode PIC, and
1221 // zero for non-PIC in ARM or Thumb. The callers are all of thumb LDR
1244 llvm_unreachable("Unexpected ARM constantpool value type!!");
1263 case ARM::tLDRpci_pic:
1264 case ARM::t2LDRpci_pic: {
1281 case ARM::tLDRpci_pic:
1282 case ARM::t2LDRpci_pic: {
1297 if (Opcode == ARM::t2LDRpci ||
1298 Opcode == ARM::t2LDRpci_pic ||
1299 Opcode == ARM::tLDRpci ||
1300 Opcode == ARM::tLDRpci_pic ||
1301 Opcode == ARM::MOV_ga_dyn ||
1302 Opcode == ARM::MOV_ga_pcrel ||
1303 Opcode == ARM::MOV_ga_pcrel_ldr ||
1304 Opcode == ARM::t2MOV_ga_dyn ||
1305 Opcode == ARM::t2MOV_ga_pcrel) {
1316 if (Opcode == ARM::MOV_ga_dyn ||
1317 ARM::MOV_ga_pcrel ||
1318 Opcode == ARM::MOV_ga_pcrel_ldr ||
1319 Opcode == ARM::t2MOV_ga_dyn ||
1320 Opcode == ARM::t2MOV_ga_pcrel)
1342 } else if (Opcode == ARM::PICLDR) {
1389 // Don't worry about Thumb: just ARM and Thumb2.
1398 case ARM::LDRi12:
1399 case ARM::LDRBi12:
1400 case ARM::LDRD:
1401 case ARM::LDRH:
1402 case ARM::LDRSB:
1403 case ARM::LDRSH:
1404 case ARM::VLDRD:
1405 case ARM::VLDRS:
1406 case ARM::t2LDRi8:
1407 case ARM::t2LDRDi8:
1408 case ARM::t2LDRSHi8:
1409 case ARM::t2LDRi12:
1410 case ARM::t2LDRSHi12:
1417 case ARM::LDRi12:
1418 case ARM::LDRBi12:
1419 case ARM::LDRD:
1420 case ARM::LDRH:
1421 case ARM::LDRSB:
1422 case ARM::LDRSH:
1423 case ARM::VLDRD:
1424 case ARM::VLDRS:
1425 case ARM::t2LDRi8:
1426 case ARM::t2LDRSHi8:
1427 case ARM::t2LDRi12:
1428 case ARM::t2LDRSHi12:
1466 // Don't worry about Thumb: just ARM and Thumb2.
1510 if (I != MBB->end() && I->getOpcode() == ARM::t2IT)
1519 // No ARM calling conventions change the stack pointer. (X86 calling
1521 if (!MI->isCall() && MI->definesRegister(ARM::SP))
1592 if (Opc == ARM::B)
1593 return ARM::Bcc;
1594 if (Opc == ARM::tB)
1595 return ARM::tBcc;
1596 if (Opc == ARM::t2B)
1597 return ARM::t2Bcc;
1606 case ARM::MOVCCr:
1607 case ARM::t2MOVCCr: {
1612 if (CC == ARMCC::AL || PredReg != ARM::CPSR)
1668 assert((MI->getOpcode() == ARM::MOVCCr || MI->getOpcode() == ARM::t2MOVCCr) &&
1687 assert((MI->getOpcode() == ARM::MOVCCr || MI->getOpcode() == ARM::t2MOVCCr) &&
1746 {ARM::ADDSri, ARM::ADDri},
1747 {ARM::ADDSrr, ARM::ADDrr},
1748 {ARM::ADDSrsi, ARM::ADDrsi},
1749 {ARM::ADDSrsr, ARM::ADDrsr},
1751 {ARM::SUBSri, ARM::SUBri},
1752 {ARM::SUBSrr, ARM::SUBrr},
1753 {ARM::SUBSrsi, ARM::SUBrsi},
1754 {ARM::SUBSrsr, ARM::SUBrsr},
1756 {ARM::RSBSri, ARM::RSBri},
1757 {ARM::RSBSrsi, ARM::RSBrsi},
1758 {ARM::RSBSrsr, ARM::RSBrsr},
1760 {ARM::t2ADDSri, ARM::t2ADDri},
1761 {ARM::t2ADDSrr, ARM::t2ADDrr},
1762 {ARM::t2ADDSrs, ARM::t2ADDrs},
1764 {ARM::t2SUBSri, ARM::t2SUBri},
1765 {ARM::t2SUBSrr, ARM::t2SUBrr},
1766 {ARM::t2SUBSrs, ARM::t2SUBrs},
1768 {ARM::t2RSBSri, ARM::t2RSBri},
1769 {ARM::t2RSBSrs, ARM::t2RSBrs},
1798 unsigned Opc = isSub ? ARM::SUBri : ARM::ADDri;
1816 if (Opcode == ARM::INLINEASM)
1819 if (Opcode == ARM::ADDri) {
1823 MI.setDesc(TII.get(ARM::MOVr));
1831 MI.setDesc(TII.get(ARM::SUBri));
1956 case ARM::CMPri:
1957 case ARM::t2CMPri:
1963 case ARM::CMPrr:
1964 case ARM::t2CMPrr:
1970 case ARM::TSTri:
1971 case ARM::t2TSTri:
1989 case ARM::ANDri:
1990 case ARM::t2ANDri:
1996 case ARM::COPY: {
2038 if ((CmpI->getOpcode() == ARM::CMPrr ||
2039 CmpI->getOpcode() == ARM::t2CMPrr) &&
2040 (OI->getOpcode() == ARM::SUBrr ||
2041 OI->getOpcode() == ARM::t2SUBrr) &&
2048 if ((CmpI->getOpcode() == ARM::CMPri ||
2049 CmpI->getOpcode() == ARM::t2CMPri) &&
2050 (OI->getOpcode() == ARM::SUBri ||
2051 OI->getOpcode() == ARM::t2SUBri) &&
2110 if (CmpInstr->getOpcode() == ARM::CMPri ||
2111 CmpInstr->getOpcode() == ARM::t2CMPri)
2124 if (Instr.modifiesRegister(ARM::CPSR, TRI) ||
2125 Instr.readsRegister(ARM::CPSR, TRI))
2154 case ARM::RSBrr:
2155 case ARM::RSBri:
2156 case ARM::RSCrr:
2157 case ARM::RSCri:
2158 case ARM::ADDrr:
2159 case ARM::ADDri:
2160 case ARM::ADCrr:
2161 case ARM::ADCri:
2162 case ARM::SUBrr:
2163 case ARM::SUBri:
2164 case ARM::SBCrr:
2165 case ARM::SBCri:
2166 case ARM::t2RSBri:
2167 case ARM::t2ADDrr:
2168 case ARM::t2ADDri:
2169 case ARM::t2ADCrr:
2170 case ARM::t2ADCri:
2171 case ARM::t2SUBrr:
2172 case ARM::t2SUBri:
2173 case ARM::t2SBCrr:
2174 case ARM::t2SBCri:
2175 case ARM::ANDrr:
2176 case ARM::ANDri:
2177 case ARM::t2ANDrr:
2178 case ARM::t2ANDri:
2179 case ARM::ORRrr:
2180 case ARM::ORRri:
2181 case ARM::t2ORRrr:
2182 case ARM::t2ORRri:
2183 case ARM::EORrr:
2184 case ARM::EORri:
2185 case ARM::t2EORrr:
2186 case ARM::t2EORri: {
2203 if (MO.isRegMask() && MO.clobbersPhysReg(ARM::CPSR)) {
2207 if (!MO.isReg() || MO.getReg() != ARM::CPSR)
2251 if ((*SI)->isLiveIn(ARM::CPSR))
2256 MI->getOperand(5).setReg(ARM::CPSR);
2278 if (DefOpc != ARM::t2MOVi32imm && DefOpc != ARM::MOVi32imm)
2291 if (MO.getReg() == ARM::CPSR && !MO.isDead())
2300 if (UseMI->getOperand(NumOps-1).getReg() == ARM::CPSR)
2313 case ARM::SUBrr:
2314 case ARM::ADDrr:
2315 case ARM::ORRrr:
2316 case ARM::EORrr:
2317 case ARM::t2SUBrr:
2318 case ARM::t2ADDrr:
2319 case ARM::t2ORRrr:
2320 case ARM::t2EORrr: {
2324 case ARM::SUBrr: {
2328 NewUseOpc = ARM::SUBri;
2331 case ARM::ADDrr:
2332 case ARM::ORRrr:
2333 case ARM::EORrr: {
2340 case ARM::ADDrr: NewUseOpc = ARM::ADDri; break;
2341 case ARM::ORRrr: NewUseOpc = ARM::ORRri; break;
2342 case ARM::EORrr: NewUseOpc = ARM::EORri; break;
2346 case ARM::t2SUBrr: {
2350 NewUseOpc = ARM::t2SUBri;
2353 case ARM::t2ADDrr:
2354 case ARM::t2ORRrr:
2355 case ARM::t2EORrr: {
2362 case ARM::t2ADDrr: NewUseOpc = ARM::t2ADDri; break;
2363 case ARM::t2ORRrr: NewUseOpc = ARM::t2ORRri; break;
2364 case ARM::t2EORrr: NewUseOpc = ARM::t2EORri; break;
2399 case ARM::LDRrs:
2400 case ARM::LDRBrs:
2401 case ARM::STRrs:
2402 case ARM::STRBrs: {
2414 case ARM::LDRH:
2415 case ARM::STRH: {
2430 case ARM::LDRSB:
2431 case ARM::LDRSH:
2434 case ARM::LDRSB_POST:
2435 case ARM::LDRSH_POST: {
2441 case ARM::LDR_PRE_REG:
2442 case ARM::LDRB_PRE_REG: {
2458 case ARM::STR_PRE_REG:
2459 case ARM::STRB_PRE_REG: {
2471 case ARM::LDRH_PRE:
2472 case ARM::STRH_PRE: {
2483 case ARM::LDR_POST_REG:
2484 case ARM::LDRB_POST_REG:
2485 case ARM::LDRH_POST: {
2491 case ARM::LDR_PRE_IMM:
2492 case ARM::LDRB_PRE_IMM:
2493 case ARM::LDR_POST_IMM:
2494 case ARM::LDRB_POST_IMM:
2495 case ARM::STRB_POST_IMM:
2496 case ARM::STRB_POST_REG:
2497 case ARM::STRB_PRE_IMM:
2498 case ARM::STRH_POST:
2499 case ARM::STR_POST_IMM:
2500 case ARM::STR_POST_REG:
2501 case ARM::STR_PRE_IMM:
2504 case ARM::LDRSB_PRE:
2505 case ARM::LDRSH_PRE: {
2523 case ARM::LDRD: {
2532 case ARM::STRD: {
2539 case ARM::LDRD_POST:
2540 case ARM::t2LDRD_POST:
2543 case ARM::STRD_POST:
2544 case ARM::t2STRD_POST:
2547 case ARM::LDRD_PRE: {
2556 case ARM::t2LDRD_PRE: {
2562 case ARM::STRD_PRE: {
2569 case ARM::t2STRD_PRE:
2572 case ARM::t2LDR_POST:
2573 case ARM::t2LDRB_POST:
2574 case ARM::t2LDRB_PRE:
2575 case ARM::t2LDRSBi12:
2576 case ARM::t2LDRSBi8:
2577 case ARM::t2LDRSBpci:
2578 case ARM::t2LDRSBs:
2579 case ARM::t2LDRH_POST:
2580 case ARM::t2LDRH_PRE:
2581 case ARM::t2LDRSBT:
2582 case ARM::t2LDRSB_POST:
2583 case ARM::t2LDRSB_PRE:
2584 case ARM::t2LDRSH_POST:
2585 case ARM::t2LDRSH_PRE:
2586 case ARM::t2LDRSHi12:
2587 case ARM::t2LDRSHi8:
2588 case ARM::t2LDRSHpci:
2589 case ARM::t2LDRSHs:
2592 case ARM::t2LDRDi8: {
2598 case ARM::t2STRB_POST:
2599 case ARM::t2STRB_PRE:
2600 case ARM::t2STRBs:
2601 case ARM::t2STRDi8:
2602 case ARM::t2STRH_POST:
2603 case ARM::t2STRH_PRE:
2604 case ARM::t2STRHs:
2605 case ARM::t2STR_POST:
2606 case ARM::t2STR_PRE:
2607 case ARM::t2STRs:
2663 case ARM::VLDMQIA:
2664 case ARM::VSTMQIA:
2677 case ARM::VLDMDIA:
2678 case ARM::VLDMDIA_UPD:
2679 case ARM::VLDMDDB_UPD:
2680 case ARM::VLDMSIA:
2681 case ARM::VLDMSIA_UPD:
2682 case ARM::VLDMSDB_UPD:
2683 case ARM::VSTMDIA:
2684 case ARM::VSTMDIA_UPD:
2685 case ARM::VSTMDDB_UPD:
2686 case ARM::VSTMSIA:
2687 case ARM::VSTMSIA_UPD:
2688 case ARM::VSTMSDB_UPD: {
2693 case ARM::LDMIA_RET:
2694 case ARM::LDMIA:
2695 case ARM::LDMDA:
2696 case ARM::LDMDB:
2697 case ARM::LDMIB:
2698 case ARM::LDMIA_UPD:
2699 case ARM::LDMDA_UPD:
2700 case ARM::LDMDB_UPD:
2701 case ARM::LDMIB_UPD:
2702 case ARM::STMIA:
2703 case ARM::STMDA:
2704 case ARM::STMDB:
2705 case ARM::STMIB:
2706 case ARM::STMIA_UPD:
2707 case ARM::STMDA_UPD:
2708 case ARM::STMDB_UPD:
2709 case ARM::STMIB_UPD:
2710 case ARM::tLDMIA:
2711 case ARM::tLDMIA_UPD:
2712 case ARM::tSTMIA_UPD:
2713 case ARM::tPOP_RET:
2714 case ARM::tPOP:
2715 case ARM::tPUSH:
2716 case ARM::t2LDMIA_RET:
2717 case ARM::t2LDMIA:
2718 case ARM::t2LDMDB:
2719 case ARM::t2LDMIA_UPD:
2720 case ARM::t2LDMDB_UPD:
2721 case ARM::t2STMIA:
2722 case ARM::t2STMDB:
2723 case ARM::t2STMIA_UPD:
2724 case ARM::t2STMDB_UPD: {
2730 case ARM::VLDMDIA_UPD:
2731 case ARM::VLDMDDB_UPD:
2732 case ARM::VLDMSIA_UPD:
2733 case ARM::VLDMSDB_UPD:
2734 case ARM::VSTMDIA_UPD:
2735 case ARM::VSTMDDB_UPD:
2736 case ARM::VSTMSIA_UPD:
2737 case ARM::VSTMSDB_UPD:
2738 case ARM::LDMIA_UPD:
2739 case ARM::LDMDA_UPD:
2740 case ARM::LDMDB_UPD:
2741 case ARM::LDMIB_UPD:
2742 case ARM::STMIA_UPD:
2743 case ARM::STMDA_UPD:
2744 case ARM::STMDB_UPD:
2745 case ARM::STMIB_UPD:
2746 case ARM::tLDMIA_UPD:
2747 case ARM::tSTMIA_UPD:
2748 case ARM::t2LDMIA_UPD:
2749 case ARM::t2LDMDB_UPD:
2750 case ARM::t2STMIA_UPD:
2751 case ARM::t2STMDB_UPD:
2754 case ARM::LDMIA_RET:
2755 case ARM::tPOP_RET:
2756 case ARM::t2LDMIA_RET:
2809 case ARM::VLDMSIA:
2810 case ARM::VLDMSIA_UPD:
2811 case ARM::VLDMSDB_UPD:
2884 case ARM::VSTMSIA:
2885 case ARM::VSTMSIA_UPD:
2886 case ARM::VSTMSDB_UPD:
2954 case ARM::VLDMDIA:
2955 case ARM::VLDMDIA_UPD:
2956 case ARM::VLDMDDB_UPD:
2957 case ARM::VLDMSIA:
2958 case ARM::VLDMSIA_UPD:
2959 case ARM::VLDMSDB_UPD:
2963 case ARM::LDMIA_RET:
2964 case ARM::LDMIA:
2965 case ARM::LDMDA:
2966 case ARM::LDMDB:
2967 case ARM::LDMIB:
2968 case ARM::LDMIA_UPD:
2969 case ARM::LDMDA_UPD:
2970 case ARM::LDMDB_UPD:
2971 case ARM::LDMIB_UPD:
2972 case ARM::tLDMIA:
2973 case ARM::tLDMIA_UPD:
2974 case ARM::tPUSH:
2975 case ARM::t2LDMIA_RET:
2976 case ARM::t2LDMIA:
2977 case ARM::t2LDMDB:
2978 case ARM::t2LDMIA_UPD:
2979 case ARM::t2LDMDB_UPD:
2995 case ARM::VSTMDIA:
2996 case ARM::VSTMDIA_UPD:
2997 case ARM::VSTMDDB_UPD:
2998 case ARM::VSTMSIA:
2999 case ARM::VSTMSIA_UPD:
3000 case ARM::VSTMSDB_UPD:
3004 case ARM::STMIA:
3005 case ARM::STMDA:
3006 case ARM::STMDB:
3007 case ARM::STMIB:
3008 case ARM::STMIA_UPD:
3009 case ARM::STMDA_UPD:
3010 case ARM::STMDB_UPD:
3011 case ARM::STMIB_UPD:
3012 case ARM::tSTMIA_UPD:
3013 case ARM::tPOP_RET:
3014 case ARM::tPOP:
3015 case ARM::t2STMIA:
3016 case ARM::t2STMDB:
3017 case ARM::t2STMIA_UPD:
3018 case ARM::t2STMDB_UPD:
3083 if (II->getOpcode() != ARM::t2IT)
3109 case ARM::LDRrs:
3110 case ARM::LDRBrs: {
3118 case ARM::t2LDRs:
3119 case ARM::t2LDRBs:
3120 case ARM::t2LDRHs:
3121 case ARM::t2LDRSHs: {
3134 case ARM::LDRrs:
3135 case ARM::LDRBrs: {
3149 case ARM::t2LDRs:
3150 case ARM::t2LDRBs:
3151 case ARM::t2LDRHs:
3152 case ARM::t2LDRSHs: {
3165 case ARM::VLD1q8:
3166 case ARM::VLD1q16:
3167 case ARM::VLD1q32:
3168 case ARM::VLD1q64:
3169 case ARM::VLD1q8wb_fixed:
3170 case ARM::VLD1q16wb_fixed:
3171 case ARM::VLD1q32wb_fixed:
3172 case ARM::VLD1q64wb_fixed:
3173 case ARM::VLD1q8wb_register:
3174 case ARM::VLD1q16wb_register:
3175 case ARM::VLD1q32wb_register:
3176 case ARM::VLD1q64wb_register:
3177 case ARM::VLD2d8:
3178 case ARM::VLD2d16:
3179 case ARM::VLD2d32:
3180 case ARM::VLD2q8:
3181 case ARM::VLD2q16:
3182 case ARM::VLD2q32:
3183 case ARM::VLD2d8wb_fixed:
3184 case ARM::VLD2d16wb_fixed:
3185 case ARM::VLD2d32wb_fixed:
3186 case ARM::VLD2q8wb_fixed:
3187 case ARM::VLD2q16wb_fixed:
3188 case ARM::VLD2q32wb_fixed:
3189 case ARM::VLD2d8wb_register:
3190 case ARM::VLD2d16wb_register:
3191 case ARM::VLD2d32wb_register:
3192 case ARM::VLD2q8wb_register:
3193 case ARM::VLD2q16wb_register:
3194 case ARM::VLD2q32wb_register:
3195 case ARM::VLD3d8:
3196 case ARM::VLD3d16:
3197 case ARM::VLD3d32:
3198 case ARM::VLD1d64T:
3199 case ARM::VLD3d8_UPD:
3200 case ARM::VLD3d16_UPD:
3201 case ARM::VLD3d32_UPD:
3202 case ARM::VLD1d64Twb_fixed:
3203 case ARM::VLD1d64Twb_register:
3204 case ARM::VLD3q8_UPD:
3205 case ARM::VLD3q16_UPD:
3206 case ARM::VLD3q32_UPD:
3207 case ARM::VLD4d8:
3208 case ARM::VLD4d16:
3209 case ARM::VLD4d32:
3210 case ARM::VLD1d64Q:
3211 case ARM::VLD4d8_UPD:
3212 case ARM::VLD4d16_UPD:
3213 case ARM::VLD4d32_UPD:
3214 case ARM::VLD1d64Qwb_fixed:
3215 case ARM::VLD1d64Qwb_register:
3216 case ARM::VLD4q8_UPD:
3217 case ARM::VLD4q16_UPD:
3218 case ARM::VLD4q32_UPD:
3219 case ARM::VLD1DUPq8:
3220 case ARM::VLD1DUPq16:
3221 case ARM::VLD1DUPq32:
3222 case ARM::VLD1DUPq8wb_fixed:
3223 case ARM::VLD1DUPq16wb_fixed:
3224 case ARM::VLD1DUPq32wb_fixed:
3225 case ARM::VLD1DUPq8wb_register:
3226 case ARM::VLD1DUPq16wb_register:
3227 case ARM::VLD1DUPq32wb_register:
3228 case ARM::VLD2DUPd8:
3229 case ARM::VLD2DUPd16:
3230 case ARM::VLD2DUPd32:
3231 case ARM::VLD2DUPd8wb_fixed:
3232 case ARM::VLD2DUPd16wb_fixed:
3233 case ARM::VLD2DUPd32wb_fixed:
3234 case ARM::VLD2DUPd8wb_register:
3235 case ARM::VLD2DUPd16wb_register:
3236 case ARM::VLD2DUPd32wb_register:
3237 case ARM::VLD4DUPd8:
3238 case ARM::VLD4DUPd16:
3239 case ARM::VLD4DUPd32:
3240 case ARM::VLD4DUPd8_UPD:
3241 case ARM::VLD4DUPd16_UPD:
3242 case ARM::VLD4DUPd32_UPD:
3243 case ARM::VLD1LNd8:
3244 case ARM::VLD1LNd16:
3245 case ARM::VLD1LNd32:
3246 case ARM::VLD1LNd8_UPD:
3247 case ARM::VLD1LNd16_UPD:
3248 case ARM::VLD1LNd32_UPD:
3249 case ARM::VLD2LNd8:
3250 case ARM::VLD2LNd16:
3251 case ARM::VLD2LNd32:
3252 case ARM::VLD2LNq16:
3253 case ARM::VLD2LNq32:
3254 case ARM::VLD2LNd8_UPD:
3255 case ARM::VLD2LNd16_UPD:
3256 case ARM::VLD2LNd32_UPD:
3257 case ARM::VLD2LNq16_UPD:
3258 case ARM::VLD2LNq32_UPD:
3259 case ARM::VLD4LNd8:
3260 case ARM::VLD4LNd16:
3261 case ARM::VLD4LNd32:
3262 case ARM::VLD4LNq16:
3263 case ARM::VLD4LNq32:
3264 case ARM::VLD4LNd8_UPD:
3265 case ARM::VLD4LNd16_UPD:
3266 case ARM::VLD4LNd32_UPD:
3267 case ARM::VLD4LNq16_UPD:
3268 case ARM::VLD4LNq32_UPD:
3317 if (Reg == ARM::CPSR) {
3318 if (DefMI->getOpcode() == ARM::FMSTAT) {
3410 case ARM::LDRrs:
3411 case ARM::LDRBrs: {
3420 case ARM::t2LDRs:
3421 case ARM::t2LDRBs:
3422 case ARM::t2LDRHs:
3423 case ARM::t2LDRSHs: {
3437 case ARM::LDRrs:
3438 case ARM::LDRBrs: {
3450 case ARM::t2LDRs:
3451 case ARM::t2LDRBs:
3452 case ARM::t2LDRHs:
3453 case ARM::t2LDRSHs: {
3464 case ARM::VLD1q8:
3465 case ARM::VLD1q16:
3466 case ARM::VLD1q32:
3467 case ARM::VLD1q64:
3468 case ARM::VLD1q8wb_register:
3469 case ARM::VLD1q16wb_register:
3470 case ARM::VLD1q32wb_register:
3471 case ARM::VLD1q64wb_register:
3472 case ARM::VLD1q8wb_fixed:
3473 case ARM::VLD1q16wb_fixed:
3474 case ARM::VLD1q32wb_fixed:
3475 case ARM::VLD1q64wb_fixed:
3476 case ARM::VLD2d8:
3477 case ARM::VLD2d16:
3478 case ARM::VLD2d32:
3479 case ARM::VLD2q8Pseudo:
3480 case ARM::VLD2q16Pseudo:
3481 case ARM::VLD2q32Pseudo:
3482 case ARM::VLD2d8wb_fixed:
3483 case ARM::VLD2d16wb_fixed:
3484 case ARM::VLD2d32wb_fixed:
3485 case ARM::VLD2q8PseudoWB_fixed:
3486 case ARM::VLD2q16PseudoWB_fixed:
3487 case ARM::VLD2q32PseudoWB_fixed:
3488 case ARM::VLD2d8wb_register:
3489 case ARM::VLD2d16wb_register:
3490 case ARM::VLD2d32wb_register:
3491 case ARM::VLD2q8PseudoWB_register:
3492 case ARM::VLD2q16PseudoWB_register:
3493 case ARM::VLD2q32PseudoWB_register:
3494 case ARM::VLD3d8Pseudo:
3495 case ARM::VLD3d16Pseudo:
3496 case ARM::VLD3d32Pseudo:
3497 case ARM::VLD1d64TPseudo:
3498 case ARM::VLD3d8Pseudo_UPD:
3499 case ARM::VLD3d16Pseudo_UPD:
3500 case ARM::VLD3d32Pseudo_UPD:
3501 case ARM::VLD3q8Pseudo_UPD:
3502 case ARM::VLD3q16Pseudo_UPD:
3503 case ARM::VLD3q32Pseudo_UPD:
3504 case ARM::VLD3q8oddPseudo:
3505 case ARM::VLD3q16oddPseudo:
3506 case ARM::VLD3q32oddPseudo:
3507 case ARM::VLD3q8oddPseudo_UPD:
3508 case ARM::VLD3q16oddPseudo_UPD:
3509 case ARM::VLD3q32oddPseudo_UPD:
3510 case ARM::VLD4d8Pseudo:
3511 case ARM::VLD4d16Pseudo:
3512 case ARM::VLD4d32Pseudo:
3513 case ARM::VLD1d64QPseudo:
3514 case ARM::VLD4d8Pseudo_UPD:
3515 case ARM::VLD4d16Pseudo_UPD:
3516 case ARM::VLD4d32Pseudo_UPD:
3517 case ARM::VLD4q8Pseudo_UPD:
3518 case ARM::VLD4q16Pseudo_UPD:
3519 case ARM::VLD4q32Pseudo_UPD:
3520 case ARM::VLD4q8oddPseudo:
3521 case ARM::VLD4q16oddPseudo:
3522 case ARM::VLD4q32oddPseudo:
3523 case ARM::VLD4q8oddPseudo_UPD:
3524 case ARM::VLD4q16oddPseudo_UPD:
3525 case ARM::VLD4q32oddPseudo_UPD:
3526 case ARM::VLD1DUPq8:
3527 case ARM::VLD1DUPq16:
3528 case ARM::VLD1DUPq32:
3529 case ARM::VLD1DUPq8wb_fixed:
3530 case ARM::VLD1DUPq16wb_fixed:
3531 case ARM::VLD1DUPq32wb_fixed:
3532 case ARM::VLD1DUPq8wb_register:
3533 case ARM::VLD1DUPq16wb_register:
3534 case ARM::VLD1DUPq32wb_register:
3535 case ARM::VLD2DUPd8:
3536 case ARM::VLD2DUPd16:
3537 case ARM::VLD2DUPd32:
3538 case ARM::VLD2DUPd8wb_fixed:
3539 case ARM::VLD2DUPd16wb_fixed:
3540 case ARM::VLD2DUPd32wb_fixed:
3541 case ARM::VLD2DUPd8wb_register:
3542 case ARM::VLD2DUPd16wb_register:
3543 case ARM::VLD2DUPd32wb_register:
3544 case ARM::VLD4DUPd8Pseudo:
3545 case ARM::VLD4DUPd16Pseudo:
3546 case ARM::VLD4DUPd32Pseudo:
3547 case ARM::VLD4DUPd8Pseudo_UPD:
3548 case ARM::VLD4DUPd16Pseudo_UPD:
3549 case ARM::VLD4DUPd32Pseudo_UPD:
3550 case ARM::VLD1LNq8Pseudo:
3551 case ARM::VLD1LNq16Pseudo:
3552 case ARM::VLD1LNq32Pseudo:
3553 case ARM::VLD1LNq8Pseudo_UPD:
3554 case ARM::VLD1LNq16Pseudo_UPD:
3555 case ARM::VLD1LNq32Pseudo_UPD:
3556 case ARM::VLD2LNd8Pseudo:
3557 case ARM::VLD2LNd16Pseudo:
3558 case ARM::VLD2LNd32Pseudo:
3559 case ARM::VLD2LNq16Pseudo:
3560 case ARM::VLD2LNq32Pseudo:
3561 case ARM::VLD2LNd8Pseudo_UPD:
3562 case ARM::VLD2LNd16Pseudo_UPD:
3563 case ARM::VLD2LNd32Pseudo_UPD:
3564 case ARM::VLD2LNq16Pseudo_UPD:
3565 case ARM::VLD2LNq32Pseudo_UPD:
3566 case ARM::VLD4LNd8Pseudo:
3567 case ARM::VLD4LNd16Pseudo:
3568 case ARM::VLD4LNd32Pseudo:
3569 case ARM::VLD4LNq16Pseudo:
3570 case ARM::VLD4LNq32Pseudo:
3571 case ARM::VLD4LNd8Pseudo_UPD:
3572 case ARM::VLD4LNd16Pseudo_UPD:
3573 case ARM::VLD4LNd32Pseudo_UPD:
3574 case ARM::VLD4LNq16Pseudo_UPD:
3575 case ARM::VLD4LNq32Pseudo_UPD:
3599 if (I->getOpcode() != ARM::t2IT)
3606 if (PredCost && (MCID.isCall() || MCID.hasImplicitDefOfPhysReg(ARM::CPSR))) {
3647 case ARM::VLDMQIA:
3648 case ARM::VSTMQIA:
3738 if (MI->getOpcode() == ARM::VMOVD && !isPredicated(MI))
3744 (MI->getOpcode() == ARM::VMOVRS ||
3745 MI->getOpcode() == ARM::VMOVSR ||
3746 MI->getOpcode() == ARM::VMOVS))
3768 unsigned DReg = TRI->getMatchingSuperReg(SReg, ARM::ssub_0, &ARM::DPRRegClass);
3771 if (DReg != ARM::NoRegister)
3775 DReg = TRI->getMatchingSuperReg(SReg, ARM::ssub_1, &ARM::DPRRegClass);
3809 (Lane & 1) ? ARM::ssub_0 : ARM::ssub_1);
3834 case ARM::VMOVD:
3849 MI->setDesc(get(ARM::VORRd));
3854 case ARM::VMOVRS:
3871 MI->setDesc(get(ARM::VGETLNi32));
3880 case ARM::VMOVSR: {
3900 MI->setDesc(get(ARM::VSETLNi32));
3914 case ARM::VMOVS: {
3936 MI->setDesc(get(ARM::VDUPLN32d));
3965 get(ARM::VEXTd32), DDst);
3984 MI->setDesc(get(ARM::VEXTd32));
4048 case ARM::VLDRS:
4049 case ARM::FCONSTS:
4050 case ARM::VMOVSR:
4051 case ARM::VMOVv8i8:
4052 case ARM::VMOVv4i16:
4053 case ARM::VMOVv2i32:
4054 case ARM::VMOVv2f32:
4055 case ARM::VMOVv1i64:
4060 case ARM::VLD1LNd32:
4077 } else if (ARM::SPRRegClass.contains(Reg)) {
4079 unsigned DReg = TRI->getMatchingSuperReg(Reg, ARM::ssub_0,
4080 &ARM::DPRRegClass);
4106 if (ARM::SPRRegClass.contains(Reg)) {
4107 DReg = ARM::D0 + (Reg - ARM::S0) / 2;
4111 assert(ARM::DPRRegClass.contains(DReg) && "Can only break D-reg deps");
4123 get(ARM::FCONSTD), DReg).addImm(96));
4128 return (Subtarget.getFeatureBits() & ARM::HasV6T2Ops) != 0;