32#define DEBUG_TYPE "arm-pseudo"
36 cl::desc(
"Verify machine code after expanding ARM pseudos"));
38#define ARM_EXPAND_PSEUDO_NAME "ARM pseudo instruction expansion pass"
70 unsigned Opc,
bool IsExt);
110 unsigned StrexOp,
unsigned UxtOp,
117 char ARMExpandPseudo::ID = 0;
128 enum NEONRegSpacing {
139 struct NEONLdStTableEntry {
144 bool hasWritebackOperand;
153 bool copyAllListRegs;
156 bool operator<(
const NEONLdStTableEntry &TE)
const {
157 return PseudoOpc < TE.PseudoOpc;
159 friend bool operator<(
const NEONLdStTableEntry &TE,
unsigned PseudoOpc) {
160 return TE.PseudoOpc < PseudoOpc;
163 const NEONLdStTableEntry &TE) {
164 return PseudoOpc < TE.PseudoOpc;
170{ ARM::VLD1LNq16Pseudo, ARM::VLD1LNd16,
true,
false,
false, EvenDblSpc, 1, 4 ,
true},
171{ ARM::VLD1LNq16Pseudo_UPD, ARM::VLD1LNd16_UPD,
true,
true,
true, EvenDblSpc, 1, 4 ,
true},
172{ ARM::VLD1LNq32Pseudo, ARM::VLD1LNd32,
true,
false,
false, EvenDblSpc, 1, 2 ,
true},
173{ ARM::VLD1LNq32Pseudo_UPD, ARM::VLD1LNd32_UPD,
true,
true,
true, EvenDblSpc, 1, 2 ,
true},
174{ ARM::VLD1LNq8Pseudo, ARM::VLD1LNd8,
true,
false,
false, EvenDblSpc, 1, 8 ,
true},
175{ ARM::VLD1LNq8Pseudo_UPD, ARM::VLD1LNd8_UPD,
true,
true,
true, EvenDblSpc, 1, 8 ,
true},
177{ ARM::VLD1d16QPseudo, ARM::VLD1d16Q,
true,
false,
false, SingleSpc, 4, 4 ,
false},
178{ ARM::VLD1d16QPseudoWB_fixed, ARM::VLD1d16Qwb_fixed,
true,
true,
false, SingleSpc, 4, 4 ,
false},
179{ ARM::VLD1d16QPseudoWB_register, ARM::VLD1d16Qwb_register,
true,
true,
true, SingleSpc, 4, 4 ,
false},
180{ ARM::VLD1d16TPseudo, ARM::VLD1d16T,
true,
false,
false, SingleSpc, 3, 4 ,
false},
181{ ARM::VLD1d16TPseudoWB_fixed, ARM::VLD1d16Twb_fixed,
true,
true,
false, SingleSpc, 3, 4 ,
false},
182{ ARM::VLD1d16TPseudoWB_register, ARM::VLD1d16Twb_register,
true,
true,
true, SingleSpc, 3, 4 ,
false},
184{ ARM::VLD1d32QPseudo, ARM::VLD1d32Q,
true,
false,
false, SingleSpc, 4, 2 ,
false},
185{ ARM::VLD1d32QPseudoWB_fixed, ARM::VLD1d32Qwb_fixed,
true,
true,
false, SingleSpc, 4, 2 ,
false},
186{ ARM::VLD1d32QPseudoWB_register, ARM::VLD1d32Qwb_register,
true,
true,
true, SingleSpc, 4, 2 ,
false},
187{ ARM::VLD1d32TPseudo, ARM::VLD1d32T,
true,
false,
false, SingleSpc, 3, 2 ,
false},
188{ ARM::VLD1d32TPseudoWB_fixed, ARM::VLD1d32Twb_fixed,
true,
true,
false, SingleSpc, 3, 2 ,
false},
189{ ARM::VLD1d32TPseudoWB_register, ARM::VLD1d32Twb_register,
true,
true,
true, SingleSpc, 3, 2 ,
false},
191{ ARM::VLD1d64QPseudo, ARM::VLD1d64Q,
true,
false,
false, SingleSpc, 4, 1 ,
false},
192{ ARM::VLD1d64QPseudoWB_fixed, ARM::VLD1d64Qwb_fixed,
true,
true,
false, SingleSpc, 4, 1 ,
false},
193{ ARM::VLD1d64QPseudoWB_register, ARM::VLD1d64Qwb_register,
true,
true,
true, SingleSpc, 4, 1 ,
false},
194{ ARM::VLD1d64TPseudo, ARM::VLD1d64T,
true,
false,
false, SingleSpc, 3, 1 ,
false},
195{ ARM::VLD1d64TPseudoWB_fixed, ARM::VLD1d64Twb_fixed,
true,
true,
false, SingleSpc, 3, 1 ,
false},
196{ ARM::VLD1d64TPseudoWB_register, ARM::VLD1d64Twb_register,
true,
true,
true, SingleSpc, 3, 1 ,
false},
198{ ARM::VLD1d8QPseudo, ARM::VLD1d8Q,
true,
false,
false, SingleSpc, 4, 8 ,
false},
199{ ARM::VLD1d8QPseudoWB_fixed, ARM::VLD1d8Qwb_fixed,
true,
true,
false, SingleSpc, 4, 8 ,
false},
200{ ARM::VLD1d8QPseudoWB_register, ARM::VLD1d8Qwb_register,
true,
true,
true, SingleSpc, 4, 8 ,
false},
201{ ARM::VLD1d8TPseudo, ARM::VLD1d8T,
true,
false,
false, SingleSpc, 3, 8 ,
false},
202{ ARM::VLD1d8TPseudoWB_fixed, ARM::VLD1d8Twb_fixed,
true,
true,
false, SingleSpc, 3, 8 ,
false},
203{ ARM::VLD1d8TPseudoWB_register, ARM::VLD1d8Twb_register,
true,
true,
true, SingleSpc, 3, 8 ,
false},
205{ ARM::VLD1q16HighQPseudo, ARM::VLD1d16Q,
true,
false,
false, SingleHighQSpc, 4, 4 ,
false},
206{ ARM::VLD1q16HighQPseudo_UPD, ARM::VLD1d16Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 4 ,
false},
207{ ARM::VLD1q16HighTPseudo, ARM::VLD1d16T,
true,
false,
false, SingleHighTSpc, 3, 4 ,
false},
208{ ARM::VLD1q16HighTPseudo_UPD, ARM::VLD1d16Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 4 ,
false},
209{ ARM::VLD1q16LowQPseudo_UPD, ARM::VLD1d16Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 4 ,
false},
210{ ARM::VLD1q16LowTPseudo_UPD, ARM::VLD1d16Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 4 ,
false},
212{ ARM::VLD1q32HighQPseudo, ARM::VLD1d32Q,
true,
false,
false, SingleHighQSpc, 4, 2 ,
false},
213{ ARM::VLD1q32HighQPseudo_UPD, ARM::VLD1d32Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 2 ,
false},
214{ ARM::VLD1q32HighTPseudo, ARM::VLD1d32T,
true,
false,
false, SingleHighTSpc, 3, 2 ,
false},
215{ ARM::VLD1q32HighTPseudo_UPD, ARM::VLD1d32Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 2 ,
false},
216{ ARM::VLD1q32LowQPseudo_UPD, ARM::VLD1d32Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 2 ,
false},
217{ ARM::VLD1q32LowTPseudo_UPD, ARM::VLD1d32Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 2 ,
false},
219{ ARM::VLD1q64HighQPseudo, ARM::VLD1d64Q,
true,
false,
false, SingleHighQSpc, 4, 1 ,
false},
220{ ARM::VLD1q64HighQPseudo_UPD, ARM::VLD1d64Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 1 ,
false},
221{ ARM::VLD1q64HighTPseudo, ARM::VLD1d64T,
true,
false,
false, SingleHighTSpc, 3, 1 ,
false},
222{ ARM::VLD1q64HighTPseudo_UPD, ARM::VLD1d64Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 1 ,
false},
223{ ARM::VLD1q64LowQPseudo_UPD, ARM::VLD1d64Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 1 ,
false},
224{ ARM::VLD1q64LowTPseudo_UPD, ARM::VLD1d64Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 1 ,
false},
226{ ARM::VLD1q8HighQPseudo, ARM::VLD1d8Q,
true,
false,
false, SingleHighQSpc, 4, 8 ,
false},
227{ ARM::VLD1q8HighQPseudo_UPD, ARM::VLD1d8Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 8 ,
false},
228{ ARM::VLD1q8HighTPseudo, ARM::VLD1d8T,
true,
false,
false, SingleHighTSpc, 3, 8 ,
false},
229{ ARM::VLD1q8HighTPseudo_UPD, ARM::VLD1d8Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 8 ,
false},
230{ ARM::VLD1q8LowQPseudo_UPD, ARM::VLD1d8Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 8 ,
false},
231{ ARM::VLD1q8LowTPseudo_UPD, ARM::VLD1d8Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 8 ,
false},
233{ ARM::VLD2DUPq16EvenPseudo, ARM::VLD2DUPd16x2,
true,
false,
false, EvenDblSpc, 2, 4 ,
false},
234{ ARM::VLD2DUPq16OddPseudo, ARM::VLD2DUPd16x2,
true,
false,
false, OddDblSpc, 2, 4 ,
false},
235{ ARM::VLD2DUPq16OddPseudoWB_fixed, ARM::VLD2DUPd16x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 4 ,
false},
236{ ARM::VLD2DUPq16OddPseudoWB_register, ARM::VLD2DUPd16x2wb_register,
true,
true,
true, OddDblSpc, 2, 4 ,
false},
237{ ARM::VLD2DUPq32EvenPseudo, ARM::VLD2DUPd32x2,
true,
false,
false, EvenDblSpc, 2, 2 ,
false},
238{ ARM::VLD2DUPq32OddPseudo, ARM::VLD2DUPd32x2,
true,
false,
false, OddDblSpc, 2, 2 ,
false},
239{ ARM::VLD2DUPq32OddPseudoWB_fixed, ARM::VLD2DUPd32x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 2 ,
false},
240{ ARM::VLD2DUPq32OddPseudoWB_register, ARM::VLD2DUPd32x2wb_register,
true,
true,
true, OddDblSpc, 2, 2 ,
false},
241{ ARM::VLD2DUPq8EvenPseudo, ARM::VLD2DUPd8x2,
true,
false,
false, EvenDblSpc, 2, 8 ,
false},
242{ ARM::VLD2DUPq8OddPseudo, ARM::VLD2DUPd8x2,
true,
false,
false, OddDblSpc, 2, 8 ,
false},
243{ ARM::VLD2DUPq8OddPseudoWB_fixed, ARM::VLD2DUPd8x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 8 ,
false},
244{ ARM::VLD2DUPq8OddPseudoWB_register, ARM::VLD2DUPd8x2wb_register,
true,
true,
true, OddDblSpc, 2, 8 ,
false},
246{ ARM::VLD2LNd16Pseudo, ARM::VLD2LNd16,
true,
false,
false, SingleSpc, 2, 4 ,
true},
247{ ARM::VLD2LNd16Pseudo_UPD, ARM::VLD2LNd16_UPD,
true,
true,
true, SingleSpc, 2, 4 ,
true},
248{ ARM::VLD2LNd32Pseudo, ARM::VLD2LNd32,
true,
false,
false, SingleSpc, 2, 2 ,
true},
249{ ARM::VLD2LNd32Pseudo_UPD, ARM::VLD2LNd32_UPD,
true,
true,
true, SingleSpc, 2, 2 ,
true},
250{ ARM::VLD2LNd8Pseudo, ARM::VLD2LNd8,
true,
false,
false, SingleSpc, 2, 8 ,
true},
251{ ARM::VLD2LNd8Pseudo_UPD, ARM::VLD2LNd8_UPD,
true,
true,
true, SingleSpc, 2, 8 ,
true},
252{ ARM::VLD2LNq16Pseudo, ARM::VLD2LNq16,
true,
false,
false, EvenDblSpc, 2, 4 ,
true},
253{ ARM::VLD2LNq16Pseudo_UPD, ARM::VLD2LNq16_UPD,
true,
true,
true, EvenDblSpc, 2, 4 ,
true},
254{ ARM::VLD2LNq32Pseudo, ARM::VLD2LNq32,
true,
false,
false, EvenDblSpc, 2, 2 ,
true},
255{ ARM::VLD2LNq32Pseudo_UPD, ARM::VLD2LNq32_UPD,
true,
true,
true, EvenDblSpc, 2, 2 ,
true},
257{ ARM::VLD2q16Pseudo, ARM::VLD2q16,
true,
false,
false, SingleSpc, 4, 4 ,
false},
258{ ARM::VLD2q16PseudoWB_fixed, ARM::VLD2q16wb_fixed,
true,
true,
false, SingleSpc, 4, 4 ,
false},
259{ ARM::VLD2q16PseudoWB_register, ARM::VLD2q16wb_register,
true,
true,
true, SingleSpc, 4, 4 ,
false},
260{ ARM::VLD2q32Pseudo, ARM::VLD2q32,
true,
false,
false, SingleSpc, 4, 2 ,
false},
261{ ARM::VLD2q32PseudoWB_fixed, ARM::VLD2q32wb_fixed,
true,
true,
false, SingleSpc, 4, 2 ,
false},
262{ ARM::VLD2q32PseudoWB_register, ARM::VLD2q32wb_register,
true,
true,
true, SingleSpc, 4, 2 ,
false},
263{ ARM::VLD2q8Pseudo, ARM::VLD2q8,
true,
false,
false, SingleSpc, 4, 8 ,
false},
264{ ARM::VLD2q8PseudoWB_fixed, ARM::VLD2q8wb_fixed,
true,
true,
false, SingleSpc, 4, 8 ,
false},
265{ ARM::VLD2q8PseudoWB_register, ARM::VLD2q8wb_register,
true,
true,
true, SingleSpc, 4, 8 ,
false},
267{ ARM::VLD3DUPd16Pseudo, ARM::VLD3DUPd16,
true,
false,
false, SingleSpc, 3, 4,
true},
268{ ARM::VLD3DUPd16Pseudo_UPD, ARM::VLD3DUPd16_UPD,
true,
true,
true, SingleSpc, 3, 4,
true},
269{ ARM::VLD3DUPd32Pseudo, ARM::VLD3DUPd32,
true,
false,
false, SingleSpc, 3, 2,
true},
270{ ARM::VLD3DUPd32Pseudo_UPD, ARM::VLD3DUPd32_UPD,
true,
true,
true, SingleSpc, 3, 2,
true},
271{ ARM::VLD3DUPd8Pseudo, ARM::VLD3DUPd8,
true,
false,
false, SingleSpc, 3, 8,
true},
272{ ARM::VLD3DUPd8Pseudo_UPD, ARM::VLD3DUPd8_UPD,
true,
true,
true, SingleSpc, 3, 8,
true},
273{ ARM::VLD3DUPq16EvenPseudo, ARM::VLD3DUPq16,
true,
false,
false, EvenDblSpc, 3, 4 ,
true},
274{ ARM::VLD3DUPq16OddPseudo, ARM::VLD3DUPq16,
true,
false,
false, OddDblSpc, 3, 4 ,
true},
275{ ARM::VLD3DUPq16OddPseudo_UPD, ARM::VLD3DUPq16_UPD,
true,
true,
true, OddDblSpc, 3, 4 ,
true},
276{ ARM::VLD3DUPq32EvenPseudo, ARM::VLD3DUPq32,
true,
false,
false, EvenDblSpc, 3, 2 ,
true},
277{ ARM::VLD3DUPq32OddPseudo, ARM::VLD3DUPq32,
true,
false,
false, OddDblSpc, 3, 2 ,
true},
278{ ARM::VLD3DUPq32OddPseudo_UPD, ARM::VLD3DUPq32_UPD,
true,
true,
true, OddDblSpc, 3, 2 ,
true},
279{ ARM::VLD3DUPq8EvenPseudo, ARM::VLD3DUPq8,
true,
false,
false, EvenDblSpc, 3, 8 ,
true},
280{ ARM::VLD3DUPq8OddPseudo, ARM::VLD3DUPq8,
true,
false,
false, OddDblSpc, 3, 8 ,
true},
281{ ARM::VLD3DUPq8OddPseudo_UPD, ARM::VLD3DUPq8_UPD,
true,
true,
true, OddDblSpc, 3, 8 ,
true},
283{ ARM::VLD3LNd16Pseudo, ARM::VLD3LNd16,
true,
false,
false, SingleSpc, 3, 4 ,
true},
284{ ARM::VLD3LNd16Pseudo_UPD, ARM::VLD3LNd16_UPD,
true,
true,
true, SingleSpc, 3, 4 ,
true},
285{ ARM::VLD3LNd32Pseudo, ARM::VLD3LNd32,
true,
false,
false, SingleSpc, 3, 2 ,
true},
286{ ARM::VLD3LNd32Pseudo_UPD, ARM::VLD3LNd32_UPD,
true,
true,
true, SingleSpc, 3, 2 ,
true},
287{ ARM::VLD3LNd8Pseudo, ARM::VLD3LNd8,
true,
false,
false, SingleSpc, 3, 8 ,
true},
288{ ARM::VLD3LNd8Pseudo_UPD, ARM::VLD3LNd8_UPD,
true,
true,
true, SingleSpc, 3, 8 ,
true},
289{ ARM::VLD3LNq16Pseudo, ARM::VLD3LNq16,
true,
false,
false, EvenDblSpc, 3, 4 ,
true},
290{ ARM::VLD3LNq16Pseudo_UPD, ARM::VLD3LNq16_UPD,
true,
true,
true, EvenDblSpc, 3, 4 ,
true},
291{ ARM::VLD3LNq32Pseudo, ARM::VLD3LNq32,
true,
false,
false, EvenDblSpc, 3, 2 ,
true},
292{ ARM::VLD3LNq32Pseudo_UPD, ARM::VLD3LNq32_UPD,
true,
true,
true, EvenDblSpc, 3, 2 ,
true},
294{ ARM::VLD3d16Pseudo, ARM::VLD3d16,
true,
false,
false, SingleSpc, 3, 4 ,
true},
295{ ARM::VLD3d16Pseudo_UPD, ARM::VLD3d16_UPD,
true,
true,
true, SingleSpc, 3, 4 ,
true},
296{ ARM::VLD3d32Pseudo, ARM::VLD3d32,
true,
false,
false, SingleSpc, 3, 2 ,
true},
297{ ARM::VLD3d32Pseudo_UPD, ARM::VLD3d32_UPD,
true,
true,
true, SingleSpc, 3, 2 ,
true},
298{ ARM::VLD3d8Pseudo, ARM::VLD3d8,
true,
false,
false, SingleSpc, 3, 8 ,
true},
299{ ARM::VLD3d8Pseudo_UPD, ARM::VLD3d8_UPD,
true,
true,
true, SingleSpc, 3, 8 ,
true},
301{ ARM::VLD3q16Pseudo_UPD, ARM::VLD3q16_UPD,
true,
true,
true, EvenDblSpc, 3, 4 ,
true},
302{ ARM::VLD3q16oddPseudo, ARM::VLD3q16,
true,
false,
false, OddDblSpc, 3, 4 ,
true},
303{ ARM::VLD3q16oddPseudo_UPD, ARM::VLD3q16_UPD,
true,
true,
true, OddDblSpc, 3, 4 ,
true},
304{ ARM::VLD3q32Pseudo_UPD, ARM::VLD3q32_UPD,
true,
true,
true, EvenDblSpc, 3, 2 ,
true},
305{ ARM::VLD3q32oddPseudo, ARM::VLD3q32,
true,
false,
false, OddDblSpc, 3, 2 ,
true},
306{ ARM::VLD3q32oddPseudo_UPD, ARM::VLD3q32_UPD,
true,
true,
true, OddDblSpc, 3, 2 ,
true},
307{ ARM::VLD3q8Pseudo_UPD, ARM::VLD3q8_UPD,
true,
true,
true, EvenDblSpc, 3, 8 ,
true},
308{ ARM::VLD3q8oddPseudo, ARM::VLD3q8,
true,
false,
false, OddDblSpc, 3, 8 ,
true},
309{ ARM::VLD3q8oddPseudo_UPD, ARM::VLD3q8_UPD,
true,
true,
true, OddDblSpc, 3, 8 ,
true},
311{ ARM::VLD4DUPd16Pseudo, ARM::VLD4DUPd16,
true,
false,
false, SingleSpc, 4, 4,
true},
312{ ARM::VLD4DUPd16Pseudo_UPD, ARM::VLD4DUPd16_UPD,
true,
true,
true, SingleSpc, 4, 4,
true},
313{ ARM::VLD4DUPd32Pseudo, ARM::VLD4DUPd32,
true,
false,
false, SingleSpc, 4, 2,
true},
314{ ARM::VLD4DUPd32Pseudo_UPD, ARM::VLD4DUPd32_UPD,
true,
true,
true, SingleSpc, 4, 2,
true},
315{ ARM::VLD4DUPd8Pseudo, ARM::VLD4DUPd8,
true,
false,
false, SingleSpc, 4, 8,
true},
316{ ARM::VLD4DUPd8Pseudo_UPD, ARM::VLD4DUPd8_UPD,
true,
true,
true, SingleSpc, 4, 8,
true},
317{ ARM::VLD4DUPq16EvenPseudo, ARM::VLD4DUPq16,
true,
false,
false, EvenDblSpc, 4, 4 ,
true},
318{ ARM::VLD4DUPq16OddPseudo, ARM::VLD4DUPq16,
true,
false,
false, OddDblSpc, 4, 4 ,
true},
319{ ARM::VLD4DUPq16OddPseudo_UPD, ARM::VLD4DUPq16_UPD,
true,
true,
true, OddDblSpc, 4, 4 ,
true},
320{ ARM::VLD4DUPq32EvenPseudo, ARM::VLD4DUPq32,
true,
false,
false, EvenDblSpc, 4, 2 ,
true},
321{ ARM::VLD4DUPq32OddPseudo, ARM::VLD4DUPq32,
true,
false,
false, OddDblSpc, 4, 2 ,
true},
322{ ARM::VLD4DUPq32OddPseudo_UPD, ARM::VLD4DUPq32_UPD,
true,
true,
true, OddDblSpc, 4, 2 ,
true},
323{ ARM::VLD4DUPq8EvenPseudo, ARM::VLD4DUPq8,
true,
false,
false, EvenDblSpc, 4, 8 ,
true},
324{ ARM::VLD4DUPq8OddPseudo, ARM::VLD4DUPq8,
true,
false,
false, OddDblSpc, 4, 8 ,
true},
325{ ARM::VLD4DUPq8OddPseudo_UPD, ARM::VLD4DUPq8_UPD,
true,
true,
true, OddDblSpc, 4, 8 ,
true},
327{ ARM::VLD4LNd16Pseudo, ARM::VLD4LNd16,
true,
false,
false, SingleSpc, 4, 4 ,
true},
328{ ARM::VLD4LNd16Pseudo_UPD, ARM::VLD4LNd16_UPD,
true,
true,
true, SingleSpc, 4, 4 ,
true},
329{ ARM::VLD4LNd32Pseudo, ARM::VLD4LNd32,
true,
false,
false, SingleSpc, 4, 2 ,
true},
330{ ARM::VLD4LNd32Pseudo_UPD, ARM::VLD4LNd32_UPD,
true,
true,
true, SingleSpc, 4, 2 ,
true},
331{ ARM::VLD4LNd8Pseudo, ARM::VLD4LNd8,
true,
false,
false, SingleSpc, 4, 8 ,
true},
332{ ARM::VLD4LNd8Pseudo_UPD, ARM::VLD4LNd8_UPD,
true,
true,
true, SingleSpc, 4, 8 ,
true},
333{ ARM::VLD4LNq16Pseudo, ARM::VLD4LNq16,
true,
false,
false, EvenDblSpc, 4, 4 ,
true},
334{ ARM::VLD4LNq16Pseudo_UPD, ARM::VLD4LNq16_UPD,
true,
true,
true, EvenDblSpc, 4, 4 ,
true},
335{ ARM::VLD4LNq32Pseudo, ARM::VLD4LNq32,
true,
false,
false, EvenDblSpc, 4, 2 ,
true},
336{ ARM::VLD4LNq32Pseudo_UPD, ARM::VLD4LNq32_UPD,
true,
true,
true, EvenDblSpc, 4, 2 ,
true},
338{ ARM::VLD4d16Pseudo, ARM::VLD4d16,
true,
false,
false, SingleSpc, 4, 4 ,
true},
339{ ARM::VLD4d16Pseudo_UPD, ARM::VLD4d16_UPD,
true,
true,
true, SingleSpc, 4, 4 ,
true},
340{ ARM::VLD4d32Pseudo, ARM::VLD4d32,
true,
false,
false, SingleSpc, 4, 2 ,
true},
341{ ARM::VLD4d32Pseudo_UPD, ARM::VLD4d32_UPD,
true,
true,
true, SingleSpc, 4, 2 ,
true},
342{ ARM::VLD4d8Pseudo, ARM::VLD4d8,
true,
false,
false, SingleSpc, 4, 8 ,
true},
343{ ARM::VLD4d8Pseudo_UPD, ARM::VLD4d8_UPD,
true,
true,
true, SingleSpc, 4, 8 ,
true},
345{ ARM::VLD4q16Pseudo_UPD, ARM::VLD4q16_UPD,
true,
true,
true, EvenDblSpc, 4, 4 ,
true},
346{ ARM::VLD4q16oddPseudo, ARM::VLD4q16,
true,
false,
false, OddDblSpc, 4, 4 ,
true},
347{ ARM::VLD4q16oddPseudo_UPD, ARM::VLD4q16_UPD,
true,
true,
true, OddDblSpc, 4, 4 ,
true},
348{ ARM::VLD4q32Pseudo_UPD, ARM::VLD4q32_UPD,
true,
true,
true, EvenDblSpc, 4, 2 ,
true},
349{ ARM::VLD4q32oddPseudo, ARM::VLD4q32,
true,
false,
false, OddDblSpc, 4, 2 ,
true},
350{ ARM::VLD4q32oddPseudo_UPD, ARM::VLD4q32_UPD,
true,
true,
true, OddDblSpc, 4, 2 ,
true},
351{ ARM::VLD4q8Pseudo_UPD, ARM::VLD4q8_UPD,
true,
true,
true, EvenDblSpc, 4, 8 ,
true},
352{ ARM::VLD4q8oddPseudo, ARM::VLD4q8,
true,
false,
false, OddDblSpc, 4, 8 ,
true},
353{ ARM::VLD4q8oddPseudo_UPD, ARM::VLD4q8_UPD,
true,
true,
true, OddDblSpc, 4, 8 ,
true},
355{ ARM::VST1LNq16Pseudo, ARM::VST1LNd16,
false,
false,
false, EvenDblSpc, 1, 4 ,
true},
356{ ARM::VST1LNq16Pseudo_UPD, ARM::VST1LNd16_UPD,
false,
true,
true, EvenDblSpc, 1, 4 ,
true},
357{ ARM::VST1LNq32Pseudo, ARM::VST1LNd32,
false,
false,
false, EvenDblSpc, 1, 2 ,
true},
358{ ARM::VST1LNq32Pseudo_UPD, ARM::VST1LNd32_UPD,
false,
true,
true, EvenDblSpc, 1, 2 ,
true},
359{ ARM::VST1LNq8Pseudo, ARM::VST1LNd8,
false,
false,
false, EvenDblSpc, 1, 8 ,
true},
360{ ARM::VST1LNq8Pseudo_UPD, ARM::VST1LNd8_UPD,
false,
true,
true, EvenDblSpc, 1, 8 ,
true},
362{ ARM::VST1d16QPseudo, ARM::VST1d16Q,
false,
false,
false, SingleSpc, 4, 4 ,
false},
363{ ARM::VST1d16QPseudoWB_fixed, ARM::VST1d16Qwb_fixed,
false,
true,
false, SingleSpc, 4, 4 ,
false},
364{ ARM::VST1d16QPseudoWB_register, ARM::VST1d16Qwb_register,
false,
true,
true, SingleSpc, 4, 4 ,
false},
365{ ARM::VST1d16TPseudo, ARM::VST1d16T,
false,
false,
false, SingleSpc, 3, 4 ,
false},
366{ ARM::VST1d16TPseudoWB_fixed, ARM::VST1d16Twb_fixed,
false,
true,
false, SingleSpc, 3, 4 ,
false},
367{ ARM::VST1d16TPseudoWB_register, ARM::VST1d16Twb_register,
false,
true,
true, SingleSpc, 3, 4 ,
false},
369{ ARM::VST1d32QPseudo, ARM::VST1d32Q,
false,
false,
false, SingleSpc, 4, 2 ,
false},
370{ ARM::VST1d32QPseudoWB_fixed, ARM::VST1d32Qwb_fixed,
false,
true,
false, SingleSpc, 4, 2 ,
false},
371{ ARM::VST1d32QPseudoWB_register, ARM::VST1d32Qwb_register,
false,
true,
true, SingleSpc, 4, 2 ,
false},
372{ ARM::VST1d32TPseudo, ARM::VST1d32T,
false,
false,
false, SingleSpc, 3, 2 ,
false},
373{ ARM::VST1d32TPseudoWB_fixed, ARM::VST1d32Twb_fixed,
false,
true,
false, SingleSpc, 3, 2 ,
false},
374{ ARM::VST1d32TPseudoWB_register, ARM::VST1d32Twb_register,
false,
true,
true, SingleSpc, 3, 2 ,
false},
376{ ARM::VST1d64QPseudo, ARM::VST1d64Q,
false,
false,
false, SingleSpc, 4, 1 ,
false},
377{ ARM::VST1d64QPseudoWB_fixed, ARM::VST1d64Qwb_fixed,
false,
true,
false, SingleSpc, 4, 1 ,
false},
378{ ARM::VST1d64QPseudoWB_register, ARM::VST1d64Qwb_register,
false,
true,
true, SingleSpc, 4, 1 ,
false},
379{ ARM::VST1d64TPseudo, ARM::VST1d64T,
false,
false,
false, SingleSpc, 3, 1 ,
false},
380{ ARM::VST1d64TPseudoWB_fixed, ARM::VST1d64Twb_fixed,
false,
true,
false, SingleSpc, 3, 1 ,
false},
381{ ARM::VST1d64TPseudoWB_register, ARM::VST1d64Twb_register,
false,
true,
true, SingleSpc, 3, 1 ,
false},
383{ ARM::VST1d8QPseudo, ARM::VST1d8Q,
false,
false,
false, SingleSpc, 4, 8 ,
false},
384{ ARM::VST1d8QPseudoWB_fixed, ARM::VST1d8Qwb_fixed,
false,
true,
false, SingleSpc, 4, 8 ,
false},
385{ ARM::VST1d8QPseudoWB_register, ARM::VST1d8Qwb_register,
false,
true,
true, SingleSpc, 4, 8 ,
false},
386{ ARM::VST1d8TPseudo, ARM::VST1d8T,
false,
false,
false, SingleSpc, 3, 8 ,
false},
387{ ARM::VST1d8TPseudoWB_fixed, ARM::VST1d8Twb_fixed,
false,
true,
false, SingleSpc, 3, 8 ,
false},
388{ ARM::VST1d8TPseudoWB_register, ARM::VST1d8Twb_register,
false,
true,
true, SingleSpc, 3, 8 ,
false},
390{ ARM::VST1q16HighQPseudo, ARM::VST1d16Q,
false,
false,
false, SingleHighQSpc, 4, 4 ,
false},
391{ ARM::VST1q16HighQPseudo_UPD, ARM::VST1d16Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
392{ ARM::VST1q16HighTPseudo, ARM::VST1d16T,
false,
false,
false, SingleHighTSpc, 3, 4 ,
false},
393{ ARM::VST1q16HighTPseudo_UPD, ARM::VST1d16Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 4 ,
false},
394{ ARM::VST1q16LowQPseudo_UPD, ARM::VST1d16Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 4 ,
false},
395{ ARM::VST1q16LowTPseudo_UPD, ARM::VST1d16Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 4 ,
false},
397{ ARM::VST1q32HighQPseudo, ARM::VST1d32Q,
false,
false,
false, SingleHighQSpc, 4, 2 ,
false},
398{ ARM::VST1q32HighQPseudo_UPD, ARM::VST1d32Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
399{ ARM::VST1q32HighTPseudo, ARM::VST1d32T,
false,
false,
false, SingleHighTSpc, 3, 2 ,
false},
400{ ARM::VST1q32HighTPseudo_UPD, ARM::VST1d32Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 2 ,
false},
401{ ARM::VST1q32LowQPseudo_UPD, ARM::VST1d32Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 2 ,
false},
402{ ARM::VST1q32LowTPseudo_UPD, ARM::VST1d32Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 2 ,
false},
404{ ARM::VST1q64HighQPseudo, ARM::VST1d64Q,
false,
false,
false, SingleHighQSpc, 4, 1 ,
false},
405{ ARM::VST1q64HighQPseudo_UPD, ARM::VST1d64Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
406{ ARM::VST1q64HighTPseudo, ARM::VST1d64T,
false,
false,
false, SingleHighTSpc, 3, 1 ,
false},
407{ ARM::VST1q64HighTPseudo_UPD, ARM::VST1d64Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 1 ,
false},
408{ ARM::VST1q64LowQPseudo_UPD, ARM::VST1d64Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 1 ,
false},
409{ ARM::VST1q64LowTPseudo_UPD, ARM::VST1d64Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 1 ,
false},
411{ ARM::VST1q8HighQPseudo, ARM::VST1d8Q,
false,
false,
false, SingleHighQSpc, 4, 8 ,
false},
412{ ARM::VST1q8HighQPseudo_UPD, ARM::VST1d8Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
413{ ARM::VST1q8HighTPseudo, ARM::VST1d8T,
false,
false,
false, SingleHighTSpc, 3, 8 ,
false},
414{ ARM::VST1q8HighTPseudo_UPD, ARM::VST1d8Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 8 ,
false},
415{ ARM::VST1q8LowQPseudo_UPD, ARM::VST1d8Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 8 ,
false},
416{ ARM::VST1q8LowTPseudo_UPD, ARM::VST1d8Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 8 ,
false},
418{ ARM::VST2LNd16Pseudo, ARM::VST2LNd16,
false,
false,
false, SingleSpc, 2, 4 ,
true},
419{ ARM::VST2LNd16Pseudo_UPD, ARM::VST2LNd16_UPD,
false,
true,
true, SingleSpc, 2, 4 ,
true},
420{ ARM::VST2LNd32Pseudo, ARM::VST2LNd32,
false,
false,
false, SingleSpc, 2, 2 ,
true},
421{ ARM::VST2LNd32Pseudo_UPD, ARM::VST2LNd32_UPD,
false,
true,
true, SingleSpc, 2, 2 ,
true},
422{ ARM::VST2LNd8Pseudo, ARM::VST2LNd8,
false,
false,
false, SingleSpc, 2, 8 ,
true},
423{ ARM::VST2LNd8Pseudo_UPD, ARM::VST2LNd8_UPD,
false,
true,
true, SingleSpc, 2, 8 ,
true},
424{ ARM::VST2LNq16Pseudo, ARM::VST2LNq16,
false,
false,
false, EvenDblSpc, 2, 4,
true},
425{ ARM::VST2LNq16Pseudo_UPD, ARM::VST2LNq16_UPD,
false,
true,
true, EvenDblSpc, 2, 4,
true},
426{ ARM::VST2LNq32Pseudo, ARM::VST2LNq32,
false,
false,
false, EvenDblSpc, 2, 2,
true},
427{ ARM::VST2LNq32Pseudo_UPD, ARM::VST2LNq32_UPD,
false,
true,
true, EvenDblSpc, 2, 2,
true},
429{ ARM::VST2q16Pseudo, ARM::VST2q16,
false,
false,
false, SingleSpc, 4, 4 ,
false},
430{ ARM::VST2q16PseudoWB_fixed, ARM::VST2q16wb_fixed,
false,
true,
false, SingleSpc, 4, 4 ,
false},
431{ ARM::VST2q16PseudoWB_register, ARM::VST2q16wb_register,
false,
true,
true, SingleSpc, 4, 4 ,
false},
432{ ARM::VST2q32Pseudo, ARM::VST2q32,
false,
false,
false, SingleSpc, 4, 2 ,
false},
433{ ARM::VST2q32PseudoWB_fixed, ARM::VST2q32wb_fixed,
false,
true,
false, SingleSpc, 4, 2 ,
false},
434{ ARM::VST2q32PseudoWB_register, ARM::VST2q32wb_register,
false,
true,
true, SingleSpc, 4, 2 ,
false},
435{ ARM::VST2q8Pseudo, ARM::VST2q8,
false,
false,
false, SingleSpc, 4, 8 ,
false},
436{ ARM::VST2q8PseudoWB_fixed, ARM::VST2q8wb_fixed,
false,
true,
false, SingleSpc, 4, 8 ,
false},
437{ ARM::VST2q8PseudoWB_register, ARM::VST2q8wb_register,
false,
true,
true, SingleSpc, 4, 8 ,
false},
439{ ARM::VST3LNd16Pseudo, ARM::VST3LNd16,
false,
false,
false, SingleSpc, 3, 4 ,
true},
440{ ARM::VST3LNd16Pseudo_UPD, ARM::VST3LNd16_UPD,
false,
true,
true, SingleSpc, 3, 4 ,
true},
441{ ARM::VST3LNd32Pseudo, ARM::VST3LNd32,
false,
false,
false, SingleSpc, 3, 2 ,
true},
442{ ARM::VST3LNd32Pseudo_UPD, ARM::VST3LNd32_UPD,
false,
true,
true, SingleSpc, 3, 2 ,
true},
443{ ARM::VST3LNd8Pseudo, ARM::VST3LNd8,
false,
false,
false, SingleSpc, 3, 8 ,
true},
444{ ARM::VST3LNd8Pseudo_UPD, ARM::VST3LNd8_UPD,
false,
true,
true, SingleSpc, 3, 8 ,
true},
445{ ARM::VST3LNq16Pseudo, ARM::VST3LNq16,
false,
false,
false, EvenDblSpc, 3, 4,
true},
446{ ARM::VST3LNq16Pseudo_UPD, ARM::VST3LNq16_UPD,
false,
true,
true, EvenDblSpc, 3, 4,
true},
447{ ARM::VST3LNq32Pseudo, ARM::VST3LNq32,
false,
false,
false, EvenDblSpc, 3, 2,
true},
448{ ARM::VST3LNq32Pseudo_UPD, ARM::VST3LNq32_UPD,
false,
true,
true, EvenDblSpc, 3, 2,
true},
450{ ARM::VST3d16Pseudo, ARM::VST3d16,
false,
false,
false, SingleSpc, 3, 4 ,
true},
451{ ARM::VST3d16Pseudo_UPD, ARM::VST3d16_UPD,
false,
true,
true, SingleSpc, 3, 4 ,
true},
452{ ARM::VST3d32Pseudo, ARM::VST3d32,
false,
false,
false, SingleSpc, 3, 2 ,
true},
453{ ARM::VST3d32Pseudo_UPD, ARM::VST3d32_UPD,
false,
true,
true, SingleSpc, 3, 2 ,
true},
454{ ARM::VST3d8Pseudo, ARM::VST3d8,
false,
false,
false, SingleSpc, 3, 8 ,
true},
455{ ARM::VST3d8Pseudo_UPD, ARM::VST3d8_UPD,
false,
true,
true, SingleSpc, 3, 8 ,
true},
457{ ARM::VST3q16Pseudo_UPD, ARM::VST3q16_UPD,
false,
true,
true, EvenDblSpc, 3, 4 ,
true},
458{ ARM::VST3q16oddPseudo, ARM::VST3q16,
false,
false,
false, OddDblSpc, 3, 4 ,
true},
459{ ARM::VST3q16oddPseudo_UPD, ARM::VST3q16_UPD,
false,
true,
true, OddDblSpc, 3, 4 ,
true},
460{ ARM::VST3q32Pseudo_UPD, ARM::VST3q32_UPD,
false,
true,
true, EvenDblSpc, 3, 2 ,
true},
461{ ARM::VST3q32oddPseudo, ARM::VST3q32,
false,
false,
false, OddDblSpc, 3, 2 ,
true},
462{ ARM::VST3q32oddPseudo_UPD, ARM::VST3q32_UPD,
false,
true,
true, OddDblSpc, 3, 2 ,
true},
463{ ARM::VST3q8Pseudo_UPD, ARM::VST3q8_UPD,
false,
true,
true, EvenDblSpc, 3, 8 ,
true},
464{ ARM::VST3q8oddPseudo, ARM::VST3q8,
false,
false,
false, OddDblSpc, 3, 8 ,
true},
465{ ARM::VST3q8oddPseudo_UPD, ARM::VST3q8_UPD,
false,
true,
true, OddDblSpc, 3, 8 ,
true},
467{ ARM::VST4LNd16Pseudo, ARM::VST4LNd16,
false,
false,
false, SingleSpc, 4, 4 ,
true},
468{ ARM::VST4LNd16Pseudo_UPD, ARM::VST4LNd16_UPD,
false,
true,
true, SingleSpc, 4, 4 ,
true},
469{ ARM::VST4LNd32Pseudo, ARM::VST4LNd32,
false,
false,
false, SingleSpc, 4, 2 ,
true},
470{ ARM::VST4LNd32Pseudo_UPD, ARM::VST4LNd32_UPD,
false,
true,
true, SingleSpc, 4, 2 ,
true},
471{ ARM::VST4LNd8Pseudo, ARM::VST4LNd8,
false,
false,
false, SingleSpc, 4, 8 ,
true},
472{ ARM::VST4LNd8Pseudo_UPD, ARM::VST4LNd8_UPD,
false,
true,
true, SingleSpc, 4, 8 ,
true},
473{ ARM::VST4LNq16Pseudo, ARM::VST4LNq16,
false,
false,
false, EvenDblSpc, 4, 4,
true},
474{ ARM::VST4LNq16Pseudo_UPD, ARM::VST4LNq16_UPD,
false,
true,
true, EvenDblSpc, 4, 4,
true},
475{ ARM::VST4LNq32Pseudo, ARM::VST4LNq32,
false,
false,
false, EvenDblSpc, 4, 2,
true},
476{ ARM::VST4LNq32Pseudo_UPD, ARM::VST4LNq32_UPD,
false,
true,
true, EvenDblSpc, 4, 2,
true},
478{ ARM::VST4d16Pseudo, ARM::VST4d16,
false,
false,
false, SingleSpc, 4, 4 ,
true},
479{ ARM::VST4d16Pseudo_UPD, ARM::VST4d16_UPD,
false,
true,
true, SingleSpc, 4, 4 ,
true},
480{ ARM::VST4d32Pseudo, ARM::VST4d32,
false,
false,
false, SingleSpc, 4, 2 ,
true},
481{ ARM::VST4d32Pseudo_UPD, ARM::VST4d32_UPD,
false,
true,
true, SingleSpc, 4, 2 ,
true},
482{ ARM::VST4d8Pseudo, ARM::VST4d8,
false,
false,
false, SingleSpc, 4, 8 ,
true},
483{ ARM::VST4d8Pseudo_UPD, ARM::VST4d8_UPD,
false,
true,
true, SingleSpc, 4, 8 ,
true},
485{ ARM::VST4q16Pseudo_UPD, ARM::VST4q16_UPD,
false,
true,
true, EvenDblSpc, 4, 4 ,
true},
486{ ARM::VST4q16oddPseudo, ARM::VST4q16,
false,
false,
false, OddDblSpc, 4, 4 ,
true},
487{ ARM::VST4q16oddPseudo_UPD, ARM::VST4q16_UPD,
false,
true,
true, OddDblSpc, 4, 4 ,
true},
488{ ARM::VST4q32Pseudo_UPD, ARM::VST4q32_UPD,
false,
true,
true, EvenDblSpc, 4, 2 ,
true},
489{ ARM::VST4q32oddPseudo, ARM::VST4q32,
false,
false,
false, OddDblSpc, 4, 2 ,
true},
490{ ARM::VST4q32oddPseudo_UPD, ARM::VST4q32_UPD,
false,
true,
true, OddDblSpc, 4, 2 ,
true},
491{ ARM::VST4q8Pseudo_UPD, ARM::VST4q8_UPD,
false,
true,
true, EvenDblSpc, 4, 8 ,
true},
492{ ARM::VST4q8oddPseudo, ARM::VST4q8,
false,
false,
false, OddDblSpc, 4, 8 ,
true},
493{ ARM::VST4q8oddPseudo_UPD, ARM::VST4q8_UPD,
false,
true,
true, OddDblSpc, 4, 8 ,
true}
501 static std::atomic<bool> TableChecked(
false);
502 if (!TableChecked.load(std::memory_order_relaxed)) {
504 TableChecked.store(
true, std::memory_order_relaxed);
520 if (RegSpc == SingleSpc || RegSpc == SingleLowSpc) {
521 D0 =
TRI->getSubReg(Reg, ARM::dsub_0);
522 D1 =
TRI->getSubReg(Reg, ARM::dsub_1);
523 D2 =
TRI->getSubReg(Reg, ARM::dsub_2);
524 D3 =
TRI->getSubReg(Reg, ARM::dsub_3);
525 }
else if (RegSpc == SingleHighQSpc) {
526 D0 =
TRI->getSubReg(Reg, ARM::dsub_4);
527 D1 =
TRI->getSubReg(Reg, ARM::dsub_5);
528 D2 =
TRI->getSubReg(Reg, ARM::dsub_6);
529 D3 =
TRI->getSubReg(Reg, ARM::dsub_7);
530 }
else if (RegSpc == SingleHighTSpc) {
531 D0 =
TRI->getSubReg(Reg, ARM::dsub_3);
532 D1 =
TRI->getSubReg(Reg, ARM::dsub_4);
533 D2 =
TRI->getSubReg(Reg, ARM::dsub_5);
534 D3 =
TRI->getSubReg(Reg, ARM::dsub_6);
535 }
else if (RegSpc == EvenDblSpc) {
536 D0 =
TRI->getSubReg(Reg, ARM::dsub_0);
537 D1 =
TRI->getSubReg(Reg, ARM::dsub_2);
538 D2 =
TRI->getSubReg(Reg, ARM::dsub_4);
539 D3 =
TRI->getSubReg(Reg, ARM::dsub_6);
541 assert(RegSpc == OddDblSpc &&
"unknown register spacing");
542 D0 =
TRI->getSubReg(Reg, ARM::dsub_1);
543 D1 =
TRI->getSubReg(Reg, ARM::dsub_3);
544 D2 =
TRI->getSubReg(Reg, ARM::dsub_5);
545 D3 =
TRI->getSubReg(Reg, ARM::dsub_7);
558 NEONRegSpacing RegSpc = (NEONRegSpacing)
TableEntry->RegSpacing;
565 bool DstIsDead =
MI.getOperand(
OpIdx).isDead();
568 bool IsVLD2DUP =
TableEntry->RealOpc == ARM::VLD2DUPd8x2 ||
571 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_fixed ||
572 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_fixed ||
573 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_fixed ||
574 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_register ||
575 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_register ||
576 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_register;
579 unsigned SubRegIndex;
580 if (RegSpc == EvenDblSpc) {
581 SubRegIndex = ARM::dsub_0;
583 assert(RegSpc == OddDblSpc &&
"Unexpected spacing!");
584 SubRegIndex = ARM::dsub_1;
588 TRI->getMatchingSuperReg(
SubReg, ARM::dsub_0, &ARM::DPairSpcRegClass);
594 if (NumRegs > 1 &&
TableEntry->copyAllListRegs)
596 if (NumRegs > 2 &&
TableEntry->copyAllListRegs)
598 if (NumRegs > 3 &&
TableEntry->copyAllListRegs)
603 MIB.add(
MI.getOperand(
OpIdx++));
606 MIB.add(
MI.getOperand(
OpIdx++));
607 MIB.add(
MI.getOperand(
OpIdx++));
619 if (
TableEntry->RealOpc == ARM::VLD1d8Qwb_fixed ||
620 TableEntry->RealOpc == ARM::VLD1d16Qwb_fixed ||
621 TableEntry->RealOpc == ARM::VLD1d32Qwb_fixed ||
622 TableEntry->RealOpc == ARM::VLD1d64Qwb_fixed ||
623 TableEntry->RealOpc == ARM::VLD1d8Twb_fixed ||
624 TableEntry->RealOpc == ARM::VLD1d16Twb_fixed ||
625 TableEntry->RealOpc == ARM::VLD1d32Twb_fixed ||
626 TableEntry->RealOpc == ARM::VLD1d64Twb_fixed ||
627 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_fixed ||
628 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_fixed ||
629 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_fixed) {
631 "A fixed writing-back pseudo instruction provides an offset "
641 unsigned SrcOpIdx = 0;
642 if (RegSpc == EvenDblSpc || RegSpc == OddDblSpc || RegSpc == SingleLowSpc ||
643 RegSpc == SingleHighQSpc || RegSpc == SingleHighTSpc)
647 MIB.add(
MI.getOperand(
OpIdx++));
648 MIB.add(
MI.getOperand(
OpIdx++));
659 MIB.copyImplicitOps(
MI);
662 MIB.cloneMemRefs(
MI);
663 MI.eraseFromParent();
676 NEONRegSpacing RegSpc = (NEONRegSpacing)
TableEntry->RegSpacing;
683 MIB.add(
MI.getOperand(
OpIdx++));
686 MIB.add(
MI.getOperand(
OpIdx++));
687 MIB.add(
MI.getOperand(
OpIdx++));
698 if (
TableEntry->RealOpc == ARM::VST1d8Qwb_fixed ||
699 TableEntry->RealOpc == ARM::VST1d16Qwb_fixed ||
700 TableEntry->RealOpc == ARM::VST1d32Qwb_fixed ||
701 TableEntry->RealOpc == ARM::VST1d64Qwb_fixed ||
702 TableEntry->RealOpc == ARM::VST1d8Twb_fixed ||
703 TableEntry->RealOpc == ARM::VST1d16Twb_fixed ||
704 TableEntry->RealOpc == ARM::VST1d32Twb_fixed ||
705 TableEntry->RealOpc == ARM::VST1d64Twb_fixed) {
707 "A fixed writing-back pseudo instruction provides an offset "
714 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
715 bool SrcIsUndef =
MI.getOperand(
OpIdx).isUndef();
720 if (NumRegs > 1 &&
TableEntry->copyAllListRegs)
722 if (NumRegs > 2 &&
TableEntry->copyAllListRegs)
724 if (NumRegs > 3 &&
TableEntry->copyAllListRegs)
728 MIB.add(
MI.getOperand(
OpIdx++));
729 MIB.add(
MI.getOperand(
OpIdx++));
731 if (SrcIsKill && !SrcIsUndef)
732 MIB->addRegisterKilled(SrcReg,
TRI,
true);
733 else if (!SrcIsUndef)
735 MIB.copyImplicitOps(
MI);
738 MIB.cloneMemRefs(
MI);
739 MI.eraseFromParent();
752 NEONRegSpacing RegSpc = (NEONRegSpacing)
TableEntry->RegSpacing;
761 unsigned Lane =
MI.getOperand(
MI.getDesc().getNumOperands() - 3).
getImm();
764 assert(RegSpc != OddDblSpc &&
"unexpected register spacing for VLD/VST-lane");
765 if (RegSpc == EvenDblSpc && Lane >= RegElts) {
769 assert(Lane < RegElts &&
"out of range lane for VLD/VST-lane");
773 bool DstIsDead =
false;
775 DstIsDead =
MI.getOperand(
OpIdx).isDead();
776 DstReg =
MI.getOperand(
OpIdx++).getReg();
788 MIB.add(
MI.getOperand(
OpIdx++));
791 MIB.add(
MI.getOperand(
OpIdx++));
792 MIB.add(
MI.getOperand(
OpIdx++));
795 MIB.add(
MI.getOperand(
OpIdx++));
805 MIB.addReg(D0, SrcFlags);
807 MIB.addReg(D1, SrcFlags);
809 MIB.addReg(D2, SrcFlags);
811 MIB.addReg(D3, SrcFlags);
818 MIB.add(
MI.getOperand(
OpIdx++));
819 MIB.add(
MI.getOperand(
OpIdx++));
827 MIB.copyImplicitOps(
MI);
829 MIB.cloneMemRefs(
MI);
830 MI.eraseFromParent();
836 unsigned Opc,
bool IsExt) {
851 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
868 MI.eraseFromParent();
876 MI.getOpcode() == ARM::MQQPRStore ||
MI.getOpcode() == ARM::MQQQQPRStore
887 MIB.
add(
MI.getOperand(1));
889 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_0), Flags);
890 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_1), Flags);
891 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_2), Flags);
892 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_3), Flags);
893 if (
MI.getOpcode() == ARM::MQQQQPRStore ||
894 MI.getOpcode() == ARM::MQQQQPRLoad) {
895 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_4), Flags);
896 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_5), Flags);
897 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_6), Flags);
898 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_7), Flags);
901 if (NewOpc == ARM::VSTMDIA)
906 MI.eraseFromParent();
954 unsigned TargetFlag) {
958 unsigned Imm = MO.
getImm();
959 switch (TargetFlag) {
961 Imm = (Imm >> 24) & 0xff;
964 Imm = (Imm >> 16) & 0xff;
967 Imm = (Imm >> 8) & 0xff;
973 Imm = (Imm >> 16) & 0xffff;
996 bool DstIsDead =
MI.getOperand(0).isDead();
998 unsigned MIFlags =
MI.getFlags();
1007 unsigned PendingShift = 0;
1008 for (
unsigned Byte = 0;
Byte < 4; ++
Byte) {
1014 bool ZeroImm = Operand.
isImm() && Operand.
getImm() == 0;
1015 unsigned Op = PendingShift ? ARM::tADDi8 : ARM::tMOVi8;
1019 if (PendingShift && (!ZeroImm || Byte == 3)) {
1037 if (
Op == ARM::tADDi8)
1047 if (PendingShift || !ZeroImm)
1053 (--
MBBI)->getOperand(0).setIsDead(DstIsDead);
1055 MI.eraseFromParent();
1061 unsigned Opcode =
MI.getOpcode();
1065 bool DstIsDead =
MI.getOperand(0).isDead();
1066 bool isCC = Opcode == ARM::MOVCCi32imm || Opcode == ARM::t2MOVCCi32imm;
1072 if (!STI->hasV6T2Ops() &&
1073 (Opcode == ARM::MOVi32imm || Opcode == ARM::MOVCCi32imm)) {
1075 assert(!STI->isTargetWindows() &&
"Windows on ARM requires ARMv7+");
1077 assert (MO.
isImm() &&
"MOVi32imm w/ non-immediate source operand!");
1079 unsigned SOImmValV1 = 0, SOImmValV2 = 0;
1095 SOImmValV1 = ~(-SOImmValV1);
1098 unsigned MIFlags =
MI.getFlags();
1099 LO16 = LO16.
addImm(SOImmValV1);
1100 HI16 = HI16.
addImm(SOImmValV2);
1111 MI.eraseFromParent();
1115 unsigned LO16Opc = 0;
1116 unsigned HI16Opc = 0;
1117 unsigned MIFlags =
MI.getFlags();
1118 if (Opcode == ARM::t2MOVi32imm || Opcode == ARM::t2MOVCCi32imm) {
1119 LO16Opc = ARM::t2MOVi16;
1120 HI16Opc = ARM::t2MOVTi16;
1122 LO16Opc = ARM::MOVi16;
1123 HI16Opc = ARM::MOVTi16;
1137 if (!(HIOperand.isImm() && HIOperand.getImm() == 0)) {
1142 HI16.
add(HIOperand);
1151 if (RequiresBundling)
1154 MI.eraseFromParent();
1162 const std::initializer_list<unsigned> &Regs,
1166 if (!
Op.isReg() || !
Op.isUse())
1172 std::set_difference(Regs.begin(), Regs.end(), OpRegs.
begin(), OpRegs.
end(),
1173 std::back_inserter(ClearRegs));
1176void ARMExpandPseudo::CMSEClearGPRegs(
1179 unsigned ClobberReg) {
1181 if (STI->hasV8_1MMainlineOps()) {
1185 for (
unsigned R : ClearRegs)
1192 for (
unsigned Reg : ClearRegs) {
1193 if (Reg == ClobberReg)
1201 .
addImm(STI->hasDSP() ? 0xc00 : 0x800)
1220 if ((Reg >= ARM::Q0 && Reg <= ARM::Q7) ||
1221 (Reg >= ARM::D0 && Reg <= ARM::D15) ||
1222 (Reg >= ARM::S0 && Reg <= ARM::S31))
1227 if (Reg >= ARM::Q0 && Reg <= ARM::Q7) {
1228 int R = Reg - ARM::Q0;
1229 ClearRegs.
reset(R * 4, (R + 1) * 4);
1230 }
else if (Reg >= ARM::D0 && Reg <= ARM::D15) {
1231 int R = Reg - ARM::D0;
1232 ClearRegs.
reset(R * 2, (R + 1) * 2);
1233 }
else if (Reg >= ARM::S0 && Reg <= ARM::S31) {
1234 ClearRegs[Reg - ARM::S0] =
false;
1246 if (STI->hasV8_1MMainlineOps())
1247 return CMSEClearFPRegsV81(
MBB,
MBBI, ClearRegs);
1249 return CMSEClearFPRegsV8(
MBB,
MBBI, ClearRegs);
1258 if (!STI->hasFPRegs())
1268 if (STI->hasMinSize()) {
1269 ClearBB = DoneBB = &
MBB;
1290 if (Reg == ARM::NoRegister || Reg == ARM::LR)
1292 assert(
Reg.isPhysical() &&
"Unallocated register");
1316 for (
unsigned D = 0;
D < 8;
D++) {
1318 if (ClearRegs[
D * 2 + 0] && ClearRegs[
D * 2 + 1]) {
1319 unsigned Reg = ARM::D0 +
D;
1326 if (ClearRegs[
D * 2 + 0]) {
1327 unsigned Reg = ARM::S0 +
D * 2;
1333 if (ClearRegs[
D * 2 + 1]) {
1334 unsigned Reg = ARM::S0 +
D * 2 + 1;
1371 int Start = -1,
End = -1;
1372 for (
int S = 0, E = ClearRegs.
size(); S != E; ++S) {
1373 if (ClearRegs[S] && S ==
End + 1) {
1382 while (++Start <=
End)
1393 while (++Start <=
End)
1401void ARMExpandPseudo::CMSESaveClearFPRegs(
1404 if (STI->hasV8_1MMainlineOps())
1405 CMSESaveClearFPRegsV81(
MBB,
MBBI,
DL, LiveRegs);
1406 else if (STI->hasV8MMainlineOps())
1407 CMSESaveClearFPRegsV8(
MBB,
MBBI,
DL, LiveRegs, ScratchRegs);
1411void ARMExpandPseudo::CMSESaveClearFPRegsV8(
1417 unsigned SpareReg = ScratchRegs.
front();
1426 std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs;
1427 std::vector<unsigned> NonclearedFPRegs;
1428 bool ReturnsFPReg =
false;
1430 if (
Op.isReg() &&
Op.isUse()) {
1433 ARM::DPR_VFP2RegClass.
contains(Reg));
1435 if (ARM::DPR_VFP2RegClass.
contains(Reg)) {
1436 if (ScratchRegs.
size() >= 2) {
1439 ClearedFPRegs.emplace_back(Reg, SaveReg1, SaveReg2);
1448 NonclearedFPRegs.push_back(Reg);
1450 }
else if (ARM::SPRRegClass.
contains(Reg)) {
1451 if (ScratchRegs.
size() >= 1) {
1453 ClearedFPRegs.emplace_back(Reg, SaveReg, 0);
1460 NonclearedFPRegs.push_back(Reg);
1463 }
else if (
Op.isReg() &&
Op.isDef()) {
1467 ReturnsFPReg =
true;
1471 bool PassesFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty());
1473 if (PassesFPReg || ReturnsFPReg)
1474 assert(STI->hasFPRegs() &&
"Subtarget needs fpregs");
1500 if (ReturnsFPReg && !PassesFPReg) {
1501 bool S0Dead = !LiveRegs.contains(ARM::S0);
1525 for (
const auto &Regs : ClearedFPRegs) {
1526 unsigned Reg, SaveReg1, SaveReg2;
1527 std::tie(Reg, SaveReg1, SaveReg2) = Regs;
1528 if (ARM::DPR_VFP2RegClass.
contains(Reg))
1533 else if (ARM::SPRRegClass.
contains(Reg))
1539 for (
unsigned Reg : NonclearedFPRegs) {
1540 if (ARM::DPR_VFP2RegClass.
contains(Reg)) {
1541 if (STI->isLittle()) {
1544 .
addImm((Reg - ARM::D0) * 2)
1552 .
addImm((Reg - ARM::D0) * 2)
1556 .
addImm((Reg - ARM::D0) * 2 + 1)
1559 }
else if (ARM::SPRRegClass.
contains(Reg)) {
1602 if (!DefFP && ClearRegs.
count() == ClearRegs.
size()) {
1629 for (
unsigned Reg = ARM::S16;
Reg <= ARM::S31; ++
Reg)
1633 (void)CMSEClearFPRegsV81(
MBB,
MBBI, ClearRegs);
1644void ARMExpandPseudo::CMSERestoreFPRegs(
1647 if (STI->hasV8_1MMainlineOps())
1648 CMSERestoreFPRegsV81(
MBB,
MBBI,
DL, AvailableRegs);
1649 else if (STI->hasV8MMainlineOps())
1650 CMSERestoreFPRegsV8(
MBB,
MBBI,
DL, AvailableRegs);
1653void ARMExpandPseudo::CMSERestoreFPRegsV8(
1658 unsigned ScratchReg = ARM::NoRegister;
1659 if (STI->fixCMSE_CVE_2021_35465())
1663 std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs;
1664 std::vector<unsigned> NonclearedFPRegs;
1666 if (
Op.isReg() &&
Op.isDef()) {
1669 ARM::DPR_VFP2RegClass.
contains(Reg));
1671 if (ARM::DPR_VFP2RegClass.
contains(Reg)) {
1672 if (AvailableRegs.
size() >= 2) {
1675 ClearedFPRegs.emplace_back(Reg, SaveReg1, SaveReg2);
1684 NonclearedFPRegs.push_back(Reg);
1686 }
else if (ARM::SPRRegClass.
contains(Reg)) {
1687 if (AvailableRegs.
size() >= 1) {
1689 ClearedFPRegs.emplace_back(Reg, SaveReg, 0);
1696 NonclearedFPRegs.push_back(Reg);
1702 bool returnsFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty());
1705 assert(STI->hasFPRegs() &&
"Subtarget needs fpregs");
1708 for (
unsigned Reg : NonclearedFPRegs) {
1709 if (ARM::DPR_VFP2RegClass.
contains(Reg))
1713 .
addImm((Reg - ARM::D0) * 2)
1715 else if (ARM::SPRRegClass.
contains(Reg))
1732 if (STI->fixCMSE_CVE_2021_35465()) {
1752 if (STI->hasFPRegs())
1765 for (
const auto &Regs : ClearedFPRegs) {
1766 unsigned Reg, SaveReg1, SaveReg2;
1767 std::tie(Reg, SaveReg1, SaveReg2) = Regs;
1768 if (ARM::DPR_VFP2RegClass.
contains(Reg))
1773 else if (ARM::SPRRegClass.
contains(Reg))
1791 if ((Reg >= ARM::Q0 && Reg <= ARM::Q7) ||
1792 (Reg >= ARM::D0 && Reg <= ARM::D15) ||
1793 (Reg >= ARM::S0 && Reg <= ARM::S31))
1799void ARMExpandPseudo::CMSERestoreFPRegsV81(
1803 if (STI->fixCMSE_CVE_2021_35465()) {
1834 for (
unsigned Reg = ARM::S16;
Reg <= ARM::S31; ++
Reg)
1844 unsigned LdrexOp,
unsigned StrexOp,
1847 bool IsThumb = STI->isThumb();
1848 bool IsThumb1Only = STI->isThumb1Only();
1852 Register TempReg =
MI.getOperand(1).getReg();
1855 assert(!
MI.getOperand(2).isUndef() &&
"cannot handle undef");
1856 Register AddrReg =
MI.getOperand(2).getReg();
1857 Register DesiredReg =
MI.getOperand(3).getReg();
1861 assert(STI->hasV8MBaselineOps() &&
1862 "CMP_SWAP not expected to be custom expanded for Thumb1");
1863 assert((UxtOp == 0 || UxtOp == ARM::tUXTB || UxtOp == ARM::tUXTH) &&
1864 "ARMv8-M.baseline does not have t2UXTB/t2UXTH");
1866 "DesiredReg used for UXT op must be tGPR");
1875 MF->
insert(++LoadCmpBB->getIterator(), StoreBB);
1876 MF->
insert(++StoreBB->getIterator(), DoneBB);
1895 if (LdrexOp == ARM::t2LDREX)
1899 unsigned CMPrr = IsThumb ? ARM::tCMPhir : ARM::CMPrr;
1904 unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;
1909 LoadCmpBB->addSuccessor(DoneBB);
1910 LoadCmpBB->addSuccessor(StoreBB);
1919 if (StrexOp == ARM::t2STREX)
1924 IsThumb ? (IsThumb1Only ? ARM::tCMPi8 : ARM::t2CMPri) : ARM::CMPri;
1933 StoreBB->addSuccessor(LoadCmpBB);
1934 StoreBB->addSuccessor(DoneBB);
1942 MI.eraseFromParent();
1950 StoreBB->clearLiveIns();
1952 LoadCmpBB->clearLiveIns();
1962 unsigned Flags,
bool IsThumb,
1965 Register RegLo =
TRI->getSubReg(Reg.getReg(), ARM::gsub_0);
1966 Register RegHi =
TRI->getSubReg(Reg.getReg(), ARM::gsub_1);
1967 MIB.
addReg(RegLo, Flags);
1968 MIB.
addReg(RegHi, Flags);
1970 MIB.
addReg(Reg.getReg(), Flags);
1977 bool IsThumb = STI->isThumb();
1978 assert(!STI->isThumb1Only() &&
"CMP_SWAP_64 unsupported under Thumb1!");
1984 assert(!
MI.getOperand(1).isUndef() &&
"cannot handle undef");
1985 Register AddrAndTempReg =
MI.getOperand(1).getReg();
1986 Register AddrReg =
TRI->getSubReg(AddrAndTempReg, ARM::gsub_0);
1987 Register TempReg =
TRI->getSubReg(AddrAndTempReg, ARM::gsub_1);
1988 assert(
MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg() &&
1989 "tied operands have different registers");
1990 Register DesiredReg =
MI.getOperand(3).getReg();
1992 New.setIsKill(
false);
1996 Register DesiredLo =
TRI->getSubReg(DesiredReg, ARM::gsub_0);
1997 Register DesiredHi =
TRI->getSubReg(DesiredReg, ARM::gsub_1);
2005 MF->
insert(++LoadCmpBB->getIterator(), StoreBB);
2006 MF->
insert(++StoreBB->getIterator(), DoneBB);
2013 unsigned LDREXD = IsThumb ? ARM::t2LDREXD : ARM::LDREXD;
2019 unsigned CMPrr = IsThumb ? ARM::tCMPhir : ARM::CMPrr;
2030 unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;
2035 LoadCmpBB->addSuccessor(DoneBB);
2036 LoadCmpBB->addSuccessor(StoreBB);
2042 unsigned STREXD = IsThumb ? ARM::t2STREXD : ARM::STREXD;
2048 unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
2057 StoreBB->addSuccessor(LoadCmpBB);
2058 StoreBB->addSuccessor(DoneBB);
2066 MI.eraseFromParent();
2074 StoreBB->clearLiveIns();
2076 LoadCmpBB->clearLiveIns();
2091 for (
unsigned Reg = ARM::R4; Reg < ARM::R8; ++Reg) {
2103 for (
unsigned LoReg = ARM::R7, HiReg = ARM::R11; LoReg >= ARM::R4;
2105 if (JumpReg == LoReg)
2114 for (
unsigned Reg = ARM::R4; Reg < ARM::R8; ++Reg) {
2123 if (JumpReg >= ARM::R4 && JumpReg <= ARM::R7) {
2124 Register LoReg = JumpReg == ARM::R4 ? ARM::R5 : ARM::R4;
2137 for (
unsigned Reg = ARM::R4; Reg < ARM::R12; ++Reg) {
2152 for (
int R = 0; R < 4; ++R) {
2160 for (
int R = 0; R < 4; ++R)
2167 for (
unsigned Reg = ARM::R4; Reg < ARM::R12; ++Reg)
2176 unsigned Opcode =
MI.getOpcode();
2184 if (DstReg ==
MI.getOperand(3).getReg()) {
2186 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBITd : ARM::VBITq;
2188 .
add(
MI.getOperand(0))
2189 .
add(
MI.getOperand(3))
2190 .
add(
MI.getOperand(2))
2191 .
add(
MI.getOperand(1))
2193 .
add(
MI.getOperand(5));
2194 }
else if (DstReg ==
MI.getOperand(2).getReg()) {
2196 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBIFd : ARM::VBIFq;
2198 .
add(
MI.getOperand(0))
2199 .
add(
MI.getOperand(2))
2200 .
add(
MI.getOperand(3))
2201 .
add(
MI.getOperand(1))
2203 .
add(
MI.getOperand(5));
2206 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBSLd : ARM::VBSLq;
2207 if (DstReg ==
MI.getOperand(1).getReg()) {
2209 .
add(
MI.getOperand(0))
2210 .
add(
MI.getOperand(1))
2211 .
add(
MI.getOperand(2))
2212 .
add(
MI.getOperand(3))
2214 .
add(
MI.getOperand(5));
2217 unsigned MoveOpc = Opcode == ARM::VBSPd ? ARM::VORRd : ARM::VORRq;
2218 unsigned MO1Flags =
getRegState(
MI.getOperand(1)) & ~RegState::Kill;
2223 .
addReg(
MI.getOperand(1).getReg(), MO1Flags)
2224 .
addReg(
MI.getOperand(1).getReg(), MO1Flags)
2226 .
add(
MI.getOperand(5));
2228 .
add(
MI.getOperand(0))
2232 .
add(
MI.getOperand(2))
2233 .
add(
MI.getOperand(3))
2235 .
add(
MI.getOperand(5));
2238 MI.eraseFromParent();
2242 case ARM::TCRETURNdi:
2243 case ARM::TCRETURNri:
2244 case ARM::TCRETURNrinotr12: {
2246 if (
MBBI->getOpcode() == ARM::SEH_EpilogEnd)
2248 if (
MBBI->getOpcode() == ARM::SEH_Nop_Ret)
2251 "Can only insert epilog into returning blocks");
2252 unsigned RetOpcode =
MBBI->getOpcode();
2259 if (
MBBI->getOpcode() == ARM::SEH_EpilogEnd)
2261 if (
MBBI->getOpcode() == ARM::SEH_Nop_Ret)
2266 if (RetOpcode == ARM::TCRETURNdi) {
2272 ? ((STI->isTargetMachO() || NeedsWinCFI) ? ARM::tTAILJMPd
2288 }
else if (RetOpcode == ARM::TCRETURNri ||
2289 RetOpcode == ARM::TCRETURNrinotr12) {
2291 STI->isThumb() ? ARM::tTAILJMPr
2292 : (STI->hasV4TOps() ? ARM::TAILJMPr : ARM::TAILJMPr4);
2298 auto NewMI = std::prev(
MBBI);
2299 for (
unsigned i = 2, e =
MBBI->getNumOperands(); i != e; ++i)
2300 NewMI->addOperand(
MBBI->getOperand(i));
2303 if (
MI.isCandidateForAdditionalCallInfo())
2304 MI.getMF()->moveAdditionalCallInfo(&
MI, &*NewMI);
2313 case ARM::tBXNS_RET: {
2316 if (!STI->hasV8_1MMainlineOps() && AFI->shouldSignReturnAddress())
2321 if (STI->hasV8_1MMainlineOps()) {
2324 TII->get(ARM::VLDR_FPCXTNS_post), ARM::SP)
2329 if (AFI->shouldSignReturnAddress())
2335 return !Op.isReg() || Op.getReg() != ARM::R12;
2339 *
MBBI, {ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R12}, ClearRegs);
2340 CMSEClearGPRegs(AfterBB, AfterBB.
end(),
MBBI->getDebugLoc(), ClearRegs,
2345 TII->get(ARM::tBXNS))
2350 MI.eraseFromParent();
2353 case ARM::tBLXNS_CALL: {
2362 LiveRegs.addLiveOuts(
MBB);
2364 LiveRegs.stepBackward(
MI);
2365 LiveRegs.stepBackward(*
MBBI);
2368 AFI->isThumb1OnlyFunction());
2372 {ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R4,
2373 ARM::R5, ARM::R6, ARM::R7, ARM::R8, ARM::R9,
2374 ARM::R10, ARM::R11, ARM::R12},
2376 auto OriginalClearRegs = ClearRegs;
2380 unsigned ScratchReg = ClearRegs.
front();
2383 if (AFI->isThumb2Function()) {
2404 CMSESaveClearFPRegs(
MBB,
MBBI,
DL, LiveRegs,
2406 CMSEClearGPRegs(
MBB,
MBBI,
DL, ClearRegs, JumpReg);
2415 if (
MI.isCandidateForAdditionalCallInfo())
2416 MI.getMF()->moveAdditionalCallInfo(&
MI, NewCall.
getInstr());
2418 CMSERestoreFPRegs(
MBB,
MBBI,
DL, OriginalClearRegs);
2422 MI.eraseFromParent();
2427 case ARM::VMOVDcc: {
2428 unsigned newOpc = Opcode != ARM::VMOVDcc ? ARM::VMOVS : ARM::VMOVD;
2430 MI.getOperand(1).getReg())
2431 .
add(
MI.getOperand(2))
2433 .
add(
MI.getOperand(4))
2436 MI.eraseFromParent();
2441 unsigned Opc = AFI->isThumbFunction() ? ARM::t2MOVr : ARM::MOVr;
2443 MI.getOperand(1).getReg())
2444 .
add(
MI.getOperand(2))
2446 .
add(
MI.getOperand(4))
2450 MI.eraseFromParent();
2453 case ARM::MOVCCsi: {
2455 (
MI.getOperand(1).getReg()))
2456 .
add(
MI.getOperand(2))
2459 .
add(
MI.getOperand(5))
2463 MI.eraseFromParent();
2466 case ARM::MOVCCsr: {
2468 (
MI.getOperand(1).getReg()))
2469 .
add(
MI.getOperand(2))
2470 .
add(
MI.getOperand(3))
2473 .
add(
MI.getOperand(6))
2477 MI.eraseFromParent();
2480 case ARM::t2MOVCCi16:
2481 case ARM::MOVCCi16: {
2482 unsigned NewOpc = AFI->isThumbFunction() ? ARM::t2MOVi16 : ARM::MOVi16;
2484 MI.getOperand(1).getReg())
2487 .
add(
MI.getOperand(4))
2489 MI.eraseFromParent();
2494 unsigned Opc = AFI->isThumbFunction() ? ARM::t2MOVi : ARM::MOVi;
2496 MI.getOperand(1).getReg())
2499 .
add(
MI.getOperand(4))
2503 MI.eraseFromParent();
2508 unsigned Opc = AFI->isThumbFunction() ? ARM::t2MVNi : ARM::MVNi;
2510 MI.getOperand(1).getReg())
2513 .
add(
MI.getOperand(4))
2517 MI.eraseFromParent();
2520 case ARM::t2MOVCClsl:
2521 case ARM::t2MOVCClsr:
2522 case ARM::t2MOVCCasr:
2523 case ARM::t2MOVCCror: {
2526 case ARM::t2MOVCClsl: NewOpc = ARM::t2LSLri;
break;
2527 case ARM::t2MOVCClsr: NewOpc = ARM::t2LSRri;
break;
2528 case ARM::t2MOVCCasr: NewOpc = ARM::t2ASRri;
break;
2529 case ARM::t2MOVCCror: NewOpc = ARM::t2RORri;
break;
2533 MI.getOperand(1).getReg())
2534 .
add(
MI.getOperand(2))
2537 .
add(
MI.getOperand(5))
2540 MI.eraseFromParent();
2543 case ARM::Int_eh_sjlj_dispatchsetup: {
2550 int32_t NumBytes = AFI->getFramePtrSpillOffset();
2553 "base pointer without frame pointer?");
2555 if (AFI->isThumb2Function()) {
2558 }
else if (AFI->isThumbFunction()) {
2567 if (RI.hasStackRealignment(MF)) {
2570 assert (!AFI->isThumb1OnlyFunction());
2573 "The BIC instruction cannot encode "
2574 "immediates larger than 256 with all lower "
2576 unsigned bicOpc = AFI->isThumbFunction() ?
2577 ARM::t2BICri : ARM::BICri;
2585 MI.eraseFromParent();
2593 MI.getOperand(0).getReg())
2594 .
add(
MI.getOperand(1))
2599 MI.eraseFromParent();
2605 MI.getOperand(0).getReg())
2606 .
add(
MI.getOperand(1))
2611 MI.eraseFromParent();
2616 const bool Thumb = Opcode == ARM::tTPsoft;
2620 if (STI->genLongCalls()) {
2622 unsigned PCLabelID = AFI->createPICLabelUId();
2625 "__aeabi_read_tp", PCLabelID, 0);
2629 TII->get(Thumb ? ARM::tLDRpci : ARM::LDRi12), Reg)
2643 TII->get(Thumb ? ARM::tBL : ARM::BL));
2652 if (
MI.isCandidateForAdditionalCallInfo())
2654 MI.eraseFromParent();
2657 case ARM::tLDRpci_pic:
2658 case ARM::t2LDRpci_pic: {
2659 unsigned NewLdOpc = (Opcode == ARM::tLDRpci_pic)
2660 ? ARM::tLDRpci : ARM::t2LDRpci;
2662 bool DstIsDead =
MI.getOperand(0).isDead();
2664 .
add(
MI.getOperand(1))
2671 .
add(
MI.getOperand(2))
2673 MI.eraseFromParent();
2677 case ARM::LDRLIT_ga_abs:
2678 case ARM::LDRLIT_ga_pcrel:
2679 case ARM::LDRLIT_ga_pcrel_ldr:
2680 case ARM::tLDRLIT_ga_abs:
2681 case ARM::t2LDRLIT_ga_pcrel:
2682 case ARM::tLDRLIT_ga_pcrel: {
2684 bool DstIsDead =
MI.getOperand(0).isDead();
2688 bool IsARM = Opcode != ARM::tLDRLIT_ga_pcrel &&
2689 Opcode != ARM::tLDRLIT_ga_abs &&
2690 Opcode != ARM::t2LDRLIT_ga_pcrel;
2692 Opcode != ARM::LDRLIT_ga_abs && Opcode != ARM::tLDRLIT_ga_abs;
2693 unsigned LDRLITOpc = IsARM ? ARM::LDRi12 : ARM::tLDRpci;
2694 if (Opcode == ARM::t2LDRLIT_ga_pcrel)
2695 LDRLITOpc = ARM::t2LDRpci;
2696 unsigned PICAddOpc =
2698 ? (Opcode == ARM::LDRLIT_ga_pcrel_ldr ? ARM::PICLDR : ARM::PICADD)
2703 unsigned ARMPCLabelIndex = 0;
2707 unsigned PCAdj = IsARM ? 8 : 4;
2711 ARMPCLabelIndex = AFI->createPICLabelUId();
2730 .
addImm(ARMPCLabelIndex);
2736 MI.eraseFromParent();
2739 case ARM::MOV_ga_pcrel:
2740 case ARM::MOV_ga_pcrel_ldr:
2741 case ARM::t2MOV_ga_pcrel: {
2743 unsigned LabelId = AFI->createPICLabelUId();
2745 bool DstIsDead =
MI.getOperand(0).isDead();
2749 bool isARM = Opcode != ARM::t2MOV_ga_pcrel;
2750 unsigned LO16Opc = isARM ? ARM::MOVi16_ga_pcrel : ARM::t2MOVi16_ga_pcrel;
2751 unsigned HI16Opc = isARM ? ARM::MOVTi16_ga_pcrel :ARM::t2MOVTi16_ga_pcrel;
2754 unsigned PICAddOpc = isARM
2755 ? (Opcode == ARM::MOV_ga_pcrel_ldr ? ARM::PICLDR : ARM::PICADD)
2769 TII->get(PICAddOpc))
2774 if (Opcode == ARM::MOV_ga_pcrel_ldr)
2778 MI.eraseFromParent();
2782 case ARM::MOVi32imm:
2783 case ARM::MOVCCi32imm:
2784 case ARM::t2MOVi32imm:
2785 case ARM::t2MOVCCi32imm:
2789 case ARM::tMOVi32imm:
2790 ExpandTMOV32BitImm(
MBB,
MBBI);
2793 case ARM::tLEApcrelJT:
2795 if (
MI.getMF()->getJumpTableInfo()->getEntryKind() ==
2800 assert(STI->isThumb() &&
"Non-inline jump tables expected only in thumb");
2801 ExpandTMOV32BitImm(
MBB,
MBBI);
2804 case ARM::SUBS_PC_LR: {
2807 .
add(
MI.getOperand(0))
2808 .
add(
MI.getOperand(1))
2809 .
add(
MI.getOperand(2))
2812 MI.eraseFromParent();
2815 case ARM::VLDMQIA: {
2816 unsigned NewOpc = ARM::VLDMDIA;
2822 bool DstIsDead =
MI.getOperand(
OpIdx).isDead();
2833 Register D0 =
TRI->getSubReg(DstReg, ARM::dsub_0);
2834 Register D1 =
TRI->getSubReg(DstReg, ARM::dsub_1);
2842 MI.eraseFromParent();
2846 case ARM::VSTMQIA: {
2847 unsigned NewOpc = ARM::VSTMDIA;
2853 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
2865 Register D0 =
TRI->getSubReg(SrcReg, ARM::dsub_0);
2866 Register D1 =
TRI->getSubReg(SrcReg, ARM::dsub_1);
2875 MI.eraseFromParent();
2879 case ARM::VLD2q8Pseudo:
2880 case ARM::VLD2q16Pseudo:
2881 case ARM::VLD2q32Pseudo:
2882 case ARM::VLD2q8PseudoWB_fixed:
2883 case ARM::VLD2q16PseudoWB_fixed:
2884 case ARM::VLD2q32PseudoWB_fixed:
2885 case ARM::VLD2q8PseudoWB_register:
2886 case ARM::VLD2q16PseudoWB_register:
2887 case ARM::VLD2q32PseudoWB_register:
2888 case ARM::VLD3d8Pseudo:
2889 case ARM::VLD3d16Pseudo:
2890 case ARM::VLD3d32Pseudo:
2891 case ARM::VLD1d8TPseudo:
2892 case ARM::VLD1d8TPseudoWB_fixed:
2893 case ARM::VLD1d8TPseudoWB_register:
2894 case ARM::VLD1d16TPseudo:
2895 case ARM::VLD1d16TPseudoWB_fixed:
2896 case ARM::VLD1d16TPseudoWB_register:
2897 case ARM::VLD1d32TPseudo:
2898 case ARM::VLD1d32TPseudoWB_fixed:
2899 case ARM::VLD1d32TPseudoWB_register:
2900 case ARM::VLD1d64TPseudo:
2901 case ARM::VLD1d64TPseudoWB_fixed:
2902 case ARM::VLD1d64TPseudoWB_register:
2903 case ARM::VLD3d8Pseudo_UPD:
2904 case ARM::VLD3d16Pseudo_UPD:
2905 case ARM::VLD3d32Pseudo_UPD:
2906 case ARM::VLD3q8Pseudo_UPD:
2907 case ARM::VLD3q16Pseudo_UPD:
2908 case ARM::VLD3q32Pseudo_UPD:
2909 case ARM::VLD3q8oddPseudo:
2910 case ARM::VLD3q16oddPseudo:
2911 case ARM::VLD3q32oddPseudo:
2912 case ARM::VLD3q8oddPseudo_UPD:
2913 case ARM::VLD3q16oddPseudo_UPD:
2914 case ARM::VLD3q32oddPseudo_UPD:
2915 case ARM::VLD4d8Pseudo:
2916 case ARM::VLD4d16Pseudo:
2917 case ARM::VLD4d32Pseudo:
2918 case ARM::VLD1d8QPseudo:
2919 case ARM::VLD1d8QPseudoWB_fixed:
2920 case ARM::VLD1d8QPseudoWB_register:
2921 case ARM::VLD1d16QPseudo:
2922 case ARM::VLD1d16QPseudoWB_fixed:
2923 case ARM::VLD1d16QPseudoWB_register:
2924 case ARM::VLD1d32QPseudo:
2925 case ARM::VLD1d32QPseudoWB_fixed:
2926 case ARM::VLD1d32QPseudoWB_register:
2927 case ARM::VLD1d64QPseudo:
2928 case ARM::VLD1d64QPseudoWB_fixed:
2929 case ARM::VLD1d64QPseudoWB_register:
2930 case ARM::VLD1q8HighQPseudo:
2931 case ARM::VLD1q8HighQPseudo_UPD:
2932 case ARM::VLD1q8LowQPseudo_UPD:
2933 case ARM::VLD1q8HighTPseudo:
2934 case ARM::VLD1q8HighTPseudo_UPD:
2935 case ARM::VLD1q8LowTPseudo_UPD:
2936 case ARM::VLD1q16HighQPseudo:
2937 case ARM::VLD1q16HighQPseudo_UPD:
2938 case ARM::VLD1q16LowQPseudo_UPD:
2939 case ARM::VLD1q16HighTPseudo:
2940 case ARM::VLD1q16HighTPseudo_UPD:
2941 case ARM::VLD1q16LowTPseudo_UPD:
2942 case ARM::VLD1q32HighQPseudo:
2943 case ARM::VLD1q32HighQPseudo_UPD:
2944 case ARM::VLD1q32LowQPseudo_UPD:
2945 case ARM::VLD1q32HighTPseudo:
2946 case ARM::VLD1q32HighTPseudo_UPD:
2947 case ARM::VLD1q32LowTPseudo_UPD:
2948 case ARM::VLD1q64HighQPseudo:
2949 case ARM::VLD1q64HighQPseudo_UPD:
2950 case ARM::VLD1q64LowQPseudo_UPD:
2951 case ARM::VLD1q64HighTPseudo:
2952 case ARM::VLD1q64HighTPseudo_UPD:
2953 case ARM::VLD1q64LowTPseudo_UPD:
2954 case ARM::VLD4d8Pseudo_UPD:
2955 case ARM::VLD4d16Pseudo_UPD:
2956 case ARM::VLD4d32Pseudo_UPD:
2957 case ARM::VLD4q8Pseudo_UPD:
2958 case ARM::VLD4q16Pseudo_UPD:
2959 case ARM::VLD4q32Pseudo_UPD:
2960 case ARM::VLD4q8oddPseudo:
2961 case ARM::VLD4q16oddPseudo:
2962 case ARM::VLD4q32oddPseudo:
2963 case ARM::VLD4q8oddPseudo_UPD:
2964 case ARM::VLD4q16oddPseudo_UPD:
2965 case ARM::VLD4q32oddPseudo_UPD:
2966 case ARM::VLD3DUPd8Pseudo:
2967 case ARM::VLD3DUPd16Pseudo:
2968 case ARM::VLD3DUPd32Pseudo:
2969 case ARM::VLD3DUPd8Pseudo_UPD:
2970 case ARM::VLD3DUPd16Pseudo_UPD:
2971 case ARM::VLD3DUPd32Pseudo_UPD:
2972 case ARM::VLD4DUPd8Pseudo:
2973 case ARM::VLD4DUPd16Pseudo:
2974 case ARM::VLD4DUPd32Pseudo:
2975 case ARM::VLD4DUPd8Pseudo_UPD:
2976 case ARM::VLD4DUPd16Pseudo_UPD:
2977 case ARM::VLD4DUPd32Pseudo_UPD:
2978 case ARM::VLD2DUPq8EvenPseudo:
2979 case ARM::VLD2DUPq8OddPseudo:
2980 case ARM::VLD2DUPq16EvenPseudo:
2981 case ARM::VLD2DUPq16OddPseudo:
2982 case ARM::VLD2DUPq32EvenPseudo:
2983 case ARM::VLD2DUPq32OddPseudo:
2984 case ARM::VLD2DUPq8OddPseudoWB_fixed:
2985 case ARM::VLD2DUPq8OddPseudoWB_register:
2986 case ARM::VLD2DUPq16OddPseudoWB_fixed:
2987 case ARM::VLD2DUPq16OddPseudoWB_register:
2988 case ARM::VLD2DUPq32OddPseudoWB_fixed:
2989 case ARM::VLD2DUPq32OddPseudoWB_register:
2990 case ARM::VLD3DUPq8EvenPseudo:
2991 case ARM::VLD3DUPq8OddPseudo:
2992 case ARM::VLD3DUPq16EvenPseudo:
2993 case ARM::VLD3DUPq16OddPseudo:
2994 case ARM::VLD3DUPq32EvenPseudo:
2995 case ARM::VLD3DUPq32OddPseudo:
2996 case ARM::VLD3DUPq8OddPseudo_UPD:
2997 case ARM::VLD3DUPq16OddPseudo_UPD:
2998 case ARM::VLD3DUPq32OddPseudo_UPD:
2999 case ARM::VLD4DUPq8EvenPseudo:
3000 case ARM::VLD4DUPq8OddPseudo:
3001 case ARM::VLD4DUPq16EvenPseudo:
3002 case ARM::VLD4DUPq16OddPseudo:
3003 case ARM::VLD4DUPq32EvenPseudo:
3004 case ARM::VLD4DUPq32OddPseudo:
3005 case ARM::VLD4DUPq8OddPseudo_UPD:
3006 case ARM::VLD4DUPq16OddPseudo_UPD:
3007 case ARM::VLD4DUPq32OddPseudo_UPD:
3011 case ARM::VST2q8Pseudo:
3012 case ARM::VST2q16Pseudo:
3013 case ARM::VST2q32Pseudo:
3014 case ARM::VST2q8PseudoWB_fixed:
3015 case ARM::VST2q16PseudoWB_fixed:
3016 case ARM::VST2q32PseudoWB_fixed:
3017 case ARM::VST2q8PseudoWB_register:
3018 case ARM::VST2q16PseudoWB_register:
3019 case ARM::VST2q32PseudoWB_register:
3020 case ARM::VST3d8Pseudo:
3021 case ARM::VST3d16Pseudo:
3022 case ARM::VST3d32Pseudo:
3023 case ARM::VST1d8TPseudo:
3024 case ARM::VST1d8TPseudoWB_fixed:
3025 case ARM::VST1d8TPseudoWB_register:
3026 case ARM::VST1d16TPseudo:
3027 case ARM::VST1d16TPseudoWB_fixed:
3028 case ARM::VST1d16TPseudoWB_register:
3029 case ARM::VST1d32TPseudo:
3030 case ARM::VST1d32TPseudoWB_fixed:
3031 case ARM::VST1d32TPseudoWB_register:
3032 case ARM::VST1d64TPseudo:
3033 case ARM::VST1d64TPseudoWB_fixed:
3034 case ARM::VST1d64TPseudoWB_register:
3035 case ARM::VST3d8Pseudo_UPD:
3036 case ARM::VST3d16Pseudo_UPD:
3037 case ARM::VST3d32Pseudo_UPD:
3038 case ARM::VST3q8Pseudo_UPD:
3039 case ARM::VST3q16Pseudo_UPD:
3040 case ARM::VST3q32Pseudo_UPD:
3041 case ARM::VST3q8oddPseudo:
3042 case ARM::VST3q16oddPseudo:
3043 case ARM::VST3q32oddPseudo:
3044 case ARM::VST3q8oddPseudo_UPD:
3045 case ARM::VST3q16oddPseudo_UPD:
3046 case ARM::VST3q32oddPseudo_UPD:
3047 case ARM::VST4d8Pseudo:
3048 case ARM::VST4d16Pseudo:
3049 case ARM::VST4d32Pseudo:
3050 case ARM::VST1d8QPseudo:
3051 case ARM::VST1d8QPseudoWB_fixed:
3052 case ARM::VST1d8QPseudoWB_register:
3053 case ARM::VST1d16QPseudo:
3054 case ARM::VST1d16QPseudoWB_fixed:
3055 case ARM::VST1d16QPseudoWB_register:
3056 case ARM::VST1d32QPseudo:
3057 case ARM::VST1d32QPseudoWB_fixed:
3058 case ARM::VST1d32QPseudoWB_register:
3059 case ARM::VST1d64QPseudo:
3060 case ARM::VST1d64QPseudoWB_fixed:
3061 case ARM::VST1d64QPseudoWB_register:
3062 case ARM::VST4d8Pseudo_UPD:
3063 case ARM::VST4d16Pseudo_UPD:
3064 case ARM::VST4d32Pseudo_UPD:
3065 case ARM::VST1q8HighQPseudo:
3066 case ARM::VST1q8LowQPseudo_UPD:
3067 case ARM::VST1q8HighTPseudo:
3068 case ARM::VST1q8LowTPseudo_UPD:
3069 case ARM::VST1q16HighQPseudo:
3070 case ARM::VST1q16LowQPseudo_UPD:
3071 case ARM::VST1q16HighTPseudo:
3072 case ARM::VST1q16LowTPseudo_UPD:
3073 case ARM::VST1q32HighQPseudo:
3074 case ARM::VST1q32LowQPseudo_UPD:
3075 case ARM::VST1q32HighTPseudo:
3076 case ARM::VST1q32LowTPseudo_UPD:
3077 case ARM::VST1q64HighQPseudo:
3078 case ARM::VST1q64LowQPseudo_UPD:
3079 case ARM::VST1q64HighTPseudo:
3080 case ARM::VST1q64LowTPseudo_UPD:
3081 case ARM::VST1q8HighTPseudo_UPD:
3082 case ARM::VST1q16HighTPseudo_UPD:
3083 case ARM::VST1q32HighTPseudo_UPD:
3084 case ARM::VST1q64HighTPseudo_UPD:
3085 case ARM::VST1q8HighQPseudo_UPD:
3086 case ARM::VST1q16HighQPseudo_UPD:
3087 case ARM::VST1q32HighQPseudo_UPD:
3088 case ARM::VST1q64HighQPseudo_UPD:
3089 case ARM::VST4q8Pseudo_UPD:
3090 case ARM::VST4q16Pseudo_UPD:
3091 case ARM::VST4q32Pseudo_UPD:
3092 case ARM::VST4q8oddPseudo:
3093 case ARM::VST4q16oddPseudo:
3094 case ARM::VST4q32oddPseudo:
3095 case ARM::VST4q8oddPseudo_UPD:
3096 case ARM::VST4q16oddPseudo_UPD:
3097 case ARM::VST4q32oddPseudo_UPD:
3101 case ARM::VLD1LNq8Pseudo:
3102 case ARM::VLD1LNq16Pseudo:
3103 case ARM::VLD1LNq32Pseudo:
3104 case ARM::VLD1LNq8Pseudo_UPD:
3105 case ARM::VLD1LNq16Pseudo_UPD:
3106 case ARM::VLD1LNq32Pseudo_UPD:
3107 case ARM::VLD2LNd8Pseudo:
3108 case ARM::VLD2LNd16Pseudo:
3109 case ARM::VLD2LNd32Pseudo:
3110 case ARM::VLD2LNq16Pseudo:
3111 case ARM::VLD2LNq32Pseudo:
3112 case ARM::VLD2LNd8Pseudo_UPD:
3113 case ARM::VLD2LNd16Pseudo_UPD:
3114 case ARM::VLD2LNd32Pseudo_UPD:
3115 case ARM::VLD2LNq16Pseudo_UPD:
3116 case ARM::VLD2LNq32Pseudo_UPD:
3117 case ARM::VLD3LNd8Pseudo:
3118 case ARM::VLD3LNd16Pseudo:
3119 case ARM::VLD3LNd32Pseudo:
3120 case ARM::VLD3LNq16Pseudo:
3121 case ARM::VLD3LNq32Pseudo:
3122 case ARM::VLD3LNd8Pseudo_UPD:
3123 case ARM::VLD3LNd16Pseudo_UPD:
3124 case ARM::VLD3LNd32Pseudo_UPD:
3125 case ARM::VLD3LNq16Pseudo_UPD:
3126 case ARM::VLD3LNq32Pseudo_UPD:
3127 case ARM::VLD4LNd8Pseudo:
3128 case ARM::VLD4LNd16Pseudo:
3129 case ARM::VLD4LNd32Pseudo:
3130 case ARM::VLD4LNq16Pseudo:
3131 case ARM::VLD4LNq32Pseudo:
3132 case ARM::VLD4LNd8Pseudo_UPD:
3133 case ARM::VLD4LNd16Pseudo_UPD:
3134 case ARM::VLD4LNd32Pseudo_UPD:
3135 case ARM::VLD4LNq16Pseudo_UPD:
3136 case ARM::VLD4LNq32Pseudo_UPD:
3137 case ARM::VST1LNq8Pseudo:
3138 case ARM::VST1LNq16Pseudo:
3139 case ARM::VST1LNq32Pseudo:
3140 case ARM::VST1LNq8Pseudo_UPD:
3141 case ARM::VST1LNq16Pseudo_UPD:
3142 case ARM::VST1LNq32Pseudo_UPD:
3143 case ARM::VST2LNd8Pseudo:
3144 case ARM::VST2LNd16Pseudo:
3145 case ARM::VST2LNd32Pseudo:
3146 case ARM::VST2LNq16Pseudo:
3147 case ARM::VST2LNq32Pseudo:
3148 case ARM::VST2LNd8Pseudo_UPD:
3149 case ARM::VST2LNd16Pseudo_UPD:
3150 case ARM::VST2LNd32Pseudo_UPD:
3151 case ARM::VST2LNq16Pseudo_UPD:
3152 case ARM::VST2LNq32Pseudo_UPD:
3153 case ARM::VST3LNd8Pseudo:
3154 case ARM::VST3LNd16Pseudo:
3155 case ARM::VST3LNd32Pseudo:
3156 case ARM::VST3LNq16Pseudo:
3157 case ARM::VST3LNq32Pseudo:
3158 case ARM::VST3LNd8Pseudo_UPD:
3159 case ARM::VST3LNd16Pseudo_UPD:
3160 case ARM::VST3LNd32Pseudo_UPD:
3161 case ARM::VST3LNq16Pseudo_UPD:
3162 case ARM::VST3LNq32Pseudo_UPD:
3163 case ARM::VST4LNd8Pseudo:
3164 case ARM::VST4LNd16Pseudo:
3165 case ARM::VST4LNd32Pseudo:
3166 case ARM::VST4LNq16Pseudo:
3167 case ARM::VST4LNq32Pseudo:
3168 case ARM::VST4LNd8Pseudo_UPD:
3169 case ARM::VST4LNd16Pseudo_UPD:
3170 case ARM::VST4LNd32Pseudo_UPD:
3171 case ARM::VST4LNq16Pseudo_UPD:
3172 case ARM::VST4LNq32Pseudo_UPD:
3176 case ARM::VTBL3Pseudo: ExpandVTBL(
MBBI, ARM::VTBL3,
false);
return true;
3177 case ARM::VTBL4Pseudo: ExpandVTBL(
MBBI, ARM::VTBL4,
false);
return true;
3178 case ARM::VTBX3Pseudo: ExpandVTBL(
MBBI, ARM::VTBX3,
true);
return true;
3179 case ARM::VTBX4Pseudo: ExpandVTBL(
MBBI, ARM::VTBX4,
true);
return true;
3181 case ARM::MQQPRLoad:
3182 case ARM::MQQPRStore:
3183 case ARM::MQQQQPRLoad:
3184 case ARM::MQQQQPRStore:
3185 ExpandMQQPRLoadStore(
MBBI);
3188 case ARM::tCMP_SWAP_8:
3190 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREXB, ARM::t2STREXB, ARM::tUXTB,
3192 case ARM::tCMP_SWAP_16:
3194 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREXH, ARM::t2STREXH, ARM::tUXTH,
3196 case ARM::tCMP_SWAP_32:
3198 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREX, ARM::t2STREX, 0, NextMBBI);
3200 case ARM::CMP_SWAP_8:
3202 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREXB, ARM::STREXB, ARM::UXTB,
3204 case ARM::CMP_SWAP_16:
3206 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREXH, ARM::STREXH, ARM::UXTH,
3208 case ARM::CMP_SWAP_32:
3210 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREX, ARM::STREX, 0, NextMBBI);
3212 case ARM::CMP_SWAP_64:
3213 return ExpandCMP_SWAP_64(
MBB,
MBBI, NextMBBI);
3215 case ARM::tBL_PUSHLR:
3216 case ARM::BL_PUSHLR: {
3217 const bool Thumb = Opcode == ARM::tBL_PUSHLR;
3219 assert(Reg == ARM::LR &&
"expect LR register!");
3243 MI.eraseFromParent();
3246 case ARM::t2CALL_BTI: {
3251 for (
unsigned i = 0; i <
MI.getNumOperands(); ++i)
3252 MIB.
add(
MI.getOperand(i));
3253 if (
MI.isCandidateForAdditionalCallInfo())
3256 Bundler.append(MIB);
3257 Bundler.append(
BuildMI(MF,
MI.getDebugLoc(),
TII->get(ARM::t2BTI)));
3259 MI.eraseFromParent();
3263 case ARM::STOREDUAL: {
3264 Register PairReg =
MI.getOperand(0).getReg();
3268 TII->get(Opcode == ARM::LOADDUAL ? ARM::LDRD : ARM::STRD))
3269 .
addReg(
TRI->getSubReg(PairReg, ARM::gsub_0),
3271 .
addReg(
TRI->getSubReg(PairReg, ARM::gsub_1),
3277 MI.eraseFromParent();
3298 TII = STI->getInstrInfo();
3299 TRI = STI->getRegisterInfo();
3302 LLVM_DEBUG(
dbgs() <<
"********** ARM EXPAND PSEUDO INSTRUCTIONS **********\n"
3303 <<
"********** Function: " << MF.
getName() <<
'\n');
3309 MF.verify(
this,
"After expanding ARM pseudo instructions.");
3311 LLVM_DEBUG(
dbgs() <<
"***************************************************\n");
3318 return new ARMExpandPseudo();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool determineFPRegsToClear(const MachineInstr &MI, BitVector &ClearRegs)
static void CMSEPopCalleeSaves(const TargetInstrInfo &TII, MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, bool Thumb1Only)
static void GetDSubRegs(unsigned Reg, NEONRegSpacing RegSpc, const TargetRegisterInfo *TRI, MCRegister &D0, MCRegister &D1, MCRegister &D2, MCRegister &D3)
GetDSubRegs - Get 4 D subregisters of a Q, QQ, or QQQQ register, corresponding to the specified regis...
static MachineOperand getMovOperand(const MachineOperand &MO, unsigned TargetFlag)
static MachineOperand makeImplicit(const MachineOperand &MO)
static void addExclusiveRegPair(MachineInstrBuilder &MIB, MachineOperand &Reg, unsigned Flags, bool IsThumb, const TargetRegisterInfo *TRI)
ARM's ldrexd/strexd take a consecutive register pair (represented as a single GPRPair register),...
static cl::opt< bool > VerifyARMPseudo("verify-arm-pseudo-expand", cl::Hidden, cl::desc("Verify machine code after expanding ARM pseudos"))
static bool definesOrUsesFPReg(const MachineInstr &MI)
static void determineGPRegsToClear(const MachineInstr &MI, const std::initializer_list< unsigned > &Regs, SmallVectorImpl< unsigned > &ClearRegs)
static void CMSEPushCalleeSaves(const TargetInstrInfo &TII, MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register JumpReg, const LivePhysRegs &LiveRegs, bool Thumb1Only)
static bool IsAnAddressOperand(const MachineOperand &MO)
#define ARM_EXPAND_PSEUDO_NAME
static const int CMSE_FP_SAVE_SIZE
static const NEONLdStTableEntry * LookupNEONLdSt(unsigned Opcode)
LookupNEONLdSt - Search the NEONLdStTable for information about a NEON load or store pseudo instructi...
static const NEONLdStTableEntry NEONLdStTable[]
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_ATTRIBUTE_UNUSED
const HexagonInstrInfo * TII
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
Register const TargetRegisterInfo * TRI
MachineInstr unsigned OpIdx
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static const unsigned FramePtr
bool hasBasePointer(const MachineFunction &MF) const
Register getFrameRegister(const MachineFunction &MF) const override
static ARMConstantPoolConstant * Create(const Constant *C, unsigned ID)
static ARMConstantPoolSymbol * Create(LLVMContext &C, StringRef s, unsigned ID, unsigned char PCAdj)
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
size_type count() const
count - Returns the number of bits which are set.
size_type size() const
size - Returns the number of bits in this bitvector.
This class represents an Operation in the Expression.
FunctionPass class - This class is used to implement most global optimizations.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
A set of physical registers with utility functions to track liveness when walking backward/forward th...
bool usesWindowsCFI() const
Wrapper class representing physical registers. Should be passed by value.
Helper class for constructing bundles of MachineInstrs.
LLVM_ABI void transferSuccessors(MachineBasicBlock *FromMBB)
Transfers all the successors from MBB to this machine basic block (i.e., copies all the successors Fr...
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
void addLiveIn(MCRegister PhysReg, LaneBitmask LaneMask=LaneBitmask::getAll())
Adds the specified register as a live in.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
reverse_iterator rbegin()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
Abstract base class for all machine specific constantpool value subclasses.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Align getMaxAlign() const
Return the alignment in bytes that this function must be aligned to, which is greater than the defaul...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
virtual MachineFunctionProperties getRequiredProperties() const
Properties which a MachineFunction may have at a given point in time.
void moveAdditionalCallInfo(const MachineInstr *Old, const MachineInstr *New)
Move the call site info from Old to \New call site info.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
MachineBasicBlock * CreateMachineBasicBlock(const BasicBlock *BB=nullptr, std::optional< UniqueBBID > BBID=std::nullopt)
CreateMachineBasicBlock - Allocate a new MachineBasicBlock.
void insert(iterator MBBI, MachineBasicBlock *MBB)
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addConstantPoolIndex(unsigned Idx, int Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addGlobalAddress(const GlobalValue *GV, int64_t Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & cloneMemRefs(const MachineInstr &OtherMI) const
const MachineInstrBuilder & setMIFlags(unsigned Flags) const
const MachineInstrBuilder & copyImplicitOps(const MachineInstr &OtherMI) const
Copy all the implicit operands from OtherMI onto this one.
MachineInstr * getInstr() const
If conversion operators fail, use this method to get the MachineInstr explicitly.
Representation of each machine instruction.
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
mop_range implicit_operands()
LLVM_ABI bool addRegisterKilled(Register IncomingReg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
We have determined MI kills a register.
LLVM_ABI void dump() const
const MachineOperand & getOperand(unsigned i) const
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
void setImplicit(bool Val=true)
static MachineOperand CreateES(const char *SymName, unsigned TargetFlags=0)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
void setIsDead(bool Val=true)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isSymbol() const
isSymbol - Tests if this is a MO_ExternalSymbol operand.
unsigned getTargetFlags() const
static MachineOperand CreateImm(int64_t Val)
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
static MachineOperand CreateJTI(unsigned Idx, unsigned TargetFlags=0)
const char * getSymbolName() const
void setIsUndef(bool Val=true)
Register getReg() const
getReg - Returns the register number.
static MachineOperand CreateGA(const GlobalValue *GV, int64_t Offset, unsigned TargetFlags=0)
@ MO_CFIIndex
MCCFIInstruction index.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_MCSymbol
MCSymbol reference (for debug/eh info)
@ MO_Predicate
Generic predicate for ISel.
@ MO_GlobalAddress
Address of a global value.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_ShuffleMask
Other IR Constant for ISel (shuffle masks)
@ MO_CImmediate
Immediate >64bit operand.
@ MO_BlockAddress
Address of a basic block.
@ MO_DbgInstrRef
Integer indices referring to an instruction+operand.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_IntrinsicID
Intrinsic ID for ISel.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_Metadata
Metadata reference (for debug info)
@ MO_FPImmediate
Floating-point immediate operand.
@ MO_RegisterLiveOut
Mask of live-out registers.
int64_t getOffset() const
Return the offset from the symbol in this operand.
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
bool hasFP(const MachineFunction &MF) const
hasFP - Return true if the specified function should have a dedicated frame pointer register.
TargetInstrInfo - Interface to description of machine instruction set.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ GOT_PREL
Thread Local Storage (General Dynamic Mode)
@ MO_LO16
MO_LO16 - On a symbol operand, this represents a relocation containing lower 16 bit of the address.
@ MO_LO_0_7
MO_LO_0_7 - On a symbol operand, this represents a relocation containing bits 0 through 7 of the addr...
@ MO_LO_8_15
MO_LO_8_15 - On a symbol operand, this represents a relocation containing bits 8 through 15 of the ad...
@ MO_HI_8_15
MO_HI_8_15 - On a symbol operand, this represents a relocation containing bits 24 through 31 of the a...
@ MO_HI16
MO_HI16 - On a symbol operand, this represents a relocation containing higher 16 bit of the address.
@ MO_HI_0_7
MO_HI_0_7 - On a symbol operand, this represents a relocation containing bits 16 through 23 of the ad...
@ MO_GOT
MO_GOT - On a symbol operand, this represents a GOT relative relocation.
unsigned getSOImmTwoPartSecond(unsigned V)
getSOImmTwoPartSecond - If V is a value that satisfies isSOImmTwoPartVal, return the second chunk of ...
bool isSOImmTwoPartVal(unsigned V)
isSOImmTwoPartVal - Return true if the specified value can be obtained by or'ing together two SOImmVa...
unsigned getSORegOpc(ShiftOpc ShOp, unsigned Imm)
unsigned getSOImmTwoPartFirst(unsigned V)
getSOImmTwoPartFirst - If V is a value that satisfies isSOImmTwoPartVal, return the first chunk of it...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ Implicit
Not emitted register (e.g. carry, or temporary result).
@ Define
Register definition.
@ Kill
The last use of a register.
@ Undef
Value of the register doesn't matter.
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool operator<(int64_t V1, const APSInt &V2)
LLVM_ABI void finalizeBundle(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator FirstMI, MachineBasicBlock::instr_iterator LastMI)
finalizeBundle - Finalize a machine instruction bundle which includes a sequence of instructions star...
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
unsigned getDeadRegState(bool B)
static std::array< MachineOperand, 2 > predOps(ARMCC::CondCodes Pred, unsigned PredReg=0)
Get the operands corresponding to the given Pred value.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
unsigned getUndefRegState(bool B)
unsigned getRegState(const MachineOperand &RegOp)
Get all register state flags from machine operand RegOp.
unsigned getDefRegState(bool B)
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
unsigned getKillRegState(bool B)
void emitThumbRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, Register BaseReg, int NumBytes, const TargetInstrInfo &TII, const ARMBaseRegisterInfo &MRI, unsigned MIFlags=0)
emitThumbRegPlusImmediate - Emits a series of instructions to materialize a destreg = basereg + immed...
ARMCC::CondCodes getInstrPredicate(const MachineInstr &MI, Register &PredReg)
getInstrPredicate - If instruction is predicated, returns its predicate condition,...
unsigned getRenamableRegState(bool B)
static MachineOperand t1CondCodeOp(bool isDead=false)
Get the operand corresponding to the conditional code result for Thumb1.
void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB)
Convenience function combining computeLiveIns() and addLiveIns().
static MachineOperand condCodeOp(unsigned CCReg=0)
Get the operand corresponding to the conditional code result.
FunctionPass * createARMExpandPseudoPass()
createARMExpandPseudoPass - returns an instance of the pseudo instruction expansion pass.
unsigned gettBLXrOpcode(const MachineFunction &MF)
unsigned getBLXOpcode(const MachineFunction &MF)
void emitARMRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, Register BaseReg, int NumBytes, ARMCC::CondCodes Pred, Register PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
emitARMRegPlusImmediate / emitT2RegPlusImmediate - Emits a series of instructions to materializea des...
void emitT2RegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, const DebugLoc &dl, Register DestReg, Register BaseReg, int NumBytes, ARMCC::CondCodes Pred, Register PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
This struct is a compact representation of a valid (non-zero power of two) alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.