Lines Matching refs:ARM

1 //===-- ARMLoadStoreOptimizer.cpp - ARM load / store opt. pass ------------===//
16 #include "ARM.h"
75 return "ARM load / store optimization pass";
144 case ARM::LDRi12:
148 case ARM_AM::ia: return ARM::LDMIA;
149 case ARM_AM::da: return ARM::LDMDA;
150 case ARM_AM::db: return ARM::LDMDB;
151 case ARM_AM::ib: return ARM::LDMIB;
153 case ARM::STRi12:
157 case ARM_AM::ia: return ARM::STMIA;
158 case ARM_AM::da: return ARM::STMDA;
159 case ARM_AM::db: return ARM::STMDB;
160 case ARM_AM::ib: return ARM::STMIB;
162 case ARM::t2LDRi8:
163 case ARM::t2LDRi12:
167 case ARM_AM::ia: return ARM::t2LDMIA;
168 case ARM_AM::db: return ARM::t2LDMDB;
170 case ARM::t2STRi8:
171 case ARM::t2STRi12:
175 case ARM_AM::ia: return ARM::t2STMIA;
176 case ARM_AM::db: return ARM::t2STMDB;
178 case ARM::VLDRS:
182 case ARM_AM::ia: return ARM::VLDMSIA;
185 case ARM::VSTRS:
189 case ARM_AM::ia: return ARM::VSTMSIA;
192 case ARM::VLDRD:
196 case ARM_AM::ia: return ARM::VLDMDIA;
199 case ARM::VSTRD:
203 case ARM_AM::ia: return ARM::VSTMDIA;
215 case ARM::LDMIA_RET:
216 case ARM::LDMIA:
217 case ARM::LDMIA_UPD:
218 case ARM::STMIA:
219 case ARM::STMIA_UPD:
220 case ARM::t2LDMIA_RET:
221 case ARM::t2LDMIA:
222 case ARM::t2LDMIA_UPD:
223 case ARM::t2STMIA:
224 case ARM::t2STMIA_UPD:
225 case ARM::VLDMSIA:
226 case ARM::VLDMSIA_UPD:
227 case ARM::VSTMSIA:
228 case ARM::VSTMSIA_UPD:
229 case ARM::VLDMDIA:
230 case ARM::VLDMDIA_UPD:
231 case ARM::VSTMDIA:
232 case ARM::VSTMDIA_UPD:
235 case ARM::LDMDA:
236 case ARM::LDMDA_UPD:
237 case ARM::STMDA:
238 case ARM::STMDA_UPD:
241 case ARM::LDMDB:
242 case ARM::LDMDB_UPD:
243 case ARM::STMDB:
244 case ARM::STMDB_UPD:
245 case ARM::t2LDMDB:
246 case ARM::t2LDMDB_UPD:
247 case ARM::t2STMDB:
248 case ARM::t2STMDB_UPD:
249 case ARM::VLDMSDB_UPD:
250 case ARM::VSTMSDB_UPD:
251 case ARM::VLDMDDB_UPD:
252 case ARM::VSTMDDB_UPD:
255 case ARM::LDMIB:
256 case ARM::LDMIB_UPD:
257 case ARM::STMIB:
258 case ARM::STMIB_UPD:
267 return Opc == ARM::t2LDRi12 || Opc == ARM::t2LDRi8;
271 return Opc == ARM::LDRi12 || isT2i32Load(Opc);
275 return Opc == ARM::t2STRi12 || Opc == ARM::t2STRi8;
279 return Opc == ARM::STRi12 || isT2i32Store(Opc);
331 int BaseOpc = !isThumb2 ? ARM::ADDri : ARM::t2ADDri;
333 BaseOpc = !isThumb2 ? ARM::SUBri : ARM::t2SUBri;
349 bool isDef = (isi32Load(Opcode) || Opcode == ARM::VLDRS ||
350 Opcode == ARM::VLDRD);
491 // LLVM what's OK with ARM loads and stores; but we still have to adjust the
544 case ARM::VSTRS:
547 case ARM::VSTRD:
550 case ARM::VLDRD:
553 case ARM::VLDRS:
566 if (Reg != ARM::SP &&
600 if (MO.isDef() && MO.getReg() == ARM::CPSR && !MO.isDead())
619 case ARM::t2SUBri:
620 case ARM::SUBri:
623 case ARM::tSUBspi:
631 unsigned Scale = (MI->getOpcode() == ARM::tSUBspi) ? 4 : 1; // FIXME
652 case ARM::t2ADDri:
653 case ARM::ADDri:
656 case ARM::tADDspi:
664 unsigned Scale = (MI->getOpcode() == ARM::tADDspi) ? 4 : 1; // FIXME
678 case ARM::LDRi12:
679 case ARM::STRi12:
680 case ARM::t2LDRi8:
681 case ARM::t2LDRi12:
682 case ARM::t2STRi8:
683 case ARM::t2STRi12:
684 case ARM::VLDRS:
685 case ARM::VSTRS:
687 case ARM::VLDRD:
688 case ARM::VSTRD:
690 case ARM::LDMIA:
691 case ARM::LDMDA:
692 case ARM::LDMDB:
693 case ARM::LDMIB:
694 case ARM::STMIA:
695 case ARM::STMDA:
696 case ARM::STMDB:
697 case ARM::STMIB:
698 case ARM::t2LDMIA:
699 case ARM::t2LDMDB:
700 case ARM::t2STMIA:
701 case ARM::t2STMDB:
702 case ARM::VLDMSIA:
703 case ARM::VSTMSIA:
705 case ARM::VLDMDIA:
706 case ARM::VSTMDIA:
715 case ARM::LDMIA:
716 case ARM::LDMDA:
717 case ARM::LDMDB:
718 case ARM::LDMIB:
721 case ARM_AM::ia: return ARM::LDMIA_UPD;
722 case ARM_AM::ib: return ARM::LDMIB_UPD;
723 case ARM_AM::da: return ARM::LDMDA_UPD;
724 case ARM_AM::db: return ARM::LDMDB_UPD;
726 case ARM::STMIA:
727 case ARM::STMDA:
728 case ARM::STMDB:
729 case ARM::STMIB:
732 case ARM_AM::ia: return ARM::STMIA_UPD;
733 case ARM_AM::ib: return ARM::STMIB_UPD;
734 case ARM_AM::da: return ARM::STMDA_UPD;
735 case ARM_AM::db: return ARM::STMDB_UPD;
737 case ARM::t2LDMIA:
738 case ARM::t2LDMDB:
741 case ARM_AM::ia: return ARM::t2LDMIA_UPD;
742 case ARM_AM::db: return ARM::t2LDMDB_UPD;
744 case ARM::t2STMIA:
745 case ARM::t2STMDB:
748 case ARM_AM::ia: return ARM::t2STMIA_UPD;
749 case ARM_AM::db: return ARM::t2STMDB_UPD;
751 case ARM::VLDMSIA:
754 case ARM_AM::ia: return ARM::VLDMSIA_UPD;
755 case ARM_AM::db: return ARM::VLDMSDB_UPD;
757 case ARM::VLDMDIA:
760 case ARM_AM::ia: return ARM::VLDMDIA_UPD;
761 case ARM_AM::db: return ARM::VLDMDDB_UPD;
763 case ARM::VSTMSIA:
766 case ARM_AM::ia: return ARM::VSTMSIA_UPD;
767 case ARM_AM::db: return ARM::VSTMSDB_UPD;
769 case ARM::VSTMDIA:
772 case ARM_AM::ia: return ARM::VSTMDIA_UPD;
773 case ARM_AM::db: return ARM::VSTMDDB_UPD;
876 case ARM::LDRi12:
877 return ARM::LDR_PRE_IMM;
878 case ARM::STRi12:
879 return ARM::STR_PRE_IMM;
880 case ARM::VLDRS:
881 return Mode == ARM_AM::add ? ARM::VLDMSIA_UPD : ARM::VLDMSDB_UPD;
882 case ARM::VLDRD:
883 return Mode == ARM_AM::add ? ARM::VLDMDIA_UPD : ARM::VLDMDDB_UPD;
884 case ARM::VSTRS:
885 return Mode == ARM_AM::add ? ARM::VSTMSIA_UPD : ARM::VSTMSDB_UPD;
886 case ARM::VSTRD:
887 return Mode == ARM_AM::add ? ARM::VSTMDIA_UPD : ARM::VSTMDDB_UPD;
888 case ARM::t2LDRi8:
889 case ARM::t2LDRi12:
890 return ARM::t2LDR_PRE;
891 case ARM::t2STRi8:
892 case ARM::t2STRi12:
893 return ARM::t2STR_PRE;
901 case ARM::LDRi12:
902 return ARM::LDR_POST_IMM;
903 case ARM::STRi12:
904 return ARM::STR_POST_IMM;
905 case ARM::VLDRS:
906 return Mode == ARM_AM::add ? ARM::VLDMSIA_UPD : ARM::VLDMSDB_UPD;
907 case ARM::VLDRD:
908 return Mode == ARM_AM::add ? ARM::VLDMDIA_UPD : ARM::VLDMDDB_UPD;
909 case ARM::VSTRS:
910 return Mode == ARM_AM::add ? ARM::VSTMSIA_UPD : ARM::VSTMSDB_UPD;
911 case ARM::VSTRD:
912 return Mode == ARM_AM::add ? ARM::VSTMDIA_UPD : ARM::VSTMDDB_UPD;
913 case ARM::t2LDRi8:
914 case ARM::t2LDRi12:
915 return ARM::t2LDR_POST;
916 case ARM::t2STRi8:
917 case ARM::t2STRi12:
918 return ARM::t2STR_POST;
936 bool isAM5 = (Opcode == ARM::VLDRD || Opcode == ARM::VLDRS ||
937 Opcode == ARM::VSTRD || Opcode == ARM::VSTRS);
938 bool isAM2 = (Opcode == ARM::LDRi12 || Opcode == ARM::STRi12);
945 bool isLd = isi32Load(Opcode) || Opcode == ARM::VLDRS || Opcode == ARM::VLDRD;
1019 if (NewOpc == ARM::LDR_PRE_IMM || NewOpc == ARM::LDRB_PRE_IMM) {
1042 if (isAM2 && NewOpc == ARM::STR_POST_IMM) {
1095 case ARM::VLDRS:
1096 case ARM::VSTRS:
1098 case ARM::VLDRD:
1099 case ARM::VSTRD:
1101 case ARM::LDRi12:
1102 case ARM::STRi12:
1103 case ARM::t2LDRi8:
1104 case ARM::t2LDRi12:
1105 case ARM::t2STRi8:
1106 case ARM::t2STRi12:
1130 bool isAM3 = Opcode == ARM::LDRD || Opcode == ARM::STRD;
1134 if (Opcode == ARM::t2LDRi12 || Opcode == ARM::t2LDRi8 ||
1135 Opcode == ARM::t2STRi12 || Opcode == ARM::t2STRi8 ||
1136 Opcode == ARM::t2LDRDi8 || Opcode == ARM::t2STRDi8 ||
1137 Opcode == ARM::LDRi12 || Opcode == ARM::STRi12)
1180 if (Opcode == ARM::LDRD || Opcode == ARM::STRD ||
1181 Opcode == ARM::t2LDRDi8 || Opcode == ARM::t2STRDi8) {
1188 // ARM errata 602117: LDRD with base in list may result in incorrect base
1196 bool isT2 = Opcode == ARM::t2LDRDi8 || Opcode == ARM::t2STRDi8;
1197 bool isLd = Opcode == ARM::LDRD || Opcode == ARM::t2LDRDi8;
1216 ? (isT2 ? ARM::t2LDMIA : ARM::LDMIA)
1217 : (isT2 ? ARM::t2STMIA : ARM::STMIA);
1239 ? (isT2 ? (OffImm < 0 ? ARM::t2LDRi8 : ARM::t2LDRi12) : ARM::LDRi12)
1240 : (isT2 ? (OffImm < 0 ? ARM::t2STRi8 : ARM::t2STRi12) : ARM::STRi12);
1244 ? (isT2 ? (OffImm+4 < 0 ? ARM::t2LDRi8 : ARM::t2LDRi12) : ARM::LDRi12)
1245 : (isT2 ? (OffImm+4 < 0 ? ARM::t2STRi8 : ARM::t2STRi12) : ARM::STRi12);
1420 unsigned Scratch = RS->FindUnusedReg(&ARM::GPRRegClass);
1490 (MBBI->getOpcode() == ARM::BX_RET ||
1491 MBBI->getOpcode() == ARM::tBX_RET ||
1492 MBBI->getOpcode() == ARM::MOVPCLR)) {
1495 if (Opcode == ARM::LDMIA_UPD || Opcode == ARM::LDMDA_UPD ||
1496 Opcode == ARM::LDMDB_UPD || Opcode == ARM::LDMIB_UPD ||
1497 Opcode == ARM::t2LDMIA_UPD || Opcode == ARM::t2LDMDB_UPD) {
1499 if (MO.getReg() != ARM::LR)
1501 unsigned NewOpc = (isThumb2 ? ARM::t2LDMIA_RET : ARM::LDMIA_RET);
1502 assert(((isThumb2 && Opcode == ARM::t2LDMIA_UPD) ||
1503 Opcode == ARM::LDMIA_UPD) && "Unsupported multiple load-return!");
1505 MO.setReg(ARM::PC);
1556 return "ARM pre- register allocation load / store optimization pass";
1669 if (Opcode == ARM::LDRi12)
1670 NewOpc = ARM::LDRD;
1671 else if (Opcode == ARM::STRi12)
1672 NewOpc = ARM::STRD;
1673 else if (Opcode == ARM::t2LDRi8 || Opcode == ARM::t2LDRi12) {
1674 NewOpc = ARM::t2LDRDi8;
1677 } else if (Opcode == ARM::t2STRi8 || Opcode == ARM::t2STRi12) {
1678 NewOpc = ARM::t2STRDi8;
1923 bool isLd = isi32Load(Opc) || Opc == ARM::VLDRS || Opc == ARM::VLDRD;