Home | History | Annotate | Download | only in ARM

Lines Matching full:arm

1 //===-- ARMLoadStoreOptimizer.cpp - ARM load / store opt. pass ------------===//
15 #define DEBUG_TYPE "arm-ldst-opt"
16 #include "ARM.h"
75 return "ARM load / store optimization pass";
140 case ARM::LDRi12:
144 case ARM_AM::ia: return ARM::LDMIA;
145 case ARM_AM::da: return ARM::LDMDA;
146 case ARM_AM::db: return ARM::LDMDB;
147 case ARM_AM::ib: return ARM::LDMIB;
149 case ARM::STRi12:
153 case ARM_AM::ia: return ARM::STMIA;
154 case ARM_AM::da: return ARM::STMDA;
155 case ARM_AM::db: return ARM::STMDB;
156 case ARM_AM::ib: return ARM::STMIB;
158 case ARM::t2LDRi8:
159 case ARM::t2LDRi12:
163 case ARM_AM::ia: return ARM::t2LDMIA;
164 case ARM_AM::db: return ARM::t2LDMDB;
166 case ARM::t2STRi8:
167 case ARM::t2STRi12:
171 case ARM_AM::ia: return ARM::t2STMIA;
172 case ARM_AM::db: return ARM::t2STMDB;
174 case ARM::VLDRS:
178 case ARM_AM::ia: return ARM::VLDMSIA;
181 case ARM::VSTRS:
185 case ARM_AM::ia: return ARM::VSTMSIA;
188 case ARM::VLDRD:
192 case ARM_AM::ia: return ARM::VLDMDIA;
195 case ARM::VSTRD:
199 case ARM_AM::ia: return ARM::VSTMDIA;
211 case ARM::LDMIA_RET:
212 case ARM::LDMIA:
213 case ARM::LDMIA_UPD:
214 case ARM::STMIA:
215 case ARM::STMIA_UPD:
216 case ARM::t2LDMIA_RET:
217 case ARM::t2LDMIA:
218 case ARM::t2LDMIA_UPD:
219 case ARM::t2STMIA:
220 case ARM::t2STMIA_UPD:
221 case ARM::VLDMSIA:
222 case ARM::VLDMSIA_UPD:
223 case ARM::VSTMSIA:
224 case ARM::VSTMSIA_UPD:
225 case ARM::VLDMDIA:
226 case ARM::VLDMDIA_UPD:
227 case ARM::VSTMDIA:
228 case ARM::VSTMDIA_UPD:
231 case ARM::LDMDA:
232 case ARM::LDMDA_UPD:
233 case ARM::STMDA:
234 case ARM::STMDA_UPD:
237 case ARM::LDMDB:
238 case ARM::LDMDB_UPD:
239 case ARM::STMDB:
240 case ARM::STMDB_UPD:
241 case ARM::t2LDMDB:
242 case ARM::t2LDMDB_UPD:
243 case ARM::t2STMDB:
244 case ARM::t2STMDB_UPD:
245 case ARM::VLDMSDB_UPD:
246 case ARM::VSTMSDB_UPD:
247 case ARM::VLDMDDB_UPD:
248 case ARM::VSTMDDB_UPD:
251 case ARM::LDMIB:
252 case ARM::LDMIB_UPD:
253 case ARM::STMIB:
254 case ARM::STMIB_UPD:
263 return Opc == ARM::t2LDRi12 || Opc == ARM::t2LDRi8;
267 return Opc == ARM::LDRi12 || isT2i32Load(Opc);
271 return Opc == ARM::t2STRi12 || Opc == ARM::t2STRi8;
275 return Opc == ARM::STRi12 || isT2i32Store(Opc);
327 int BaseOpc = !isThumb2 ? ARM::ADDri : ARM::t2ADDri;
329 BaseOpc = !isThumb2 ? ARM::SUBri : ARM::t2SUBri;
345 bool isDef = (isi32Load(Opcode) || Opcode == ARM::VLDRS ||
346 Opcode == ARM::VLDRD);
467 case ARM::VSTRS:
470 case ARM::VSTRD:
473 case ARM::VLDRD:
476 case ARM::VLDRS:
489 if (Reg != ARM::SP &&
520 if (MO.isDef() && MO.getReg() == ARM::CPSR && !MO.isDead())
539 case ARM::t2SUBri:
540 case ARM::SUBri:
543 case ARM::tSUBspi:
551 unsigned Scale = (MI->getOpcode() == ARM::tSUBspi) ? 4 : 1; // FIXME
572 case ARM::t2ADDri:
573 case ARM::ADDri:
576 case ARM::tADDspi:
584 unsigned Scale = (MI->getOpcode() == ARM::tADDspi) ? 4 : 1; // FIXME
598 case ARM::LDRi12:
599 case ARM::STRi12:
600 case ARM::t2LDRi8:
601 case ARM::t2LDRi12:
602 case ARM::t2STRi8:
603 case ARM::t2STRi12:
604 case ARM::VLDRS:
605 case ARM::VSTRS:
607 case ARM::VLDRD:
608 case ARM::VSTRD:
610 case ARM::LDMIA:
611 case ARM::LDMDA:
612 case ARM::LDMDB:
613 case ARM::LDMIB:
614 case ARM::STMIA:
615 case ARM::STMDA:
616 case ARM::STMDB:
617 case ARM::STMIB:
618 case ARM::t2LDMIA:
619 case ARM::t2LDMDB:
620 case ARM::t2STMIA:
621 case ARM::t2STMDB:
622 case ARM::VLDMSIA:
623 case ARM::VSTMSIA:
625 case ARM::VLDMDIA:
626 case ARM::VSTMDIA:
635 case ARM::LDMIA:
636 case ARM::LDMDA:
637 case ARM::LDMDB:
638 case ARM::LDMIB:
641 case ARM_AM::ia: return ARM::LDMIA_UPD;
642 case ARM_AM::ib: return ARM::LDMIB_UPD;
643 case ARM_AM::da: return ARM::LDMDA_UPD;
644 case ARM_AM::db: return ARM::LDMDB_UPD;
646 case ARM::STMIA:
647 case ARM::STMDA:
648 case ARM::STMDB:
649 case ARM::STMIB:
652 case ARM_AM::ia: return ARM::STMIA_UPD;
653 case ARM_AM::ib: return ARM::STMIB_UPD;
654 case ARM_AM::da: return ARM::STMDA_UPD;
655 case ARM_AM::db: return ARM::STMDB_UPD;
657 case ARM::t2LDMIA:
658 case ARM::t2LDMDB:
661 case ARM_AM::ia: return ARM::t2LDMIA_UPD;
662 case ARM_AM::db: return ARM::t2LDMDB_UPD;
664 case ARM::t2STMIA:
665 case ARM::t2STMDB:
668 case ARM_AM::ia: return ARM::t2STMIA_UPD;
669 case ARM_AM::db: return ARM::t2STMDB_UPD;
671 case ARM::VLDMSIA:
674 case ARM_AM::ia: return ARM::VLDMSIA_UPD;
675 case ARM_AM::db: return ARM::VLDMSDB_UPD;
677 case ARM::VLDMDIA:
680 case ARM_AM::ia: return ARM::VLDMDIA_UPD;
681 case ARM_AM::db: return ARM::VLDMDDB_UPD;
683 case ARM::VSTMSIA:
686 case ARM_AM::ia: return ARM::VSTMSIA_UPD;
687 case ARM_AM::db: return ARM::VSTMSDB_UPD;
689 case ARM::VSTMDIA:
692 case ARM_AM::ia: return ARM::VSTMDIA_UPD;
693 case ARM_AM::db: return ARM::VSTMDDB_UPD;
796 case ARM::LDRi12:
797 return ARM::LDR_PRE_IMM;
798 case ARM::STRi12:
799 return ARM::STR_PRE_IMM;
800 case ARM::VLDRS:
801 return Mode == ARM_AM::add ? ARM::VLDMSIA_UPD : ARM::VLDMSDB_UPD;
802 case ARM::VLDRD:
803 return Mode == ARM_AM::add ? ARM::VLDMDIA_UPD : ARM::VLDMDDB_UPD;
804 case ARM::VSTRS:
805 return Mode == ARM_AM::add ? ARM::VSTMSIA_UPD : ARM::VSTMSDB_UPD;
806 case ARM::VSTRD:
807 return Mode == ARM_AM::add ? ARM::VSTMDIA_UPD : ARM::VSTMDDB_UPD;
808 case ARM::t2LDRi8:
809 case ARM::t2LDRi12:
810 return ARM::t2LDR_PRE;
811 case ARM::t2STRi8:
812 case ARM::t2STRi12:
813 return ARM::t2STR_PRE;
821 case ARM::LDRi12:
822 return ARM::LDR_POST_IMM;
823 case ARM::STRi12:
824 return ARM::STR_POST_IMM;
825 case ARM::VLDRS:
826 return Mode == ARM_AM::add ? ARM::VLDMSIA_UPD : ARM::VLDMSDB_UPD;
827 case ARM::VLDRD:
828 return Mode == ARM_AM::add ? ARM::VLDMDIA_UPD : ARM::VLDMDDB_UPD;
829 case ARM::VSTRS:
830 return Mode == ARM_AM::add ? ARM::VSTMSIA_UPD : ARM::VSTMSDB_UPD;
831 case ARM::VSTRD:
832 return Mode == ARM_AM::add ? ARM::VSTMDIA_UPD : ARM::VSTMDDB_UPD;
833 case ARM::t2LDRi8:
834 case ARM::t2LDRi12:
835 return ARM::t2LDR_POST;
836 case ARM::t2STRi8:
837 case ARM::t2STRi12:
838 return ARM::t2STR_POST;
856 bool isAM5 = (Opcode == ARM::VLDRD || Opcode == ARM::VLDRS ||
857 Opcode == ARM::VSTRD || Opcode == ARM::VSTRS);
858 bool isAM2 = (Opcode == ARM::LDRi12 || Opcode == ARM::STRi12);
865 bool isLd = isi32Load(Opcode) || Opcode == ARM::VLDRS || Opcode == ARM::VLDRD;
939 if (NewOpc == ARM::LDR_PRE_IMM || NewOpc == ARM::LDRB_PRE_IMM) {
962 if (isAM2 && NewOpc == ARM::STR_POST_IMM) {
1015 case ARM::VLDRS:
1016 case ARM::VSTRS:
1018 case ARM::VLDRD:
1019 case ARM::VSTRD:
1021 case ARM::LDRi12:
1022 case ARM::STRi12:
1023 case ARM::t2LDRi8:
1024 case ARM::t2LDRi12:
1025 case ARM::t2STRi8:
1026 case ARM::t2STRi12:
1050 bool isAM3 = Opcode == ARM::LDRD || Opcode == ARM::STRD;
1054 if (Opcode == ARM::t2LDRi12 || Opcode == ARM::t2LDRi8 ||
1055 Opcode == ARM::t2STRi12 || Opcode == ARM::t2STRi8 ||
1056 Opcode == ARM::t2LDRDi8 || Opcode == ARM::t2STRDi8 ||
1057 Opcode == ARM::LDRi12 || Opcode == ARM::STRi12)
1100 if (Opcode == ARM::LDRD || Opcode == ARM::STRD ||
1101 Opcode == ARM::t2LDRDi8 || Opcode == ARM::t2STRDi8) {
1108 // ARM errata 602117: LDRD with base in list may result in incorrect base
1116 bool isT2 = Opcode == ARM::t2LDRDi8 || Opcode == ARM::t2STRDi8;
1117 bool isLd = Opcode == ARM::LDRD || Opcode == ARM::t2LDRDi8;
1136 ? (isT2 ? ARM::t2LDMIA : ARM::LDMIA)
1137 : (isT2 ? ARM::t2STMIA : ARM::STMIA);
1159 ? (isT2 ? (OffImm < 0 ? ARM::t2LDRi8 : ARM::t2LDRi12) : ARM::LDRi12)
1160 : (isT2 ? (OffImm < 0 ? ARM::t2STRi8 : ARM::t2STRi12) : ARM::STRi12);
1164 ? (isT2 ? (OffImm+4 < 0 ? ARM::t2LDRi8 : ARM::t2LDRi12) : ARM::LDRi12)
1165 : (isT2 ? (OffImm+4 < 0 ? ARM::t2STRi8 : ARM::t2STRi12) : ARM::STRi12);
1340 unsigned Scratch = RS->FindUnusedReg(&ARM::GPRRegClass);
1410 (MBBI->getOpcode() == ARM::BX_RET ||
1411 MBBI->getOpcode() == ARM::tBX_RET ||
1412 MBBI->getOpcode() == ARM::MOVPCLR)) {
1415 if (Opcode == ARM::LDMIA_UPD || Opcode == ARM::LDMDA_UPD ||
1416 Opcode == ARM::LDMDB_UPD || Opcode == ARM::LDMIB_UPD ||
1417 Opcode == ARM::t2LDMIA_UPD || Opcode == ARM::t2LDMDB_UPD) {
1419 if (MO.getReg() != ARM::LR)
1421 unsigned NewOpc = (isThumb2 ? ARM::t2LDMIA_RET : ARM::LDMIA_RET);
1422 assert(((isThumb2 && Opcode == ARM::t2LDMIA_UPD) ||
1423 Opcode == ARM::LDMIA_UPD) && "Unsupported multiple load-return!");
1425 MO.setReg(ARM::PC);
1476 return "ARM pre- register allocation load / store optimization pass";
1589 if (Opcode == ARM::LDRi12)
1590 NewOpc = ARM::LDRD;
1591 else if (Opcode == ARM::STRi12)
1592 NewOpc = ARM::STRD;
1593 else if (Opcode == ARM::t2LDRi8 || Opcode == ARM::t2LDRi12) {
1594 NewOpc = ARM::t2LDRDi8;
1597 } else if (Opcode == ARM::t2STRi8 || Opcode == ARM::t2STRi12) {
1598 NewOpc = ARM::t2STRDi8;
1843 bool isLd = isi32Load(Opc) || Opc == ARM::VLDRS || Opc == ARM::VLDRD;