34#define DEBUG_TYPE "arm-pseudo"
38 cl::desc(
"Verify machine code after expanding ARM pseudos"));
40#define ARM_EXPAND_PSEUDO_NAME "ARM pseudo instruction expansion pass"
72 unsigned Opc,
bool IsExt);
112 unsigned StrexOp,
unsigned UxtOp,
119 char ARMExpandPseudo::ID = 0;
130 enum NEONRegSpacing {
141 struct NEONLdStTableEntry {
146 bool hasWritebackOperand;
155 bool copyAllListRegs;
158 bool operator<(
const NEONLdStTableEntry &TE)
const {
159 return PseudoOpc < TE.PseudoOpc;
161 friend bool operator<(
const NEONLdStTableEntry &TE,
unsigned PseudoOpc) {
162 return TE.PseudoOpc < PseudoOpc;
165 const NEONLdStTableEntry &TE) {
166 return PseudoOpc < TE.PseudoOpc;
172{ ARM::VLD1LNq16Pseudo, ARM::VLD1LNd16,
true,
false,
false, EvenDblSpc, 1, 4 ,
true},
173{ ARM::VLD1LNq16Pseudo_UPD, ARM::VLD1LNd16_UPD,
true,
true,
true, EvenDblSpc, 1, 4 ,
true},
174{ ARM::VLD1LNq32Pseudo, ARM::VLD1LNd32,
true,
false,
false, EvenDblSpc, 1, 2 ,
true},
175{ ARM::VLD1LNq32Pseudo_UPD, ARM::VLD1LNd32_UPD,
true,
true,
true, EvenDblSpc, 1, 2 ,
true},
176{ ARM::VLD1LNq8Pseudo, ARM::VLD1LNd8,
true,
false,
false, EvenDblSpc, 1, 8 ,
true},
177{ ARM::VLD1LNq8Pseudo_UPD, ARM::VLD1LNd8_UPD,
true,
true,
true, EvenDblSpc, 1, 8 ,
true},
179{ ARM::VLD1d16QPseudo, ARM::VLD1d16Q,
true,
false,
false, SingleSpc, 4, 4 ,
false},
180{ ARM::VLD1d16QPseudoWB_fixed, ARM::VLD1d16Qwb_fixed,
true,
true,
false, SingleSpc, 4, 4 ,
false},
181{ ARM::VLD1d16QPseudoWB_register, ARM::VLD1d16Qwb_register,
true,
true,
true, SingleSpc, 4, 4 ,
false},
182{ ARM::VLD1d16TPseudo, ARM::VLD1d16T,
true,
false,
false, SingleSpc, 3, 4 ,
false},
183{ ARM::VLD1d16TPseudoWB_fixed, ARM::VLD1d16Twb_fixed,
true,
true,
false, SingleSpc, 3, 4 ,
false},
184{ ARM::VLD1d16TPseudoWB_register, ARM::VLD1d16Twb_register,
true,
true,
true, SingleSpc, 3, 4 ,
false},
186{ ARM::VLD1d32QPseudo, ARM::VLD1d32Q,
true,
false,
false, SingleSpc, 4, 2 ,
false},
187{ ARM::VLD1d32QPseudoWB_fixed, ARM::VLD1d32Qwb_fixed,
true,
true,
false, SingleSpc, 4, 2 ,
false},
188{ ARM::VLD1d32QPseudoWB_register, ARM::VLD1d32Qwb_register,
true,
true,
true, SingleSpc, 4, 2 ,
false},
189{ ARM::VLD1d32TPseudo, ARM::VLD1d32T,
true,
false,
false, SingleSpc, 3, 2 ,
false},
190{ ARM::VLD1d32TPseudoWB_fixed, ARM::VLD1d32Twb_fixed,
true,
true,
false, SingleSpc, 3, 2 ,
false},
191{ ARM::VLD1d32TPseudoWB_register, ARM::VLD1d32Twb_register,
true,
true,
true, SingleSpc, 3, 2 ,
false},
193{ ARM::VLD1d64QPseudo, ARM::VLD1d64Q,
true,
false,
false, SingleSpc, 4, 1 ,
false},
194{ ARM::VLD1d64QPseudoWB_fixed, ARM::VLD1d64Qwb_fixed,
true,
true,
false, SingleSpc, 4, 1 ,
false},
195{ ARM::VLD1d64QPseudoWB_register, ARM::VLD1d64Qwb_register,
true,
true,
true, SingleSpc, 4, 1 ,
false},
196{ ARM::VLD1d64TPseudo, ARM::VLD1d64T,
true,
false,
false, SingleSpc, 3, 1 ,
false},
197{ ARM::VLD1d64TPseudoWB_fixed, ARM::VLD1d64Twb_fixed,
true,
true,
false, SingleSpc, 3, 1 ,
false},
198{ ARM::VLD1d64TPseudoWB_register, ARM::VLD1d64Twb_register,
true,
true,
true, SingleSpc, 3, 1 ,
false},
200{ ARM::VLD1d8QPseudo, ARM::VLD1d8Q,
true,
false,
false, SingleSpc, 4, 8 ,
false},
201{ ARM::VLD1d8QPseudoWB_fixed, ARM::VLD1d8Qwb_fixed,
true,
true,
false, SingleSpc, 4, 8 ,
false},
202{ ARM::VLD1d8QPseudoWB_register, ARM::VLD1d8Qwb_register,
true,
true,
true, SingleSpc, 4, 8 ,
false},
203{ ARM::VLD1d8TPseudo, ARM::VLD1d8T,
true,
false,
false, SingleSpc, 3, 8 ,
false},
204{ ARM::VLD1d8TPseudoWB_fixed, ARM::VLD1d8Twb_fixed,
true,
true,
false, SingleSpc, 3, 8 ,
false},
205{ ARM::VLD1d8TPseudoWB_register, ARM::VLD1d8Twb_register,
true,
true,
true, SingleSpc, 3, 8 ,
false},
207{ ARM::VLD1q16HighQPseudo, ARM::VLD1d16Q,
true,
false,
false, SingleHighQSpc, 4, 4 ,
false},
208{ ARM::VLD1q16HighQPseudo_UPD, ARM::VLD1d16Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 4 ,
false},
209{ ARM::VLD1q16HighTPseudo, ARM::VLD1d16T,
true,
false,
false, SingleHighTSpc, 3, 4 ,
false},
210{ ARM::VLD1q16HighTPseudo_UPD, ARM::VLD1d16Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 4 ,
false},
211{ ARM::VLD1q16LowQPseudo_UPD, ARM::VLD1d16Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 4 ,
false},
212{ ARM::VLD1q16LowTPseudo_UPD, ARM::VLD1d16Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 4 ,
false},
214{ ARM::VLD1q32HighQPseudo, ARM::VLD1d32Q,
true,
false,
false, SingleHighQSpc, 4, 2 ,
false},
215{ ARM::VLD1q32HighQPseudo_UPD, ARM::VLD1d32Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 2 ,
false},
216{ ARM::VLD1q32HighTPseudo, ARM::VLD1d32T,
true,
false,
false, SingleHighTSpc, 3, 2 ,
false},
217{ ARM::VLD1q32HighTPseudo_UPD, ARM::VLD1d32Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 2 ,
false},
218{ ARM::VLD1q32LowQPseudo_UPD, ARM::VLD1d32Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 2 ,
false},
219{ ARM::VLD1q32LowTPseudo_UPD, ARM::VLD1d32Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 2 ,
false},
221{ ARM::VLD1q64HighQPseudo, ARM::VLD1d64Q,
true,
false,
false, SingleHighQSpc, 4, 1 ,
false},
222{ ARM::VLD1q64HighQPseudo_UPD, ARM::VLD1d64Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 1 ,
false},
223{ ARM::VLD1q64HighTPseudo, ARM::VLD1d64T,
true,
false,
false, SingleHighTSpc, 3, 1 ,
false},
224{ ARM::VLD1q64HighTPseudo_UPD, ARM::VLD1d64Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 1 ,
false},
225{ ARM::VLD1q64LowQPseudo_UPD, ARM::VLD1d64Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 1 ,
false},
226{ ARM::VLD1q64LowTPseudo_UPD, ARM::VLD1d64Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 1 ,
false},
228{ ARM::VLD1q8HighQPseudo, ARM::VLD1d8Q,
true,
false,
false, SingleHighQSpc, 4, 8 ,
false},
229{ ARM::VLD1q8HighQPseudo_UPD, ARM::VLD1d8Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 8 ,
false},
230{ ARM::VLD1q8HighTPseudo, ARM::VLD1d8T,
true,
false,
false, SingleHighTSpc, 3, 8 ,
false},
231{ ARM::VLD1q8HighTPseudo_UPD, ARM::VLD1d8Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 8 ,
false},
232{ ARM::VLD1q8LowQPseudo_UPD, ARM::VLD1d8Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 8 ,
false},
233{ ARM::VLD1q8LowTPseudo_UPD, ARM::VLD1d8Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 8 ,
false},
235{ ARM::VLD2DUPq16EvenPseudo, ARM::VLD2DUPd16x2,
true,
false,
false, EvenDblSpc, 2, 4 ,
false},
236{ ARM::VLD2DUPq16OddPseudo, ARM::VLD2DUPd16x2,
true,
false,
false, OddDblSpc, 2, 4 ,
false},
237{ ARM::VLD2DUPq16OddPseudoWB_fixed, ARM::VLD2DUPd16x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 4 ,
false},
238{ ARM::VLD2DUPq16OddPseudoWB_register, ARM::VLD2DUPd16x2wb_register,
true,
true,
true, OddDblSpc, 2, 4 ,
false},
239{ ARM::VLD2DUPq32EvenPseudo, ARM::VLD2DUPd32x2,
true,
false,
false, EvenDblSpc, 2, 2 ,
false},
240{ ARM::VLD2DUPq32OddPseudo, ARM::VLD2DUPd32x2,
true,
false,
false, OddDblSpc, 2, 2 ,
false},
241{ ARM::VLD2DUPq32OddPseudoWB_fixed, ARM::VLD2DUPd32x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 2 ,
false},
242{ ARM::VLD2DUPq32OddPseudoWB_register, ARM::VLD2DUPd32x2wb_register,
true,
true,
true, OddDblSpc, 2, 2 ,
false},
243{ ARM::VLD2DUPq8EvenPseudo, ARM::VLD2DUPd8x2,
true,
false,
false, EvenDblSpc, 2, 8 ,
false},
244{ ARM::VLD2DUPq8OddPseudo, ARM::VLD2DUPd8x2,
true,
false,
false, OddDblSpc, 2, 8 ,
false},
245{ ARM::VLD2DUPq8OddPseudoWB_fixed, ARM::VLD2DUPd8x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 8 ,
false},
246{ ARM::VLD2DUPq8OddPseudoWB_register, ARM::VLD2DUPd8x2wb_register,
true,
true,
true, OddDblSpc, 2, 8 ,
false},
248{ ARM::VLD2LNd16Pseudo, ARM::VLD2LNd16,
true,
false,
false, SingleSpc, 2, 4 ,
true},
249{ ARM::VLD2LNd16Pseudo_UPD, ARM::VLD2LNd16_UPD,
true,
true,
true, SingleSpc, 2, 4 ,
true},
250{ ARM::VLD2LNd32Pseudo, ARM::VLD2LNd32,
true,
false,
false, SingleSpc, 2, 2 ,
true},
251{ ARM::VLD2LNd32Pseudo_UPD, ARM::VLD2LNd32_UPD,
true,
true,
true, SingleSpc, 2, 2 ,
true},
252{ ARM::VLD2LNd8Pseudo, ARM::VLD2LNd8,
true,
false,
false, SingleSpc, 2, 8 ,
true},
253{ ARM::VLD2LNd8Pseudo_UPD, ARM::VLD2LNd8_UPD,
true,
true,
true, SingleSpc, 2, 8 ,
true},
254{ ARM::VLD2LNq16Pseudo, ARM::VLD2LNq16,
true,
false,
false, EvenDblSpc, 2, 4 ,
true},
255{ ARM::VLD2LNq16Pseudo_UPD, ARM::VLD2LNq16_UPD,
true,
true,
true, EvenDblSpc, 2, 4 ,
true},
256{ ARM::VLD2LNq32Pseudo, ARM::VLD2LNq32,
true,
false,
false, EvenDblSpc, 2, 2 ,
true},
257{ ARM::VLD2LNq32Pseudo_UPD, ARM::VLD2LNq32_UPD,
true,
true,
true, EvenDblSpc, 2, 2 ,
true},
259{ ARM::VLD2q16Pseudo, ARM::VLD2q16,
true,
false,
false, SingleSpc, 4, 4 ,
false},
260{ ARM::VLD2q16PseudoWB_fixed, ARM::VLD2q16wb_fixed,
true,
true,
false, SingleSpc, 4, 4 ,
false},
261{ ARM::VLD2q16PseudoWB_register, ARM::VLD2q16wb_register,
true,
true,
true, SingleSpc, 4, 4 ,
false},
262{ ARM::VLD2q32Pseudo, ARM::VLD2q32,
true,
false,
false, SingleSpc, 4, 2 ,
false},
263{ ARM::VLD2q32PseudoWB_fixed, ARM::VLD2q32wb_fixed,
true,
true,
false, SingleSpc, 4, 2 ,
false},
264{ ARM::VLD2q32PseudoWB_register, ARM::VLD2q32wb_register,
true,
true,
true, SingleSpc, 4, 2 ,
false},
265{ ARM::VLD2q8Pseudo, ARM::VLD2q8,
true,
false,
false, SingleSpc, 4, 8 ,
false},
266{ ARM::VLD2q8PseudoWB_fixed, ARM::VLD2q8wb_fixed,
true,
true,
false, SingleSpc, 4, 8 ,
false},
267{ ARM::VLD2q8PseudoWB_register, ARM::VLD2q8wb_register,
true,
true,
true, SingleSpc, 4, 8 ,
false},
269{ ARM::VLD3DUPd16Pseudo, ARM::VLD3DUPd16,
true,
false,
false, SingleSpc, 3, 4,
true},
270{ ARM::VLD3DUPd16Pseudo_UPD, ARM::VLD3DUPd16_UPD,
true,
true,
true, SingleSpc, 3, 4,
true},
271{ ARM::VLD3DUPd32Pseudo, ARM::VLD3DUPd32,
true,
false,
false, SingleSpc, 3, 2,
true},
272{ ARM::VLD3DUPd32Pseudo_UPD, ARM::VLD3DUPd32_UPD,
true,
true,
true, SingleSpc, 3, 2,
true},
273{ ARM::VLD3DUPd8Pseudo, ARM::VLD3DUPd8,
true,
false,
false, SingleSpc, 3, 8,
true},
274{ ARM::VLD3DUPd8Pseudo_UPD, ARM::VLD3DUPd8_UPD,
true,
true,
true, SingleSpc, 3, 8,
true},
275{ ARM::VLD3DUPq16EvenPseudo, ARM::VLD3DUPq16,
true,
false,
false, EvenDblSpc, 3, 4 ,
true},
276{ ARM::VLD3DUPq16OddPseudo, ARM::VLD3DUPq16,
true,
false,
false, OddDblSpc, 3, 4 ,
true},
277{ ARM::VLD3DUPq16OddPseudo_UPD, ARM::VLD3DUPq16_UPD,
true,
true,
true, OddDblSpc, 3, 4 ,
true},
278{ ARM::VLD3DUPq32EvenPseudo, ARM::VLD3DUPq32,
true,
false,
false, EvenDblSpc, 3, 2 ,
true},
279{ ARM::VLD3DUPq32OddPseudo, ARM::VLD3DUPq32,
true,
false,
false, OddDblSpc, 3, 2 ,
true},
280{ ARM::VLD3DUPq32OddPseudo_UPD, ARM::VLD3DUPq32_UPD,
true,
true,
true, OddDblSpc, 3, 2 ,
true},
281{ ARM::VLD3DUPq8EvenPseudo, ARM::VLD3DUPq8,
true,
false,
false, EvenDblSpc, 3, 8 ,
true},
282{ ARM::VLD3DUPq8OddPseudo, ARM::VLD3DUPq8,
true,
false,
false, OddDblSpc, 3, 8 ,
true},
283{ ARM::VLD3DUPq8OddPseudo_UPD, ARM::VLD3DUPq8_UPD,
true,
true,
true, OddDblSpc, 3, 8 ,
true},
285{ ARM::VLD3LNd16Pseudo, ARM::VLD3LNd16,
true,
false,
false, SingleSpc, 3, 4 ,
true},
286{ ARM::VLD3LNd16Pseudo_UPD, ARM::VLD3LNd16_UPD,
true,
true,
true, SingleSpc, 3, 4 ,
true},
287{ ARM::VLD3LNd32Pseudo, ARM::VLD3LNd32,
true,
false,
false, SingleSpc, 3, 2 ,
true},
288{ ARM::VLD3LNd32Pseudo_UPD, ARM::VLD3LNd32_UPD,
true,
true,
true, SingleSpc, 3, 2 ,
true},
289{ ARM::VLD3LNd8Pseudo, ARM::VLD3LNd8,
true,
false,
false, SingleSpc, 3, 8 ,
true},
290{ ARM::VLD3LNd8Pseudo_UPD, ARM::VLD3LNd8_UPD,
true,
true,
true, SingleSpc, 3, 8 ,
true},
291{ ARM::VLD3LNq16Pseudo, ARM::VLD3LNq16,
true,
false,
false, EvenDblSpc, 3, 4 ,
true},
292{ ARM::VLD3LNq16Pseudo_UPD, ARM::VLD3LNq16_UPD,
true,
true,
true, EvenDblSpc, 3, 4 ,
true},
293{ ARM::VLD3LNq32Pseudo, ARM::VLD3LNq32,
true,
false,
false, EvenDblSpc, 3, 2 ,
true},
294{ ARM::VLD3LNq32Pseudo_UPD, ARM::VLD3LNq32_UPD,
true,
true,
true, EvenDblSpc, 3, 2 ,
true},
296{ ARM::VLD3d16Pseudo, ARM::VLD3d16,
true,
false,
false, SingleSpc, 3, 4 ,
true},
297{ ARM::VLD3d16Pseudo_UPD, ARM::VLD3d16_UPD,
true,
true,
true, SingleSpc, 3, 4 ,
true},
298{ ARM::VLD3d32Pseudo, ARM::VLD3d32,
true,
false,
false, SingleSpc, 3, 2 ,
true},
299{ ARM::VLD3d32Pseudo_UPD, ARM::VLD3d32_UPD,
true,
true,
true, SingleSpc, 3, 2 ,
true},
300{ ARM::VLD3d8Pseudo, ARM::VLD3d8,
true,
false,
false, SingleSpc, 3, 8 ,
true},
301{ ARM::VLD3d8Pseudo_UPD, ARM::VLD3d8_UPD,
true,
true,
true, SingleSpc, 3, 8 ,
true},
303{ ARM::VLD3q16Pseudo_UPD, ARM::VLD3q16_UPD,
true,
true,
true, EvenDblSpc, 3, 4 ,
true},
304{ ARM::VLD3q16oddPseudo, ARM::VLD3q16,
true,
false,
false, OddDblSpc, 3, 4 ,
true},
305{ ARM::VLD3q16oddPseudo_UPD, ARM::VLD3q16_UPD,
true,
true,
true, OddDblSpc, 3, 4 ,
true},
306{ ARM::VLD3q32Pseudo_UPD, ARM::VLD3q32_UPD,
true,
true,
true, EvenDblSpc, 3, 2 ,
true},
307{ ARM::VLD3q32oddPseudo, ARM::VLD3q32,
true,
false,
false, OddDblSpc, 3, 2 ,
true},
308{ ARM::VLD3q32oddPseudo_UPD, ARM::VLD3q32_UPD,
true,
true,
true, OddDblSpc, 3, 2 ,
true},
309{ ARM::VLD3q8Pseudo_UPD, ARM::VLD3q8_UPD,
true,
true,
true, EvenDblSpc, 3, 8 ,
true},
310{ ARM::VLD3q8oddPseudo, ARM::VLD3q8,
true,
false,
false, OddDblSpc, 3, 8 ,
true},
311{ ARM::VLD3q8oddPseudo_UPD, ARM::VLD3q8_UPD,
true,
true,
true, OddDblSpc, 3, 8 ,
true},
313{ ARM::VLD4DUPd16Pseudo, ARM::VLD4DUPd16,
true,
false,
false, SingleSpc, 4, 4,
true},
314{ ARM::VLD4DUPd16Pseudo_UPD, ARM::VLD4DUPd16_UPD,
true,
true,
true, SingleSpc, 4, 4,
true},
315{ ARM::VLD4DUPd32Pseudo, ARM::VLD4DUPd32,
true,
false,
false, SingleSpc, 4, 2,
true},
316{ ARM::VLD4DUPd32Pseudo_UPD, ARM::VLD4DUPd32_UPD,
true,
true,
true, SingleSpc, 4, 2,
true},
317{ ARM::VLD4DUPd8Pseudo, ARM::VLD4DUPd8,
true,
false,
false, SingleSpc, 4, 8,
true},
318{ ARM::VLD4DUPd8Pseudo_UPD, ARM::VLD4DUPd8_UPD,
true,
true,
true, SingleSpc, 4, 8,
true},
319{ ARM::VLD4DUPq16EvenPseudo, ARM::VLD4DUPq16,
true,
false,
false, EvenDblSpc, 4, 4 ,
true},
320{ ARM::VLD4DUPq16OddPseudo, ARM::VLD4DUPq16,
true,
false,
false, OddDblSpc, 4, 4 ,
true},
321{ ARM::VLD4DUPq16OddPseudo_UPD, ARM::VLD4DUPq16_UPD,
true,
true,
true, OddDblSpc, 4, 4 ,
true},
322{ ARM::VLD4DUPq32EvenPseudo, ARM::VLD4DUPq32,
true,
false,
false, EvenDblSpc, 4, 2 ,
true},
323{ ARM::VLD4DUPq32OddPseudo, ARM::VLD4DUPq32,
true,
false,
false, OddDblSpc, 4, 2 ,
true},
324{ ARM::VLD4DUPq32OddPseudo_UPD, ARM::VLD4DUPq32_UPD,
true,
true,
true, OddDblSpc, 4, 2 ,
true},
325{ ARM::VLD4DUPq8EvenPseudo, ARM::VLD4DUPq8,
true,
false,
false, EvenDblSpc, 4, 8 ,
true},
326{ ARM::VLD4DUPq8OddPseudo, ARM::VLD4DUPq8,
true,
false,
false, OddDblSpc, 4, 8 ,
true},
327{ ARM::VLD4DUPq8OddPseudo_UPD, ARM::VLD4DUPq8_UPD,
true,
true,
true, OddDblSpc, 4, 8 ,
true},
329{ ARM::VLD4LNd16Pseudo, ARM::VLD4LNd16,
true,
false,
false, SingleSpc, 4, 4 ,
true},
330{ ARM::VLD4LNd16Pseudo_UPD, ARM::VLD4LNd16_UPD,
true,
true,
true, SingleSpc, 4, 4 ,
true},
331{ ARM::VLD4LNd32Pseudo, ARM::VLD4LNd32,
true,
false,
false, SingleSpc, 4, 2 ,
true},
332{ ARM::VLD4LNd32Pseudo_UPD, ARM::VLD4LNd32_UPD,
true,
true,
true, SingleSpc, 4, 2 ,
true},
333{ ARM::VLD4LNd8Pseudo, ARM::VLD4LNd8,
true,
false,
false, SingleSpc, 4, 8 ,
true},
334{ ARM::VLD4LNd8Pseudo_UPD, ARM::VLD4LNd8_UPD,
true,
true,
true, SingleSpc, 4, 8 ,
true},
335{ ARM::VLD4LNq16Pseudo, ARM::VLD4LNq16,
true,
false,
false, EvenDblSpc, 4, 4 ,
true},
336{ ARM::VLD4LNq16Pseudo_UPD, ARM::VLD4LNq16_UPD,
true,
true,
true, EvenDblSpc, 4, 4 ,
true},
337{ ARM::VLD4LNq32Pseudo, ARM::VLD4LNq32,
true,
false,
false, EvenDblSpc, 4, 2 ,
true},
338{ ARM::VLD4LNq32Pseudo_UPD, ARM::VLD4LNq32_UPD,
true,
true,
true, EvenDblSpc, 4, 2 ,
true},
340{ ARM::VLD4d16Pseudo, ARM::VLD4d16,
true,
false,
false, SingleSpc, 4, 4 ,
true},
341{ ARM::VLD4d16Pseudo_UPD, ARM::VLD4d16_UPD,
true,
true,
true, SingleSpc, 4, 4 ,
true},
342{ ARM::VLD4d32Pseudo, ARM::VLD4d32,
true,
false,
false, SingleSpc, 4, 2 ,
true},
343{ ARM::VLD4d32Pseudo_UPD, ARM::VLD4d32_UPD,
true,
true,
true, SingleSpc, 4, 2 ,
true},
344{ ARM::VLD4d8Pseudo, ARM::VLD4d8,
true,
false,
false, SingleSpc, 4, 8 ,
true},
345{ ARM::VLD4d8Pseudo_UPD, ARM::VLD4d8_UPD,
true,
true,
true, SingleSpc, 4, 8 ,
true},
347{ ARM::VLD4q16Pseudo_UPD, ARM::VLD4q16_UPD,
true,
true,
true, EvenDblSpc, 4, 4 ,
true},
348{ ARM::VLD4q16oddPseudo, ARM::VLD4q16,
true,
false,
false, OddDblSpc, 4, 4 ,
true},
349{ ARM::VLD4q16oddPseudo_UPD, ARM::VLD4q16_UPD,
true,
true,
true, OddDblSpc, 4, 4 ,
true},
350{ ARM::VLD4q32Pseudo_UPD, ARM::VLD4q32_UPD,
true,
true,
true, EvenDblSpc, 4, 2 ,
true},
351{ ARM::VLD4q32oddPseudo, ARM::VLD4q32,
true,
false,
false, OddDblSpc, 4, 2 ,
true},
352{ ARM::VLD4q32oddPseudo_UPD, ARM::VLD4q32_UPD,
true,
true,
true, OddDblSpc, 4, 2 ,
true},
353{ ARM::VLD4q8Pseudo_UPD, ARM::VLD4q8_UPD,
true,
true,
true, EvenDblSpc, 4, 8 ,
true},
354{ ARM::VLD4q8oddPseudo, ARM::VLD4q8,
true,
false,
false, OddDblSpc, 4, 8 ,
true},
355{ ARM::VLD4q8oddPseudo_UPD, ARM::VLD4q8_UPD,
true,
true,
true, OddDblSpc, 4, 8 ,
true},
357{ ARM::VST1LNq16Pseudo, ARM::VST1LNd16,
false,
false,
false, EvenDblSpc, 1, 4 ,
true},
358{ ARM::VST1LNq16Pseudo_UPD, ARM::VST1LNd16_UPD,
false,
true,
true, EvenDblSpc, 1, 4 ,
true},
359{ ARM::VST1LNq32Pseudo, ARM::VST1LNd32,
false,
false,
false, EvenDblSpc, 1, 2 ,
true},
360{ ARM::VST1LNq32Pseudo_UPD, ARM::VST1LNd32_UPD,
false,
true,
true, EvenDblSpc, 1, 2 ,
true},
361{ ARM::VST1LNq8Pseudo, ARM::VST1LNd8,
false,
false,
false, EvenDblSpc, 1, 8 ,
true},
362{ ARM::VST1LNq8Pseudo_UPD, ARM::VST1LNd8_UPD,
false,
true,
true, EvenDblSpc, 1, 8 ,
true},
364{ ARM::VST1d16QPseudo, ARM::VST1d16Q,
false,
false,
false, SingleSpc, 4, 4 ,
false},
365{ ARM::VST1d16QPseudoWB_fixed, ARM::VST1d16Qwb_fixed,
false,
true,
false, SingleSpc, 4, 4 ,
false},
366{ ARM::VST1d16QPseudoWB_register, ARM::VST1d16Qwb_register,
false,
true,
true, SingleSpc, 4, 4 ,
false},
367{ ARM::VST1d16TPseudo, ARM::VST1d16T,
false,
false,
false, SingleSpc, 3, 4 ,
false},
368{ ARM::VST1d16TPseudoWB_fixed, ARM::VST1d16Twb_fixed,
false,
true,
false, SingleSpc, 3, 4 ,
false},
369{ ARM::VST1d16TPseudoWB_register, ARM::VST1d16Twb_register,
false,
true,
true, SingleSpc, 3, 4 ,
false},
371{ ARM::VST1d32QPseudo, ARM::VST1d32Q,
false,
false,
false, SingleSpc, 4, 2 ,
false},
372{ ARM::VST1d32QPseudoWB_fixed, ARM::VST1d32Qwb_fixed,
false,
true,
false, SingleSpc, 4, 2 ,
false},
373{ ARM::VST1d32QPseudoWB_register, ARM::VST1d32Qwb_register,
false,
true,
true, SingleSpc, 4, 2 ,
false},
374{ ARM::VST1d32TPseudo, ARM::VST1d32T,
false,
false,
false, SingleSpc, 3, 2 ,
false},
375{ ARM::VST1d32TPseudoWB_fixed, ARM::VST1d32Twb_fixed,
false,
true,
false, SingleSpc, 3, 2 ,
false},
376{ ARM::VST1d32TPseudoWB_register, ARM::VST1d32Twb_register,
false,
true,
true, SingleSpc, 3, 2 ,
false},
378{ ARM::VST1d64QPseudo, ARM::VST1d64Q,
false,
false,
false, SingleSpc, 4, 1 ,
false},
379{ ARM::VST1d64QPseudoWB_fixed, ARM::VST1d64Qwb_fixed,
false,
true,
false, SingleSpc, 4, 1 ,
false},
380{ ARM::VST1d64QPseudoWB_register, ARM::VST1d64Qwb_register,
false,
true,
true, SingleSpc, 4, 1 ,
false},
381{ ARM::VST1d64TPseudo, ARM::VST1d64T,
false,
false,
false, SingleSpc, 3, 1 ,
false},
382{ ARM::VST1d64TPseudoWB_fixed, ARM::VST1d64Twb_fixed,
false,
true,
false, SingleSpc, 3, 1 ,
false},
383{ ARM::VST1d64TPseudoWB_register, ARM::VST1d64Twb_register,
false,
true,
true, SingleSpc, 3, 1 ,
false},
385{ ARM::VST1d8QPseudo, ARM::VST1d8Q,
false,
false,
false, SingleSpc, 4, 8 ,
false},
386{ ARM::VST1d8QPseudoWB_fixed, ARM::VST1d8Qwb_fixed,
false,
true,
false, SingleSpc, 4, 8 ,
false},
387{ ARM::VST1d8QPseudoWB_register, ARM::VST1d8Qwb_register,
false,
true,
true, SingleSpc, 4, 8 ,
false},
388{ ARM::VST1d8TPseudo, ARM::VST1d8T,
false,
false,
false, SingleSpc, 3, 8 ,
false},
389{ ARM::VST1d8TPseudoWB_fixed, ARM::VST1d8Twb_fixed,
false,
true,
false, SingleSpc, 3, 8 ,
false},
390{ ARM::VST1d8TPseudoWB_register, ARM::VST1d8Twb_register,
false,
true,
true, SingleSpc, 3, 8 ,
false},
392{ ARM::VST1q16HighQPseudo, ARM::VST1d16Q,
false,
false,
false, SingleHighQSpc, 4, 4 ,
false},
393{ ARM::VST1q16HighQPseudo_UPD, ARM::VST1d16Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
394{ ARM::VST1q16HighTPseudo, ARM::VST1d16T,
false,
false,
false, SingleHighTSpc, 3, 4 ,
false},
395{ ARM::VST1q16HighTPseudo_UPD, ARM::VST1d16Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 4 ,
false},
396{ ARM::VST1q16LowQPseudo_UPD, ARM::VST1d16Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 4 ,
false},
397{ ARM::VST1q16LowTPseudo_UPD, ARM::VST1d16Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 4 ,
false},
399{ ARM::VST1q32HighQPseudo, ARM::VST1d32Q,
false,
false,
false, SingleHighQSpc, 4, 2 ,
false},
400{ ARM::VST1q32HighQPseudo_UPD, ARM::VST1d32Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
401{ ARM::VST1q32HighTPseudo, ARM::VST1d32T,
false,
false,
false, SingleHighTSpc, 3, 2 ,
false},
402{ ARM::VST1q32HighTPseudo_UPD, ARM::VST1d32Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 2 ,
false},
403{ ARM::VST1q32LowQPseudo_UPD, ARM::VST1d32Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 2 ,
false},
404{ ARM::VST1q32LowTPseudo_UPD, ARM::VST1d32Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 2 ,
false},
406{ ARM::VST1q64HighQPseudo, ARM::VST1d64Q,
false,
false,
false, SingleHighQSpc, 4, 1 ,
false},
407{ ARM::VST1q64HighQPseudo_UPD, ARM::VST1d64Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
408{ ARM::VST1q64HighTPseudo, ARM::VST1d64T,
false,
false,
false, SingleHighTSpc, 3, 1 ,
false},
409{ ARM::VST1q64HighTPseudo_UPD, ARM::VST1d64Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 1 ,
false},
410{ ARM::VST1q64LowQPseudo_UPD, ARM::VST1d64Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 1 ,
false},
411{ ARM::VST1q64LowTPseudo_UPD, ARM::VST1d64Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 1 ,
false},
413{ ARM::VST1q8HighQPseudo, ARM::VST1d8Q,
false,
false,
false, SingleHighQSpc, 4, 8 ,
false},
414{ ARM::VST1q8HighQPseudo_UPD, ARM::VST1d8Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
415{ ARM::VST1q8HighTPseudo, ARM::VST1d8T,
false,
false,
false, SingleHighTSpc, 3, 8 ,
false},
416{ ARM::VST1q8HighTPseudo_UPD, ARM::VST1d8Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 8 ,
false},
417{ ARM::VST1q8LowQPseudo_UPD, ARM::VST1d8Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 8 ,
false},
418{ ARM::VST1q8LowTPseudo_UPD, ARM::VST1d8Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 8 ,
false},
420{ ARM::VST2LNd16Pseudo, ARM::VST2LNd16,
false,
false,
false, SingleSpc, 2, 4 ,
true},
421{ ARM::VST2LNd16Pseudo_UPD, ARM::VST2LNd16_UPD,
false,
true,
true, SingleSpc, 2, 4 ,
true},
422{ ARM::VST2LNd32Pseudo, ARM::VST2LNd32,
false,
false,
false, SingleSpc, 2, 2 ,
true},
423{ ARM::VST2LNd32Pseudo_UPD, ARM::VST2LNd32_UPD,
false,
true,
true, SingleSpc, 2, 2 ,
true},
424{ ARM::VST2LNd8Pseudo, ARM::VST2LNd8,
false,
false,
false, SingleSpc, 2, 8 ,
true},
425{ ARM::VST2LNd8Pseudo_UPD, ARM::VST2LNd8_UPD,
false,
true,
true, SingleSpc, 2, 8 ,
true},
426{ ARM::VST2LNq16Pseudo, ARM::VST2LNq16,
false,
false,
false, EvenDblSpc, 2, 4,
true},
427{ ARM::VST2LNq16Pseudo_UPD, ARM::VST2LNq16_UPD,
false,
true,
true, EvenDblSpc, 2, 4,
true},
428{ ARM::VST2LNq32Pseudo, ARM::VST2LNq32,
false,
false,
false, EvenDblSpc, 2, 2,
true},
429{ ARM::VST2LNq32Pseudo_UPD, ARM::VST2LNq32_UPD,
false,
true,
true, EvenDblSpc, 2, 2,
true},
431{ ARM::VST2q16Pseudo, ARM::VST2q16,
false,
false,
false, SingleSpc, 4, 4 ,
false},
432{ ARM::VST2q16PseudoWB_fixed, ARM::VST2q16wb_fixed,
false,
true,
false, SingleSpc, 4, 4 ,
false},
433{ ARM::VST2q16PseudoWB_register, ARM::VST2q16wb_register,
false,
true,
true, SingleSpc, 4, 4 ,
false},
434{ ARM::VST2q32Pseudo, ARM::VST2q32,
false,
false,
false, SingleSpc, 4, 2 ,
false},
435{ ARM::VST2q32PseudoWB_fixed, ARM::VST2q32wb_fixed,
false,
true,
false, SingleSpc, 4, 2 ,
false},
436{ ARM::VST2q32PseudoWB_register, ARM::VST2q32wb_register,
false,
true,
true, SingleSpc, 4, 2 ,
false},
437{ ARM::VST2q8Pseudo, ARM::VST2q8,
false,
false,
false, SingleSpc, 4, 8 ,
false},
438{ ARM::VST2q8PseudoWB_fixed, ARM::VST2q8wb_fixed,
false,
true,
false, SingleSpc, 4, 8 ,
false},
439{ ARM::VST2q8PseudoWB_register, ARM::VST2q8wb_register,
false,
true,
true, SingleSpc, 4, 8 ,
false},
441{ ARM::VST3LNd16Pseudo, ARM::VST3LNd16,
false,
false,
false, SingleSpc, 3, 4 ,
true},
442{ ARM::VST3LNd16Pseudo_UPD, ARM::VST3LNd16_UPD,
false,
true,
true, SingleSpc, 3, 4 ,
true},
443{ ARM::VST3LNd32Pseudo, ARM::VST3LNd32,
false,
false,
false, SingleSpc, 3, 2 ,
true},
444{ ARM::VST3LNd32Pseudo_UPD, ARM::VST3LNd32_UPD,
false,
true,
true, SingleSpc, 3, 2 ,
true},
445{ ARM::VST3LNd8Pseudo, ARM::VST3LNd8,
false,
false,
false, SingleSpc, 3, 8 ,
true},
446{ ARM::VST3LNd8Pseudo_UPD, ARM::VST3LNd8_UPD,
false,
true,
true, SingleSpc, 3, 8 ,
true},
447{ ARM::VST3LNq16Pseudo, ARM::VST3LNq16,
false,
false,
false, EvenDblSpc, 3, 4,
true},
448{ ARM::VST3LNq16Pseudo_UPD, ARM::VST3LNq16_UPD,
false,
true,
true, EvenDblSpc, 3, 4,
true},
449{ ARM::VST3LNq32Pseudo, ARM::VST3LNq32,
false,
false,
false, EvenDblSpc, 3, 2,
true},
450{ ARM::VST3LNq32Pseudo_UPD, ARM::VST3LNq32_UPD,
false,
true,
true, EvenDblSpc, 3, 2,
true},
452{ ARM::VST3d16Pseudo, ARM::VST3d16,
false,
false,
false, SingleSpc, 3, 4 ,
true},
453{ ARM::VST3d16Pseudo_UPD, ARM::VST3d16_UPD,
false,
true,
true, SingleSpc, 3, 4 ,
true},
454{ ARM::VST3d32Pseudo, ARM::VST3d32,
false,
false,
false, SingleSpc, 3, 2 ,
true},
455{ ARM::VST3d32Pseudo_UPD, ARM::VST3d32_UPD,
false,
true,
true, SingleSpc, 3, 2 ,
true},
456{ ARM::VST3d8Pseudo, ARM::VST3d8,
false,
false,
false, SingleSpc, 3, 8 ,
true},
457{ ARM::VST3d8Pseudo_UPD, ARM::VST3d8_UPD,
false,
true,
true, SingleSpc, 3, 8 ,
true},
459{ ARM::VST3q16Pseudo_UPD, ARM::VST3q16_UPD,
false,
true,
true, EvenDblSpc, 3, 4 ,
true},
460{ ARM::VST3q16oddPseudo, ARM::VST3q16,
false,
false,
false, OddDblSpc, 3, 4 ,
true},
461{ ARM::VST3q16oddPseudo_UPD, ARM::VST3q16_UPD,
false,
true,
true, OddDblSpc, 3, 4 ,
true},
462{ ARM::VST3q32Pseudo_UPD, ARM::VST3q32_UPD,
false,
true,
true, EvenDblSpc, 3, 2 ,
true},
463{ ARM::VST3q32oddPseudo, ARM::VST3q32,
false,
false,
false, OddDblSpc, 3, 2 ,
true},
464{ ARM::VST3q32oddPseudo_UPD, ARM::VST3q32_UPD,
false,
true,
true, OddDblSpc, 3, 2 ,
true},
465{ ARM::VST3q8Pseudo_UPD, ARM::VST3q8_UPD,
false,
true,
true, EvenDblSpc, 3, 8 ,
true},
466{ ARM::VST3q8oddPseudo, ARM::VST3q8,
false,
false,
false, OddDblSpc, 3, 8 ,
true},
467{ ARM::VST3q8oddPseudo_UPD, ARM::VST3q8_UPD,
false,
true,
true, OddDblSpc, 3, 8 ,
true},
469{ ARM::VST4LNd16Pseudo, ARM::VST4LNd16,
false,
false,
false, SingleSpc, 4, 4 ,
true},
470{ ARM::VST4LNd16Pseudo_UPD, ARM::VST4LNd16_UPD,
false,
true,
true, SingleSpc, 4, 4 ,
true},
471{ ARM::VST4LNd32Pseudo, ARM::VST4LNd32,
false,
false,
false, SingleSpc, 4, 2 ,
true},
472{ ARM::VST4LNd32Pseudo_UPD, ARM::VST4LNd32_UPD,
false,
true,
true, SingleSpc, 4, 2 ,
true},
473{ ARM::VST4LNd8Pseudo, ARM::VST4LNd8,
false,
false,
false, SingleSpc, 4, 8 ,
true},
474{ ARM::VST4LNd8Pseudo_UPD, ARM::VST4LNd8_UPD,
false,
true,
true, SingleSpc, 4, 8 ,
true},
475{ ARM::VST4LNq16Pseudo, ARM::VST4LNq16,
false,
false,
false, EvenDblSpc, 4, 4,
true},
476{ ARM::VST4LNq16Pseudo_UPD, ARM::VST4LNq16_UPD,
false,
true,
true, EvenDblSpc, 4, 4,
true},
477{ ARM::VST4LNq32Pseudo, ARM::VST4LNq32,
false,
false,
false, EvenDblSpc, 4, 2,
true},
478{ ARM::VST4LNq32Pseudo_UPD, ARM::VST4LNq32_UPD,
false,
true,
true, EvenDblSpc, 4, 2,
true},
480{ ARM::VST4d16Pseudo, ARM::VST4d16,
false,
false,
false, SingleSpc, 4, 4 ,
true},
481{ ARM::VST4d16Pseudo_UPD, ARM::VST4d16_UPD,
false,
true,
true, SingleSpc, 4, 4 ,
true},
482{ ARM::VST4d32Pseudo, ARM::VST4d32,
false,
false,
false, SingleSpc, 4, 2 ,
true},
483{ ARM::VST4d32Pseudo_UPD, ARM::VST4d32_UPD,
false,
true,
true, SingleSpc, 4, 2 ,
true},
484{ ARM::VST4d8Pseudo, ARM::VST4d8,
false,
false,
false, SingleSpc, 4, 8 ,
true},
485{ ARM::VST4d8Pseudo_UPD, ARM::VST4d8_UPD,
false,
true,
true, SingleSpc, 4, 8 ,
true},
487{ ARM::VST4q16Pseudo_UPD, ARM::VST4q16_UPD,
false,
true,
true, EvenDblSpc, 4, 4 ,
true},
488{ ARM::VST4q16oddPseudo, ARM::VST4q16,
false,
false,
false, OddDblSpc, 4, 4 ,
true},
489{ ARM::VST4q16oddPseudo_UPD, ARM::VST4q16_UPD,
false,
true,
true, OddDblSpc, 4, 4 ,
true},
490{ ARM::VST4q32Pseudo_UPD, ARM::VST4q32_UPD,
false,
true,
true, EvenDblSpc, 4, 2 ,
true},
491{ ARM::VST4q32oddPseudo, ARM::VST4q32,
false,
false,
false, OddDblSpc, 4, 2 ,
true},
492{ ARM::VST4q32oddPseudo_UPD, ARM::VST4q32_UPD,
false,
true,
true, OddDblSpc, 4, 2 ,
true},
493{ ARM::VST4q8Pseudo_UPD, ARM::VST4q8_UPD,
false,
true,
true, EvenDblSpc, 4, 8 ,
true},
494{ ARM::VST4q8oddPseudo, ARM::VST4q8,
false,
false,
false, OddDblSpc, 4, 8 ,
true},
495{ ARM::VST4q8oddPseudo_UPD, ARM::VST4q8_UPD,
false,
true,
true, OddDblSpc, 4, 8 ,
true}
503 static std::atomic<bool> TableChecked(
false);
504 if (!TableChecked.load(std::memory_order_relaxed)) {
506 TableChecked.store(
true, std::memory_order_relaxed);
522 if (RegSpc == SingleSpc || RegSpc == SingleLowSpc) {
523 D0 =
TRI->getSubReg(
Reg, ARM::dsub_0);
524 D1 =
TRI->getSubReg(
Reg, ARM::dsub_1);
525 D2 =
TRI->getSubReg(
Reg, ARM::dsub_2);
526 D3 =
TRI->getSubReg(
Reg, ARM::dsub_3);
527 }
else if (RegSpc == SingleHighQSpc) {
528 D0 =
TRI->getSubReg(
Reg, ARM::dsub_4);
529 D1 =
TRI->getSubReg(
Reg, ARM::dsub_5);
530 D2 =
TRI->getSubReg(
Reg, ARM::dsub_6);
531 D3 =
TRI->getSubReg(
Reg, ARM::dsub_7);
532 }
else if (RegSpc == SingleHighTSpc) {
533 D0 =
TRI->getSubReg(
Reg, ARM::dsub_3);
534 D1 =
TRI->getSubReg(
Reg, ARM::dsub_4);
535 D2 =
TRI->getSubReg(
Reg, ARM::dsub_5);
536 D3 =
TRI->getSubReg(
Reg, ARM::dsub_6);
537 }
else if (RegSpc == EvenDblSpc) {
538 D0 =
TRI->getSubReg(
Reg, ARM::dsub_0);
539 D1 =
TRI->getSubReg(
Reg, ARM::dsub_2);
540 D2 =
TRI->getSubReg(
Reg, ARM::dsub_4);
541 D3 =
TRI->getSubReg(
Reg, ARM::dsub_6);
543 assert(RegSpc == OddDblSpc &&
"unknown register spacing");
544 D0 =
TRI->getSubReg(
Reg, ARM::dsub_1);
545 D1 =
TRI->getSubReg(
Reg, ARM::dsub_3);
546 D2 =
TRI->getSubReg(
Reg, ARM::dsub_5);
547 D3 =
TRI->getSubReg(
Reg, ARM::dsub_7);
555 MachineBasicBlock &
MBB = *
MI.getParent();
559 assert(TableEntry && TableEntry->IsLoad &&
"NEONLdStTable lookup failed");
560 NEONRegSpacing RegSpc = (NEONRegSpacing)TableEntry->RegSpacing;
561 unsigned NumRegs = TableEntry->NumRegs;
564 TII->get(TableEntry->RealOpc));
567 bool DstIsDead =
MI.getOperand(
OpIdx).isDead();
570 bool IsVLD2DUP = TableEntry->RealOpc == ARM::VLD2DUPd8x2 ||
571 TableEntry->RealOpc == ARM::VLD2DUPd16x2 ||
572 TableEntry->RealOpc == ARM::VLD2DUPd32x2 ||
573 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_fixed ||
574 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_fixed ||
575 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_fixed ||
576 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_register ||
577 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_register ||
578 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_register;
581 unsigned SubRegIndex;
582 if (RegSpc == EvenDblSpc) {
583 SubRegIndex = ARM::dsub_0;
585 assert(RegSpc == OddDblSpc &&
"Unexpected spacing!");
586 SubRegIndex = ARM::dsub_1;
589 MCRegister DstRegPair =
590 TRI->getMatchingSuperReg(
SubReg, ARM::dsub_0, &ARM::DPairSpcRegClass);
593 MCRegister D0, D1, D2, D3;
596 if (NumRegs > 1 && TableEntry->copyAllListRegs)
598 if (NumRegs > 2 && TableEntry->copyAllListRegs)
600 if (NumRegs > 3 && TableEntry->copyAllListRegs)
604 if (TableEntry->isUpdating)
612 if (TableEntry->hasWritebackOperand) {
620 const MachineOperand &AM6Offset =
MI.getOperand(
OpIdx++);
621 if (TableEntry->RealOpc == ARM::VLD1d8Qwb_fixed ||
622 TableEntry->RealOpc == ARM::VLD1d16Qwb_fixed ||
623 TableEntry->RealOpc == ARM::VLD1d32Qwb_fixed ||
624 TableEntry->RealOpc == ARM::VLD1d64Qwb_fixed ||
625 TableEntry->RealOpc == ARM::VLD1d8Twb_fixed ||
626 TableEntry->RealOpc == ARM::VLD1d16Twb_fixed ||
627 TableEntry->RealOpc == ARM::VLD1d32Twb_fixed ||
628 TableEntry->RealOpc == ARM::VLD1d64Twb_fixed ||
629 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_fixed ||
630 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_fixed ||
631 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_fixed) {
633 "A fixed writing-back pseudo instruction provides an offset "
643 unsigned SrcOpIdx = 0;
644 if (RegSpc == EvenDblSpc || RegSpc == OddDblSpc || RegSpc == SingleLowSpc ||
645 RegSpc == SingleHighQSpc || RegSpc == SingleHighTSpc)
655 MachineOperand MO =
MI.getOperand(SrcOpIdx);
665 MI.eraseFromParent();
673 MachineBasicBlock &
MBB = *
MI.getParent();
677 assert(TableEntry && !TableEntry->IsLoad &&
"NEONLdStTable lookup failed");
678 NEONRegSpacing RegSpc = (NEONRegSpacing)TableEntry->RegSpacing;
679 unsigned NumRegs = TableEntry->NumRegs;
682 TII->get(TableEntry->RealOpc));
684 if (TableEntry->isUpdating)
691 if (TableEntry->hasWritebackOperand) {
699 const MachineOperand &AM6Offset =
MI.getOperand(
OpIdx++);
700 if (TableEntry->RealOpc == ARM::VST1d8Qwb_fixed ||
701 TableEntry->RealOpc == ARM::VST1d16Qwb_fixed ||
702 TableEntry->RealOpc == ARM::VST1d32Qwb_fixed ||
703 TableEntry->RealOpc == ARM::VST1d64Qwb_fixed ||
704 TableEntry->RealOpc == ARM::VST1d8Twb_fixed ||
705 TableEntry->RealOpc == ARM::VST1d16Twb_fixed ||
706 TableEntry->RealOpc == ARM::VST1d32Twb_fixed ||
707 TableEntry->RealOpc == ARM::VST1d64Twb_fixed) {
709 "A fixed writing-back pseudo instruction provides an offset "
716 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
717 bool SrcIsUndef =
MI.getOperand(
OpIdx).isUndef();
719 MCRegister D0, D1, D2, D3;
722 if (NumRegs > 1 && TableEntry->copyAllListRegs)
724 if (NumRegs > 2 && TableEntry->copyAllListRegs)
726 if (NumRegs > 3 && TableEntry->copyAllListRegs)
733 if (SrcIsKill && !SrcIsUndef)
735 else if (!SrcIsUndef)
741 MI.eraseFromParent();
749 MachineBasicBlock &
MBB = *
MI.getParent();
753 assert(TableEntry &&
"NEONLdStTable lookup failed");
754 NEONRegSpacing RegSpc = (NEONRegSpacing)TableEntry->RegSpacing;
755 unsigned NumRegs = TableEntry->NumRegs;
756 unsigned RegElts = TableEntry->RegElts;
759 TII->get(TableEntry->RealOpc));
763 unsigned Lane =
MI.getOperand(
MI.getDesc().getNumOperands() - 3).getImm();
766 assert(RegSpc != OddDblSpc &&
"unexpected register spacing for VLD/VST-lane");
767 if (RegSpc == EvenDblSpc && Lane >= RegElts) {
771 assert(Lane < RegElts &&
"out of range lane for VLD/VST-lane");
773 MCRegister D0, D1, D2, D3;
775 bool DstIsDead =
false;
776 if (TableEntry->IsLoad) {
777 DstIsDead =
MI.getOperand(
OpIdx).isDead();
778 DstReg =
MI.getOperand(
OpIdx++).getReg();
789 if (TableEntry->isUpdating)
796 if (TableEntry->hasWritebackOperand)
800 MachineOperand MO =
MI.getOperand(
OpIdx++);
801 if (!TableEntry->IsLoad)
826 if (TableEntry->IsLoad)
832 MI.eraseFromParent();
838 unsigned Opc,
bool IsExt) {
840 MachineBasicBlock &
MBB = *
MI.getParent();
849 MachineOperand VdSrc(
MI.getOperand(
OpIdx++));
853 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
855 MCRegister D0, D1, D2, D3;
860 MachineOperand VmSrc(
MI.getOperand(
OpIdx++));
870 MI.eraseFromParent();
876 MachineBasicBlock &
MBB = *
MI.getParent();
878 MI.getOpcode() == ARM::MQQPRStore ||
MI.getOpcode() == ARM::MQQQQPRStore
881 MachineInstrBuilder MIB =
889 MIB.
add(
MI.getOperand(1));
891 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_0), Flags);
892 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_1), Flags);
893 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_2), Flags);
894 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_3), Flags);
895 if (
MI.getOpcode() == ARM::MQQQQPRStore ||
896 MI.getOpcode() == ARM::MQQQQPRLoad) {
897 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_4), Flags);
898 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_5), Flags);
899 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_6), Flags);
900 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_7), Flags);
903 if (NewOpc == ARM::VSTMDIA)
908 MI.eraseFromParent();
956 unsigned TargetFlag) {
960 unsigned Imm = MO.
getImm();
961 switch (TargetFlag) {
963 Imm = (Imm >> 24) & 0xff;
966 Imm = (Imm >> 16) & 0xff;
969 Imm = (Imm >> 8) & 0xff;
975 Imm = (Imm >> 16) & 0xffff;
994void ARMExpandPseudo::ExpandTMOV32BitImm(MachineBasicBlock &
MBB,
998 bool DstIsDead =
MI.getOperand(0).isDead();
999 const MachineOperand &MO =
MI.getOperand(1);
1000 unsigned MIFlags =
MI.getFlags();
1009 unsigned PendingShift = 0;
1010 for (
unsigned Byte = 0;
Byte < 4; ++
Byte) {
1016 bool ZeroImm = Operand.
isImm() && Operand.
getImm() == 0;
1017 unsigned Op = PendingShift ? ARM::tADDi8 : ARM::tMOVi8;
1021 if (PendingShift && (!ZeroImm || Byte == 3)) {
1036 MachineInstrBuilder MIB =
1039 if (
Op == ARM::tADDi8)
1049 if (PendingShift || !ZeroImm)
1055 (--
MBBI)->getOperand(0).setIsDead(DstIsDead);
1057 MI.eraseFromParent();
1060void ARMExpandPseudo::ExpandMOV32BitImm(MachineBasicBlock &
MBB,
1062 MachineInstr &
MI = *
MBBI;
1063 unsigned Opcode =
MI.getOpcode();
1067 bool DstIsDead =
MI.getOperand(0).isDead();
1068 bool isCC = Opcode == ARM::MOVCCi32imm || Opcode == ARM::t2MOVCCi32imm;
1069 const MachineOperand &MO =
MI.getOperand(isCC ? 2 : 1);
1071 MachineInstrBuilder LO16, HI16;
1074 if (!STI->hasV6T2Ops() &&
1075 (Opcode == ARM::MOVi32imm || Opcode == ARM::MOVCCi32imm)) {
1079 assert (MO.
isImm() &&
"MOVi32imm w/ non-immediate source operand!");
1080 unsigned ImmVal = (unsigned)MO.
getImm();
1081 unsigned SOImmValV1 = 0, SOImmValV2 = 0;
1097 SOImmValV1 = ~(-SOImmValV1);
1100 unsigned MIFlags =
MI.getFlags();
1101 LO16 = LO16.
addImm(SOImmValV1);
1102 HI16 = HI16.
addImm(SOImmValV2);
1113 MI.eraseFromParent();
1117 unsigned LO16Opc = 0;
1118 unsigned HI16Opc = 0;
1119 unsigned MIFlags =
MI.getFlags();
1120 if (Opcode == ARM::t2MOVi32imm || Opcode == ARM::t2MOVCCi32imm) {
1121 LO16Opc = ARM::t2MOVi16;
1122 HI16Opc = ARM::t2MOVTi16;
1124 LO16Opc = ARM::MOVi16;
1125 HI16Opc = ARM::MOVTi16;
1139 if (!(HIOperand.isImm() && HIOperand.getImm() == 0)) {
1144 HI16.
add(HIOperand);
1153 if (RequiresBundling)
1156 MI.eraseFromParent();
1164 const std::initializer_list<unsigned> &Regs,
1168 if (!
Op.isReg() || !
Op.isUse())
1174 std::set_difference(Regs.begin(), Regs.end(), OpRegs.
begin(), OpRegs.
end(),
1175 std::back_inserter(ClearRegs));
1178void ARMExpandPseudo::CMSEClearGPRegs(
1180 const DebugLoc &
DL,
const SmallVectorImpl<unsigned> &ClearRegs,
1181 unsigned ClobberReg) {
1183 if (STI->hasV8_1MMainlineOps()) {
1185 MachineInstrBuilder CLRM =
1187 for (
unsigned R : ClearRegs)
1194 for (
unsigned Reg : ClearRegs) {
1195 if (
Reg == ClobberReg)
1203 .
addImm(STI->hasDSP() ? 0xc00 : 0x800)
1222 if ((
Reg >= ARM::Q0 &&
Reg <= ARM::Q7) ||
1223 (
Reg >= ARM::D0 &&
Reg <= ARM::D15) ||
1224 (
Reg >= ARM::S0 &&
Reg <= ARM::S31))
1229 if (
Reg >= ARM::Q0 &&
Reg <= ARM::Q7) {
1230 int R =
Reg - ARM::Q0;
1231 ClearRegs.
reset(R * 4, (R + 1) * 4);
1232 }
else if (
Reg >= ARM::D0 &&
Reg <= ARM::D15) {
1233 int R =
Reg - ARM::D0;
1234 ClearRegs.
reset(R * 2, (R + 1) * 2);
1235 }
else if (
Reg >= ARM::S0 &&
Reg <= ARM::S31) {
1236 ClearRegs[
Reg - ARM::S0] =
false;
1243ARMExpandPseudo::CMSEClearFPRegs(MachineBasicBlock &
MBB,
1245 BitVector ClearRegs(16,
true);
1248 if (STI->hasV8_1MMainlineOps())
1249 return CMSEClearFPRegsV81(
MBB,
MBBI, ClearRegs);
1251 return CMSEClearFPRegsV8(
MBB,
MBBI, ClearRegs);
1257ARMExpandPseudo::CMSEClearFPRegsV8(MachineBasicBlock &
MBB,
1259 const BitVector &ClearRegs) {
1260 if (!STI->hasFPRegs())
1269 MachineBasicBlock *ClearBB, *DoneBB;
1271 ClearBB = DoneBB = &
MBB;
1288 for (
const MachineOperand &
Op : RetI.operands()) {
1292 if (
Reg == ARM::NoRegister ||
Reg == ARM::LR)
1318 for (
unsigned D = 0;
D < 8;
D++) {
1320 if (ClearRegs[
D * 2 + 0] && ClearRegs[
D * 2 + 1]) {
1321 unsigned Reg = ARM::D0 +
D;
1328 if (ClearRegs[
D * 2 + 0]) {
1329 unsigned Reg = ARM::S0 +
D * 2;
1335 if (ClearRegs[
D * 2 + 1]) {
1336 unsigned Reg = ARM::S0 +
D * 2 + 1;
1366ARMExpandPseudo::CMSEClearFPRegsV81(MachineBasicBlock &
MBB,
1368 const BitVector &ClearRegs) {
1373 int Start = -1, End = -1;
1374 for (
int S = 0,
E = ClearRegs.
size(); S !=
E; ++S) {
1375 if (ClearRegs[S] && S == End + 1) {
1381 MachineInstrBuilder VSCCLRM =
1384 while (++Start <= End)
1392 MachineInstrBuilder VSCCLRM =
1395 while (++Start <= End)
1403void ARMExpandPseudo::CMSESaveClearFPRegs(
1405 const LivePhysRegs &LiveRegs, SmallVectorImpl<unsigned> &ScratchRegs) {
1406 if (STI->hasV8_1MMainlineOps())
1407 CMSESaveClearFPRegsV81(
MBB,
MBBI,
DL, LiveRegs);
1408 else if (STI->hasV8MMainlineOps())
1409 CMSESaveClearFPRegsV8(
MBB,
MBBI,
DL, LiveRegs, ScratchRegs);
1413void ARMExpandPseudo::CMSESaveClearFPRegsV8(
1415 const LivePhysRegs &LiveRegs, SmallVectorImpl<unsigned> &ScratchRegs) {
1419 unsigned SpareReg = ScratchRegs.
front();
1428 std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs;
1429 std::vector<unsigned> NonclearedFPRegs;
1430 bool ReturnsFPReg =
false;
1431 for (
const MachineOperand &
Op :
MBBI->operands()) {
1432 if (
Op.isReg() &&
Op.isUse()) {
1438 if (ScratchRegs.
size() >= 2) {
1441 ClearedFPRegs.emplace_back(
Reg, SaveReg1, SaveReg2);
1450 NonclearedFPRegs.push_back(
Reg);
1453 if (ScratchRegs.
size() >= 1) {
1455 ClearedFPRegs.emplace_back(
Reg, SaveReg, 0);
1462 NonclearedFPRegs.push_back(
Reg);
1465 }
else if (
Op.isReg() &&
Op.isDef()) {
1469 ReturnsFPReg =
true;
1473 bool PassesFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty());
1475 if (PassesFPReg || ReturnsFPReg)
1476 assert(STI->hasFPRegs() &&
"Subtarget needs fpregs");
1502 if (ReturnsFPReg && !PassesFPReg) {
1503 bool S0Dead = !LiveRegs.contains(ARM::S0);
1512 MachineInstrBuilder VLSTM =
1527 for (
const auto &Regs : ClearedFPRegs) {
1528 unsigned Reg, SaveReg1, SaveReg2;
1529 std::tie(
Reg, SaveReg1, SaveReg2) = Regs;
1541 for (
unsigned Reg : NonclearedFPRegs) {
1551 MCRegister SReg0 =
TRI->getSubReg(
Reg, ARM::ssub_0);
1594void ARMExpandPseudo::CMSESaveClearFPRegsV81(MachineBasicBlock &
MBB,
1597 const LivePhysRegs &LiveRegs) {
1598 BitVector ClearRegs(32,
true);
1604 if (!DefFP && ClearRegs.
count() == ClearRegs.
size()) {
1612 MachineInstrBuilder VLSTM =
1627 MachineInstrBuilder VPUSH =
1631 for (
unsigned Reg = ARM::S16;
Reg <= ARM::S31; ++
Reg)
1635 (void)CMSEClearFPRegsV81(
MBB,
MBBI, ClearRegs);
1646void ARMExpandPseudo::CMSERestoreFPRegs(
1648 SmallVectorImpl<unsigned> &AvailableRegs) {
1649 if (STI->hasV8_1MMainlineOps())
1650 CMSERestoreFPRegsV81(
MBB,
MBBI,
DL, AvailableRegs);
1651 else if (STI->hasV8MMainlineOps())
1652 CMSERestoreFPRegsV8(
MBB,
MBBI,
DL, AvailableRegs);
1655void ARMExpandPseudo::CMSERestoreFPRegsV8(
1657 SmallVectorImpl<unsigned> &AvailableRegs) {
1660 unsigned ScratchReg = ARM::NoRegister;
1661 if (STI->fixCMSE_CVE_2021_35465())
1665 std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs;
1666 std::vector<unsigned> NonclearedFPRegs;
1667 for (
const MachineOperand &
Op :
MBBI->operands()) {
1668 if (
Op.isReg() &&
Op.isDef()) {
1674 if (AvailableRegs.
size() >= 2) {
1677 ClearedFPRegs.emplace_back(
Reg, SaveReg1, SaveReg2);
1686 NonclearedFPRegs.push_back(
Reg);
1689 if (AvailableRegs.
size() >= 1) {
1691 ClearedFPRegs.emplace_back(
Reg, SaveReg, 0);
1698 NonclearedFPRegs.push_back(
Reg);
1704 bool returnsFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty());
1707 assert(STI->hasFPRegs() &&
"Subtarget needs fpregs");
1710 for (
unsigned Reg : NonclearedFPRegs) {
1727 MachineInstrBuilder VLLDM =
1734 if (STI->fixCMSE_CVE_2021_35465()) {
1735 auto Bundler = MIBundleBuilder(
MBB, VLLDM);
1754 if (STI->hasFPRegs())
1767 for (
const auto &Regs : ClearedFPRegs) {
1768 unsigned Reg, SaveReg1, SaveReg2;
1769 std::tie(
Reg, SaveReg1, SaveReg2) = Regs;
1793 if ((
Reg >= ARM::Q0 &&
Reg <= ARM::Q7) ||
1794 (
Reg >= ARM::D0 &&
Reg <= ARM::D15) ||
1795 (
Reg >= ARM::S0 &&
Reg <= ARM::S31))
1801void ARMExpandPseudo::CMSERestoreFPRegsV81(
1803 SmallVectorImpl<unsigned> &AvailableRegs) {
1805 if (STI->fixCMSE_CVE_2021_35465()) {
1832 MachineInstrBuilder VPOP =
1836 for (
unsigned Reg = ARM::S16;
Reg <= ARM::S31; ++
Reg)
1844bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &
MBB,
1846 unsigned LdrexOp,
unsigned StrexOp,
1849 bool IsThumb = STI->isThumb();
1851 MachineInstr &
MI = *
MBBI;
1853 const MachineOperand &Dest =
MI.getOperand(0);
1854 Register TempReg =
MI.getOperand(1).getReg();
1857 assert(!
MI.getOperand(2).isUndef() &&
"cannot handle undef");
1858 Register AddrReg =
MI.getOperand(2).getReg();
1859 Register DesiredReg =
MI.getOperand(3).getReg();
1863 assert(STI->hasV8MBaselineOps() &&
1864 "CMP_SWAP not expected to be custom expanded for Thumb1");
1865 assert((UxtOp == 0 || UxtOp == ARM::tUXTB || UxtOp == ARM::tUXTH) &&
1866 "ARMv8-M.baseline does not have t2UXTB/t2UXTH");
1868 "DesiredReg used for UXT op must be tGPR");
1877 MF->
insert(++LoadCmpBB->getIterator(), StoreBB);
1878 MF->
insert(++StoreBB->getIterator(), DoneBB);
1881 MachineInstrBuilder MIB =
1894 MachineInstrBuilder MIB;
1897 if (LdrexOp == ARM::t2LDREX)
1901 unsigned CMPrr = IsThumb ? ARM::tCMPhir : ARM::CMPrr;
1906 unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;
1911 LoadCmpBB->addSuccessor(DoneBB);
1912 LoadCmpBB->addSuccessor(StoreBB);
1921 if (StrexOp == ARM::t2STREX)
1926 IsThumb ? (IsThumb1Only ? ARM::tCMPi8 : ARM::t2CMPri) :
ARM::CMPri;
1935 StoreBB->addSuccessor(LoadCmpBB);
1936 StoreBB->addSuccessor(DoneBB);
1944 MI.eraseFromParent();
1947 LivePhysRegs LiveRegs;
1952 StoreBB->clearLiveIns();
1954 LoadCmpBB->clearLiveIns();
1964 unsigned Flags,
bool IsThumb,
1969 MIB.
addReg(RegLo, Flags);
1970 MIB.
addReg(RegHi, Flags);
1976bool ARMExpandPseudo::ExpandCMP_SWAP_64(MachineBasicBlock &
MBB,
1979 bool IsThumb = STI->isThumb();
1981 MachineInstr &
MI = *
MBBI;
1983 MachineOperand &Dest =
MI.getOperand(0);
1986 assert(!
MI.getOperand(1).isUndef() &&
"cannot handle undef");
1987 Register AddrAndTempReg =
MI.getOperand(1).getReg();
1988 Register AddrReg =
TRI->getSubReg(AddrAndTempReg, ARM::gsub_0);
1989 Register TempReg =
TRI->getSubReg(AddrAndTempReg, ARM::gsub_1);
1990 assert(
MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg() &&
1991 "tied operands have different registers");
1992 Register DesiredReg =
MI.getOperand(3).getReg();
1993 MachineOperand
New =
MI.getOperand(4);
1994 New.setIsKill(
false);
1998 Register DesiredLo =
TRI->getSubReg(DesiredReg, ARM::gsub_0);
1999 Register DesiredHi =
TRI->getSubReg(DesiredReg, ARM::gsub_1);
2007 MF->
insert(++LoadCmpBB->getIterator(), StoreBB);
2008 MF->
insert(++StoreBB->getIterator(), DoneBB);
2015 unsigned LDREXD = IsThumb ? ARM::t2LDREXD : ARM::LDREXD;
2016 MachineInstrBuilder MIB;
2021 unsigned CMPrr = IsThumb ? ARM::tCMPhir : ARM::CMPrr;
2032 unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;
2037 LoadCmpBB->addSuccessor(DoneBB);
2038 LoadCmpBB->addSuccessor(StoreBB);
2044 unsigned STREXD = IsThumb ? ARM::t2STREXD : ARM::STREXD;
2050 unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
2059 StoreBB->addSuccessor(LoadCmpBB);
2060 StoreBB->addSuccessor(DoneBB);
2068 MI.eraseFromParent();
2071 LivePhysRegs LiveRegs;
2076 StoreBB->clearLiveIns();
2078 LoadCmpBB->clearLiveIns();
2093 for (
unsigned Reg = ARM::R4;
Reg < ARM::R8; ++
Reg) {
2105 for (
unsigned LoReg = ARM::R7, HiReg = ARM::R11; LoReg >= ARM::R4;
2107 if (JumpReg == LoReg)
2116 for (
unsigned Reg = ARM::R4;
Reg < ARM::R8; ++
Reg) {
2125 if (JumpReg >= ARM::R4 && JumpReg <= ARM::R7) {
2126 Register LoReg = JumpReg == ARM::R4 ? ARM::R5 : ARM::R4;
2139 for (
unsigned Reg = ARM::R4;
Reg < ARM::R12; ++
Reg) {
2154 for (
int R = 0; R < 4; ++R) {
2162 for (
int R = 0; R < 4; ++R)
2169 for (
unsigned Reg = ARM::R4;
Reg < ARM::R12; ++
Reg)
2174bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &
MBB,
2177 MachineInstr &
MI = *
MBBI;
2178 unsigned Opcode =
MI.getOpcode();
2186 if (DstReg ==
MI.getOperand(3).getReg()) {
2188 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBITd : ARM::VBITq;
2190 .
add(
MI.getOperand(0))
2191 .
add(
MI.getOperand(3))
2192 .
add(
MI.getOperand(2))
2193 .
add(
MI.getOperand(1))
2195 .
add(
MI.getOperand(5));
2196 }
else if (DstReg ==
MI.getOperand(2).getReg()) {
2198 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBIFd : ARM::VBIFq;
2200 .
add(
MI.getOperand(0))
2201 .
add(
MI.getOperand(2))
2202 .
add(
MI.getOperand(3))
2203 .
add(
MI.getOperand(1))
2205 .
add(
MI.getOperand(5));
2208 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBSLd : ARM::VBSLq;
2209 if (DstReg ==
MI.getOperand(1).getReg()) {
2211 .
add(
MI.getOperand(0))
2212 .
add(
MI.getOperand(1))
2213 .
add(
MI.getOperand(2))
2214 .
add(
MI.getOperand(3))
2216 .
add(
MI.getOperand(5));
2219 unsigned MoveOpc = Opcode == ARM::VBSPd ? ARM::VORRd : ARM::VORRq;
2220 unsigned MO1Flags =
getRegState(
MI.getOperand(1)) & ~RegState::Kill;
2225 .
addReg(
MI.getOperand(1).getReg(), MO1Flags)
2226 .
addReg(
MI.getOperand(1).getReg(), MO1Flags)
2228 .
add(
MI.getOperand(5));
2230 .
add(
MI.getOperand(0))
2234 .
add(
MI.getOperand(2))
2235 .
add(
MI.getOperand(3))
2237 .
add(
MI.getOperand(5));
2240 MI.eraseFromParent();
2244 case ARM::TCRETURNdi:
2245 case ARM::TCRETURNri:
2246 case ARM::TCRETURNrinotr12: {
2248 if (
MBBI->getOpcode() == ARM::SEH_EpilogEnd)
2250 if (
MBBI->getOpcode() == ARM::SEH_Nop_Ret)
2253 "Can only insert epilog into returning blocks");
2254 unsigned RetOpcode =
MBBI->getOpcode();
2256 const ARMBaseInstrInfo &
TII = *
static_cast<const ARMBaseInstrInfo *
>(
2261 if (
MBBI->getOpcode() == ARM::SEH_EpilogEnd)
2263 if (
MBBI->getOpcode() == ARM::SEH_Nop_Ret)
2265 MachineOperand &JumpTarget =
MBBI->getOperand(0);
2268 if (RetOpcode == ARM::TCRETURNdi) {
2290 }
else if (RetOpcode == ARM::TCRETURNri ||
2291 RetOpcode == ARM::TCRETURNrinotr12) {
2293 STI->isThumb() ? ARM::tTAILJMPr
2294 : (STI->hasV4TOps() ? ARM::TAILJMPr : ARM::TAILJMPr4);
2300 auto NewMI = std::prev(
MBBI);
2301 for (
unsigned i = 2, e =
MBBI->getNumOperands(); i != e; ++i)
2302 NewMI->addOperand(
MBBI->getOperand(i));
2305 if (
MI.isCandidateForAdditionalCallInfo())
2306 MI.getMF()->moveAdditionalCallInfo(&
MI, &*NewMI);
2315 case ARM::tBXNS_RET: {
2321 MachineBasicBlock &AfterBB = CMSEClearFPRegs(
MBB,
MBBI);
2323 if (STI->hasV8_1MMainlineOps()) {
2326 TII->get(ARM::VLDR_FPCXTNS_post), ARM::SP)
2337 return !Op.isReg() || Op.getReg() != ARM::R12;
2341 *
MBBI, {ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R12}, ClearRegs);
2342 CMSEClearGPRegs(AfterBB, AfterBB.
end(),
MBBI->getDebugLoc(), ClearRegs,
2345 MachineInstrBuilder NewMI =
2347 TII->get(ARM::tBXNS))
2350 for (
const MachineOperand &
Op :
MI.operands())
2352 MI.eraseFromParent();
2355 case ARM::tBLXNS_CALL: {
2363 LivePhysRegs LiveRegs(*
TRI);
2364 LiveRegs.addLiveOuts(
MBB);
2366 LiveRegs.stepBackward(
MI);
2367 LiveRegs.stepBackward(*
MBBI);
2372 SmallVector<unsigned, 16> ClearRegs;
2374 {ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R4,
2375 ARM::R5, ARM::R6, ARM::R7, ARM::R8, ARM::R9,
2376 ARM::R10, ARM::R11, ARM::R12},
2378 auto OriginalClearRegs = ClearRegs;
2382 unsigned ScratchReg = ClearRegs.
front();
2406 CMSESaveClearFPRegs(
MBB,
MBBI,
DL, LiveRegs,
2408 CMSEClearGPRegs(
MBB,
MBBI,
DL, ClearRegs, JumpReg);
2410 const MachineInstrBuilder NewCall =
2417 if (
MI.isCandidateForAdditionalCallInfo())
2418 MI.getMF()->moveAdditionalCallInfo(&
MI, NewCall.
getInstr());
2420 CMSERestoreFPRegs(
MBB,
MBBI,
DL, OriginalClearRegs);
2424 MI.eraseFromParent();
2429 case ARM::VMOVDcc: {
2430 unsigned newOpc = Opcode != ARM::VMOVDcc ? ARM::VMOVS : ARM::VMOVD;
2432 MI.getOperand(1).getReg())
2433 .
add(
MI.getOperand(2))
2435 .
add(
MI.getOperand(4))
2438 MI.eraseFromParent();
2445 MI.getOperand(1).getReg())
2446 .
add(
MI.getOperand(2))
2448 .
add(
MI.getOperand(4))
2452 MI.eraseFromParent();
2455 case ARM::MOVCCsi: {
2457 (
MI.getOperand(1).getReg()))
2458 .
add(
MI.getOperand(2))
2461 .
add(
MI.getOperand(5))
2465 MI.eraseFromParent();
2468 case ARM::MOVCCsr: {
2470 (
MI.getOperand(1).getReg()))
2471 .
add(
MI.getOperand(2))
2472 .
add(
MI.getOperand(3))
2475 .
add(
MI.getOperand(6))
2479 MI.eraseFromParent();
2482 case ARM::t2MOVCCi16:
2483 case ARM::MOVCCi16: {
2484 unsigned NewOpc = AFI->
isThumbFunction() ? ARM::t2MOVi16 : ARM::MOVi16;
2486 MI.getOperand(1).getReg())
2489 .
add(
MI.getOperand(4))
2491 MI.eraseFromParent();
2498 MI.getOperand(1).getReg())
2501 .
add(
MI.getOperand(4))
2505 MI.eraseFromParent();
2512 MI.getOperand(1).getReg())
2515 .
add(
MI.getOperand(4))
2519 MI.eraseFromParent();
2522 case ARM::t2MOVCClsl:
2523 case ARM::t2MOVCClsr:
2524 case ARM::t2MOVCCasr:
2525 case ARM::t2MOVCCror: {
2528 case ARM::t2MOVCClsl: NewOpc = ARM::t2LSLri;
break;
2529 case ARM::t2MOVCClsr: NewOpc = ARM::t2LSRri;
break;
2530 case ARM::t2MOVCCasr: NewOpc = ARM::t2ASRri;
break;
2531 case ARM::t2MOVCCror: NewOpc = ARM::t2RORri;
break;
2535 MI.getOperand(1).getReg())
2536 .
add(
MI.getOperand(2))
2539 .
add(
MI.getOperand(5))
2542 MI.eraseFromParent();
2545 case ARM::Int_eh_sjlj_dispatchsetup: {
2546 MachineFunction &MF = *
MI.getParent()->getParent();
2547 const ARMBaseRegisterInfo &RI =
TII->getRegisterInfo();
2555 "base pointer without frame pointer?");
2569 if (RI.hasStackRealignment(MF)) {
2575 "The BIC instruction cannot encode "
2576 "immediates larger than 256 with all lower "
2579 ARM::t2BICri : ARM::BICri;
2587 MI.eraseFromParent();
2595 MI.getOperand(0).getReg())
2596 .
add(
MI.getOperand(1))
2601 MI.eraseFromParent();
2607 MI.getOperand(0).getReg())
2608 .
add(
MI.getOperand(1))
2613 MI.eraseFromParent();
2618 const bool Thumb = Opcode == ARM::tTPsoft;
2620 MachineInstrBuilder MIB;
2622 if (STI->genLongCalls()) {
2625 MachineConstantPoolValue *CPV =
2627 "__aeabi_read_tp", PCLabelID, 0);
2631 TII->get(Thumb ? ARM::tLDRpci : ARM::LDRi12),
Reg)
2645 TII->get(Thumb ? ARM::tBL : ARM::BL));
2654 if (
MI.isCandidateForAdditionalCallInfo())
2656 MI.eraseFromParent();
2659 case ARM::tLDRpci_pic:
2660 case ARM::t2LDRpci_pic: {
2661 unsigned NewLdOpc = (Opcode == ARM::tLDRpci_pic)
2662 ? ARM::tLDRpci :
ARM::t2LDRpci;
2664 bool DstIsDead =
MI.getOperand(0).isDead();
2666 .
add(
MI.getOperand(1))
2673 .
add(
MI.getOperand(2))
2675 MI.eraseFromParent();
2679 case ARM::LDRLIT_ga_abs:
2680 case ARM::LDRLIT_ga_pcrel:
2681 case ARM::LDRLIT_ga_pcrel_ldr:
2682 case ARM::tLDRLIT_ga_abs:
2683 case ARM::t2LDRLIT_ga_pcrel:
2684 case ARM::tLDRLIT_ga_pcrel: {
2686 bool DstIsDead =
MI.getOperand(0).isDead();
2687 const MachineOperand &MO1 =
MI.getOperand(1);
2689 const GlobalValue *GV = MO1.
getGlobal();
2690 bool IsARM = Opcode != ARM::tLDRLIT_ga_pcrel &&
2691 Opcode != ARM::tLDRLIT_ga_abs &&
2692 Opcode != ARM::t2LDRLIT_ga_pcrel;
2694 Opcode != ARM::LDRLIT_ga_abs && Opcode != ARM::tLDRLIT_ga_abs;
2695 unsigned LDRLITOpc = IsARM ? ARM::LDRi12 : ARM::tLDRpci;
2696 if (Opcode == ARM::t2LDRLIT_ga_pcrel)
2697 LDRLITOpc = ARM::t2LDRpci;
2698 unsigned PICAddOpc =
2700 ? (Opcode == ARM::LDRLIT_ga_pcrel_ldr ? ARM::PICLDR : ARM::PICADD)
2705 unsigned ARMPCLabelIndex = 0;
2706 MachineConstantPoolValue *CPV;
2709 unsigned PCAdj = IsARM ? 8 : 4;
2720 MachineInstrBuilder MIB =
2728 MachineInstrBuilder MIB =
2732 .
addImm(ARMPCLabelIndex);
2738 MI.eraseFromParent();
2741 case ARM::MOV_ga_pcrel:
2742 case ARM::MOV_ga_pcrel_ldr:
2743 case ARM::t2MOV_ga_pcrel: {
2747 bool DstIsDead =
MI.getOperand(0).isDead();
2748 const MachineOperand &MO1 =
MI.getOperand(1);
2749 const GlobalValue *GV = MO1.
getGlobal();
2751 bool isARM = Opcode != ARM::t2MOV_ga_pcrel;
2752 unsigned LO16Opc = isARM ? ARM::MOVi16_ga_pcrel : ARM::t2MOVi16_ga_pcrel;
2753 unsigned HI16Opc = isARM ? ARM::MOVTi16_ga_pcrel :ARM::t2MOVTi16_ga_pcrel;
2756 unsigned PICAddOpc = isARM
2757 ? (Opcode == ARM::MOV_ga_pcrel_ldr ? ARM::PICLDR : ARM::PICADD)
2771 TII->get(PICAddOpc))
2776 if (Opcode == ARM::MOV_ga_pcrel_ldr)
2780 MI.eraseFromParent();
2784 case ARM::MOVi32imm:
2785 case ARM::MOVCCi32imm:
2786 case ARM::t2MOVi32imm:
2787 case ARM::t2MOVCCi32imm:
2791 case ARM::tMOVi32imm:
2792 ExpandTMOV32BitImm(
MBB,
MBBI);
2795 case ARM::tLEApcrelJT:
2797 if (
MI.getMF()->getJumpTableInfo()->getEntryKind() ==
2802 assert(STI->isThumb() &&
"Non-inline jump tables expected only in thumb");
2803 ExpandTMOV32BitImm(
MBB,
MBBI);
2806 case ARM::SUBS_PC_LR: {
2809 .
add(
MI.getOperand(0))
2810 .
add(
MI.getOperand(1))
2811 .
add(
MI.getOperand(2))
2814 MI.eraseFromParent();
2817 case ARM::VLDMQIA: {
2818 unsigned NewOpc = ARM::VLDMDIA;
2819 MachineInstrBuilder MIB =
2824 bool DstIsDead =
MI.getOperand(
OpIdx).isDead();
2835 Register D0 =
TRI->getSubReg(DstReg, ARM::dsub_0);
2836 Register D1 =
TRI->getSubReg(DstReg, ARM::dsub_1);
2844 MI.eraseFromParent();
2848 case ARM::VSTMQIA: {
2849 unsigned NewOpc = ARM::VSTMDIA;
2850 MachineInstrBuilder MIB =
2855 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
2859 MachineOperand Dst(
MI.getOperand(
OpIdx++));
2867 Register D0 =
TRI->getSubReg(SrcReg, ARM::dsub_0);
2868 Register D1 =
TRI->getSubReg(SrcReg, ARM::dsub_1);
2877 MI.eraseFromParent();
2881 case ARM::VLD2q8Pseudo:
2882 case ARM::VLD2q16Pseudo:
2883 case ARM::VLD2q32Pseudo:
2884 case ARM::VLD2q8PseudoWB_fixed:
2885 case ARM::VLD2q16PseudoWB_fixed:
2886 case ARM::VLD2q32PseudoWB_fixed:
2887 case ARM::VLD2q8PseudoWB_register:
2888 case ARM::VLD2q16PseudoWB_register:
2889 case ARM::VLD2q32PseudoWB_register:
2890 case ARM::VLD3d8Pseudo:
2891 case ARM::VLD3d16Pseudo:
2892 case ARM::VLD3d32Pseudo:
2893 case ARM::VLD1d8TPseudo:
2894 case ARM::VLD1d8TPseudoWB_fixed:
2895 case ARM::VLD1d8TPseudoWB_register:
2896 case ARM::VLD1d16TPseudo:
2897 case ARM::VLD1d16TPseudoWB_fixed:
2898 case ARM::VLD1d16TPseudoWB_register:
2899 case ARM::VLD1d32TPseudo:
2900 case ARM::VLD1d32TPseudoWB_fixed:
2901 case ARM::VLD1d32TPseudoWB_register:
2902 case ARM::VLD1d64TPseudo:
2903 case ARM::VLD1d64TPseudoWB_fixed:
2904 case ARM::VLD1d64TPseudoWB_register:
2905 case ARM::VLD3d8Pseudo_UPD:
2906 case ARM::VLD3d16Pseudo_UPD:
2907 case ARM::VLD3d32Pseudo_UPD:
2908 case ARM::VLD3q8Pseudo_UPD:
2909 case ARM::VLD3q16Pseudo_UPD:
2910 case ARM::VLD3q32Pseudo_UPD:
2911 case ARM::VLD3q8oddPseudo:
2912 case ARM::VLD3q16oddPseudo:
2913 case ARM::VLD3q32oddPseudo:
2914 case ARM::VLD3q8oddPseudo_UPD:
2915 case ARM::VLD3q16oddPseudo_UPD:
2916 case ARM::VLD3q32oddPseudo_UPD:
2917 case ARM::VLD4d8Pseudo:
2918 case ARM::VLD4d16Pseudo:
2919 case ARM::VLD4d32Pseudo:
2920 case ARM::VLD1d8QPseudo:
2921 case ARM::VLD1d8QPseudoWB_fixed:
2922 case ARM::VLD1d8QPseudoWB_register:
2923 case ARM::VLD1d16QPseudo:
2924 case ARM::VLD1d16QPseudoWB_fixed:
2925 case ARM::VLD1d16QPseudoWB_register:
2926 case ARM::VLD1d32QPseudo:
2927 case ARM::VLD1d32QPseudoWB_fixed:
2928 case ARM::VLD1d32QPseudoWB_register:
2929 case ARM::VLD1d64QPseudo:
2930 case ARM::VLD1d64QPseudoWB_fixed:
2931 case ARM::VLD1d64QPseudoWB_register:
2932 case ARM::VLD1q8HighQPseudo:
2933 case ARM::VLD1q8HighQPseudo_UPD:
2934 case ARM::VLD1q8LowQPseudo_UPD:
2935 case ARM::VLD1q8HighTPseudo:
2936 case ARM::VLD1q8HighTPseudo_UPD:
2937 case ARM::VLD1q8LowTPseudo_UPD:
2938 case ARM::VLD1q16HighQPseudo:
2939 case ARM::VLD1q16HighQPseudo_UPD:
2940 case ARM::VLD1q16LowQPseudo_UPD:
2941 case ARM::VLD1q16HighTPseudo:
2942 case ARM::VLD1q16HighTPseudo_UPD:
2943 case ARM::VLD1q16LowTPseudo_UPD:
2944 case ARM::VLD1q32HighQPseudo:
2945 case ARM::VLD1q32HighQPseudo_UPD:
2946 case ARM::VLD1q32LowQPseudo_UPD:
2947 case ARM::VLD1q32HighTPseudo:
2948 case ARM::VLD1q32HighTPseudo_UPD:
2949 case ARM::VLD1q32LowTPseudo_UPD:
2950 case ARM::VLD1q64HighQPseudo:
2951 case ARM::VLD1q64HighQPseudo_UPD:
2952 case ARM::VLD1q64LowQPseudo_UPD:
2953 case ARM::VLD1q64HighTPseudo:
2954 case ARM::VLD1q64HighTPseudo_UPD:
2955 case ARM::VLD1q64LowTPseudo_UPD:
2956 case ARM::VLD4d8Pseudo_UPD:
2957 case ARM::VLD4d16Pseudo_UPD:
2958 case ARM::VLD4d32Pseudo_UPD:
2959 case ARM::VLD4q8Pseudo_UPD:
2960 case ARM::VLD4q16Pseudo_UPD:
2961 case ARM::VLD4q32Pseudo_UPD:
2962 case ARM::VLD4q8oddPseudo:
2963 case ARM::VLD4q16oddPseudo:
2964 case ARM::VLD4q32oddPseudo:
2965 case ARM::VLD4q8oddPseudo_UPD:
2966 case ARM::VLD4q16oddPseudo_UPD:
2967 case ARM::VLD4q32oddPseudo_UPD:
2968 case ARM::VLD3DUPd8Pseudo:
2969 case ARM::VLD3DUPd16Pseudo:
2970 case ARM::VLD3DUPd32Pseudo:
2971 case ARM::VLD3DUPd8Pseudo_UPD:
2972 case ARM::VLD3DUPd16Pseudo_UPD:
2973 case ARM::VLD3DUPd32Pseudo_UPD:
2974 case ARM::VLD4DUPd8Pseudo:
2975 case ARM::VLD4DUPd16Pseudo:
2976 case ARM::VLD4DUPd32Pseudo:
2977 case ARM::VLD4DUPd8Pseudo_UPD:
2978 case ARM::VLD4DUPd16Pseudo_UPD:
2979 case ARM::VLD4DUPd32Pseudo_UPD:
2980 case ARM::VLD2DUPq8EvenPseudo:
2981 case ARM::VLD2DUPq8OddPseudo:
2982 case ARM::VLD2DUPq16EvenPseudo:
2983 case ARM::VLD2DUPq16OddPseudo:
2984 case ARM::VLD2DUPq32EvenPseudo:
2985 case ARM::VLD2DUPq32OddPseudo:
2986 case ARM::VLD2DUPq8OddPseudoWB_fixed:
2987 case ARM::VLD2DUPq8OddPseudoWB_register:
2988 case ARM::VLD2DUPq16OddPseudoWB_fixed:
2989 case ARM::VLD2DUPq16OddPseudoWB_register:
2990 case ARM::VLD2DUPq32OddPseudoWB_fixed:
2991 case ARM::VLD2DUPq32OddPseudoWB_register:
2992 case ARM::VLD3DUPq8EvenPseudo:
2993 case ARM::VLD3DUPq8OddPseudo:
2994 case ARM::VLD3DUPq16EvenPseudo:
2995 case ARM::VLD3DUPq16OddPseudo:
2996 case ARM::VLD3DUPq32EvenPseudo:
2997 case ARM::VLD3DUPq32OddPseudo:
2998 case ARM::VLD3DUPq8OddPseudo_UPD:
2999 case ARM::VLD3DUPq16OddPseudo_UPD:
3000 case ARM::VLD3DUPq32OddPseudo_UPD:
3001 case ARM::VLD4DUPq8EvenPseudo:
3002 case ARM::VLD4DUPq8OddPseudo:
3003 case ARM::VLD4DUPq16EvenPseudo:
3004 case ARM::VLD4DUPq16OddPseudo:
3005 case ARM::VLD4DUPq32EvenPseudo:
3006 case ARM::VLD4DUPq32OddPseudo:
3007 case ARM::VLD4DUPq8OddPseudo_UPD:
3008 case ARM::VLD4DUPq16OddPseudo_UPD:
3009 case ARM::VLD4DUPq32OddPseudo_UPD:
3013 case ARM::VST2q8Pseudo:
3014 case ARM::VST2q16Pseudo:
3015 case ARM::VST2q32Pseudo:
3016 case ARM::VST2q8PseudoWB_fixed:
3017 case ARM::VST2q16PseudoWB_fixed:
3018 case ARM::VST2q32PseudoWB_fixed:
3019 case ARM::VST2q8PseudoWB_register:
3020 case ARM::VST2q16PseudoWB_register:
3021 case ARM::VST2q32PseudoWB_register:
3022 case ARM::VST3d8Pseudo:
3023 case ARM::VST3d16Pseudo:
3024 case ARM::VST3d32Pseudo:
3025 case ARM::VST1d8TPseudo:
3026 case ARM::VST1d8TPseudoWB_fixed:
3027 case ARM::VST1d8TPseudoWB_register:
3028 case ARM::VST1d16TPseudo:
3029 case ARM::VST1d16TPseudoWB_fixed:
3030 case ARM::VST1d16TPseudoWB_register:
3031 case ARM::VST1d32TPseudo:
3032 case ARM::VST1d32TPseudoWB_fixed:
3033 case ARM::VST1d32TPseudoWB_register:
3034 case ARM::VST1d64TPseudo:
3035 case ARM::VST1d64TPseudoWB_fixed:
3036 case ARM::VST1d64TPseudoWB_register:
3037 case ARM::VST3d8Pseudo_UPD:
3038 case ARM::VST3d16Pseudo_UPD:
3039 case ARM::VST3d32Pseudo_UPD:
3040 case ARM::VST3q8Pseudo_UPD:
3041 case ARM::VST3q16Pseudo_UPD:
3042 case ARM::VST3q32Pseudo_UPD:
3043 case ARM::VST3q8oddPseudo:
3044 case ARM::VST3q16oddPseudo:
3045 case ARM::VST3q32oddPseudo:
3046 case ARM::VST3q8oddPseudo_UPD:
3047 case ARM::VST3q16oddPseudo_UPD:
3048 case ARM::VST3q32oddPseudo_UPD:
3049 case ARM::VST4d8Pseudo:
3050 case ARM::VST4d16Pseudo:
3051 case ARM::VST4d32Pseudo:
3052 case ARM::VST1d8QPseudo:
3053 case ARM::VST1d8QPseudoWB_fixed:
3054 case ARM::VST1d8QPseudoWB_register:
3055 case ARM::VST1d16QPseudo:
3056 case ARM::VST1d16QPseudoWB_fixed:
3057 case ARM::VST1d16QPseudoWB_register:
3058 case ARM::VST1d32QPseudo:
3059 case ARM::VST1d32QPseudoWB_fixed:
3060 case ARM::VST1d32QPseudoWB_register:
3061 case ARM::VST1d64QPseudo:
3062 case ARM::VST1d64QPseudoWB_fixed:
3063 case ARM::VST1d64QPseudoWB_register:
3064 case ARM::VST4d8Pseudo_UPD:
3065 case ARM::VST4d16Pseudo_UPD:
3066 case ARM::VST4d32Pseudo_UPD:
3067 case ARM::VST1q8HighQPseudo:
3068 case ARM::VST1q8LowQPseudo_UPD:
3069 case ARM::VST1q8HighTPseudo:
3070 case ARM::VST1q8LowTPseudo_UPD:
3071 case ARM::VST1q16HighQPseudo:
3072 case ARM::VST1q16LowQPseudo_UPD:
3073 case ARM::VST1q16HighTPseudo:
3074 case ARM::VST1q16LowTPseudo_UPD:
3075 case ARM::VST1q32HighQPseudo:
3076 case ARM::VST1q32LowQPseudo_UPD:
3077 case ARM::VST1q32HighTPseudo:
3078 case ARM::VST1q32LowTPseudo_UPD:
3079 case ARM::VST1q64HighQPseudo:
3080 case ARM::VST1q64LowQPseudo_UPD:
3081 case ARM::VST1q64HighTPseudo:
3082 case ARM::VST1q64LowTPseudo_UPD:
3083 case ARM::VST1q8HighTPseudo_UPD:
3084 case ARM::VST1q16HighTPseudo_UPD:
3085 case ARM::VST1q32HighTPseudo_UPD:
3086 case ARM::VST1q64HighTPseudo_UPD:
3087 case ARM::VST1q8HighQPseudo_UPD:
3088 case ARM::VST1q16HighQPseudo_UPD:
3089 case ARM::VST1q32HighQPseudo_UPD:
3090 case ARM::VST1q64HighQPseudo_UPD:
3091 case ARM::VST4q8Pseudo_UPD:
3092 case ARM::VST4q16Pseudo_UPD:
3093 case ARM::VST4q32Pseudo_UPD:
3094 case ARM::VST4q8oddPseudo:
3095 case ARM::VST4q16oddPseudo:
3096 case ARM::VST4q32oddPseudo:
3097 case ARM::VST4q8oddPseudo_UPD:
3098 case ARM::VST4q16oddPseudo_UPD:
3099 case ARM::VST4q32oddPseudo_UPD:
3103 case ARM::VLD1LNq8Pseudo:
3104 case ARM::VLD1LNq16Pseudo:
3105 case ARM::VLD1LNq32Pseudo:
3106 case ARM::VLD1LNq8Pseudo_UPD:
3107 case ARM::VLD1LNq16Pseudo_UPD:
3108 case ARM::VLD1LNq32Pseudo_UPD:
3109 case ARM::VLD2LNd8Pseudo:
3110 case ARM::VLD2LNd16Pseudo:
3111 case ARM::VLD2LNd32Pseudo:
3112 case ARM::VLD2LNq16Pseudo:
3113 case ARM::VLD2LNq32Pseudo:
3114 case ARM::VLD2LNd8Pseudo_UPD:
3115 case ARM::VLD2LNd16Pseudo_UPD:
3116 case ARM::VLD2LNd32Pseudo_UPD:
3117 case ARM::VLD2LNq16Pseudo_UPD:
3118 case ARM::VLD2LNq32Pseudo_UPD:
3119 case ARM::VLD3LNd8Pseudo:
3120 case ARM::VLD3LNd16Pseudo:
3121 case ARM::VLD3LNd32Pseudo:
3122 case ARM::VLD3LNq16Pseudo:
3123 case ARM::VLD3LNq32Pseudo:
3124 case ARM::VLD3LNd8Pseudo_UPD:
3125 case ARM::VLD3LNd16Pseudo_UPD:
3126 case ARM::VLD3LNd32Pseudo_UPD:
3127 case ARM::VLD3LNq16Pseudo_UPD:
3128 case ARM::VLD3LNq32Pseudo_UPD:
3129 case ARM::VLD4LNd8Pseudo:
3130 case ARM::VLD4LNd16Pseudo:
3131 case ARM::VLD4LNd32Pseudo:
3132 case ARM::VLD4LNq16Pseudo:
3133 case ARM::VLD4LNq32Pseudo:
3134 case ARM::VLD4LNd8Pseudo_UPD:
3135 case ARM::VLD4LNd16Pseudo_UPD:
3136 case ARM::VLD4LNd32Pseudo_UPD:
3137 case ARM::VLD4LNq16Pseudo_UPD:
3138 case ARM::VLD4LNq32Pseudo_UPD:
3139 case ARM::VST1LNq8Pseudo:
3140 case ARM::VST1LNq16Pseudo:
3141 case ARM::VST1LNq32Pseudo:
3142 case ARM::VST1LNq8Pseudo_UPD:
3143 case ARM::VST1LNq16Pseudo_UPD:
3144 case ARM::VST1LNq32Pseudo_UPD:
3145 case ARM::VST2LNd8Pseudo:
3146 case ARM::VST2LNd16Pseudo:
3147 case ARM::VST2LNd32Pseudo:
3148 case ARM::VST2LNq16Pseudo:
3149 case ARM::VST2LNq32Pseudo:
3150 case ARM::VST2LNd8Pseudo_UPD:
3151 case ARM::VST2LNd16Pseudo_UPD:
3152 case ARM::VST2LNd32Pseudo_UPD:
3153 case ARM::VST2LNq16Pseudo_UPD:
3154 case ARM::VST2LNq32Pseudo_UPD:
3155 case ARM::VST3LNd8Pseudo:
3156 case ARM::VST3LNd16Pseudo:
3157 case ARM::VST3LNd32Pseudo:
3158 case ARM::VST3LNq16Pseudo:
3159 case ARM::VST3LNq32Pseudo:
3160 case ARM::VST3LNd8Pseudo_UPD:
3161 case ARM::VST3LNd16Pseudo_UPD:
3162 case ARM::VST3LNd32Pseudo_UPD:
3163 case ARM::VST3LNq16Pseudo_UPD:
3164 case ARM::VST3LNq32Pseudo_UPD:
3165 case ARM::VST4LNd8Pseudo:
3166 case ARM::VST4LNd16Pseudo:
3167 case ARM::VST4LNd32Pseudo:
3168 case ARM::VST4LNq16Pseudo:
3169 case ARM::VST4LNq32Pseudo:
3170 case ARM::VST4LNd8Pseudo_UPD:
3171 case ARM::VST4LNd16Pseudo_UPD:
3172 case ARM::VST4LNd32Pseudo_UPD:
3173 case ARM::VST4LNq16Pseudo_UPD:
3174 case ARM::VST4LNq32Pseudo_UPD:
3178 case ARM::VTBL3Pseudo: ExpandVTBL(
MBBI, ARM::VTBL3,
false);
return true;
3179 case ARM::VTBL4Pseudo: ExpandVTBL(
MBBI, ARM::VTBL4,
false);
return true;
3180 case ARM::VTBX3Pseudo: ExpandVTBL(
MBBI, ARM::VTBX3,
true);
return true;
3181 case ARM::VTBX4Pseudo: ExpandVTBL(
MBBI, ARM::VTBX4,
true);
return true;
3183 case ARM::MQQPRLoad:
3184 case ARM::MQQPRStore:
3185 case ARM::MQQQQPRLoad:
3186 case ARM::MQQQQPRStore:
3187 ExpandMQQPRLoadStore(
MBBI);
3190 case ARM::tCMP_SWAP_8:
3192 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREXB, ARM::t2STREXB, ARM::tUXTB,
3194 case ARM::tCMP_SWAP_16:
3196 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREXH, ARM::t2STREXH, ARM::tUXTH,
3198 case ARM::tCMP_SWAP_32:
3200 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREX, ARM::t2STREX, 0, NextMBBI);
3202 case ARM::CMP_SWAP_8:
3204 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREXB, ARM::STREXB, ARM::UXTB,
3206 case ARM::CMP_SWAP_16:
3208 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREXH, ARM::STREXH, ARM::UXTH,
3210 case ARM::CMP_SWAP_32:
3212 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREX, ARM::STREX, 0, NextMBBI);
3214 case ARM::CMP_SWAP_64:
3215 return ExpandCMP_SWAP_64(
MBB,
MBBI, NextMBBI);
3217 case ARM::tBL_PUSHLR:
3218 case ARM::BL_PUSHLR: {
3219 const bool Thumb = Opcode == ARM::tBL_PUSHLR;
3221 assert(
Reg == ARM::LR &&
"expect LR register!");
3222 MachineInstrBuilder MIB;
3245 MI.eraseFromParent();
3248 case ARM::t2CALL_BTI: {
3249 MachineFunction &MF = *
MI.getMF();
3250 MachineInstrBuilder MIB =
3253 for (
unsigned i = 0; i <
MI.getNumOperands(); ++i)
3254 MIB.
add(
MI.getOperand(i));
3255 if (
MI.isCandidateForAdditionalCallInfo())
3257 MIBundleBuilder Bundler(
MBB,
MI);
3258 Bundler.append(MIB);
3259 Bundler.append(
BuildMI(MF,
MI.getDebugLoc(),
TII->get(ARM::t2BTI)));
3261 MI.eraseFromParent();
3265 case ARM::STOREDUAL: {
3266 Register PairReg =
MI.getOperand(0).getReg();
3268 MachineInstrBuilder MIB =
3270 TII->get(Opcode == ARM::LOADDUAL ? ARM::LDRD : ARM::STRD))
3271 .
addReg(
TRI->getSubReg(PairReg, ARM::gsub_0),
3273 .
addReg(
TRI->getSubReg(PairReg, ARM::gsub_1),
3279 MI.eraseFromParent();
3285bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &
MBB) {
3298bool ARMExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
3302 AFI = MF.
getInfo<ARMFunctionInfo>();
3304 LLVM_DEBUG(
dbgs() <<
"********** ARM EXPAND PSEUDO INSTRUCTIONS **********\n"
3305 <<
"********** Function: " << MF.
getName() <<
'\n');
3308 for (MachineBasicBlock &
MBB : MF)
3311 MF.verify(
this,
"After expanding ARM pseudo instructions.");
3313 LLVM_DEBUG(
dbgs() <<
"***************************************************\n");
3320 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")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_ATTRIBUTE_UNUSED
const HexagonInstrInfo * TII
This file implements the LivePhysRegs utility for tracking liveness of physical registers.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
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...
bool isThumb2Function() const
unsigned createPICLabelUId()
bool isThumb1OnlyFunction() const
bool isThumbFunction() const
bool shouldSignReturnAddress() const
unsigned getFramePtrSpillOffset() const
bool isTargetMachO() const
const ARMBaseInstrInfo * getInstrInfo() const override
bool isThumb1Only() const
bool isTargetWindows() const
const ARMBaseRegisterInfo * getRegisterInfo() const override
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.
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.
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 '...
MachineInstrBundleIterator< MachineInstr > iterator
unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
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...
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)
CreateMachineInstr - Allocate a new MachineInstr.
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.
Wrapper class representing virtual and physical registers.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
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
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ 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.
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.
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...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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)
DWARFExpression::Operation Op
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)
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.