35#define DEBUG_TYPE "arm-pseudo"
39 cl::desc(
"Verify machine code after expanding ARM pseudos"));
41#define ARM_EXPAND_PSEUDO_NAME "ARM pseudo instruction expansion pass"
78 unsigned Opc,
bool IsExt);
118 unsigned StrexOp,
unsigned UxtOp,
125 char ARMExpandPseudo::ID = 0;
136 enum NEONRegSpacing {
147 struct NEONLdStTableEntry {
152 bool hasWritebackOperand;
161 bool copyAllListRegs;
164 bool operator<(
const NEONLdStTableEntry &TE)
const {
165 return PseudoOpc < TE.PseudoOpc;
167 friend bool operator<(
const NEONLdStTableEntry &TE,
unsigned PseudoOpc) {
168 return TE.PseudoOpc < PseudoOpc;
170 [[maybe_unused]]
friend bool operator<(
unsigned PseudoOpc,
171 const NEONLdStTableEntry &TE) {
172 return PseudoOpc < TE.PseudoOpc;
178{ ARM::VLD1LNq16Pseudo, ARM::VLD1LNd16,
true,
false,
false, EvenDblSpc, 1, 4 ,
true},
179{ ARM::VLD1LNq16Pseudo_UPD, ARM::VLD1LNd16_UPD,
true,
true,
true, EvenDblSpc, 1, 4 ,
true},
180{ ARM::VLD1LNq32Pseudo, ARM::VLD1LNd32,
true,
false,
false, EvenDblSpc, 1, 2 ,
true},
181{ ARM::VLD1LNq32Pseudo_UPD, ARM::VLD1LNd32_UPD,
true,
true,
true, EvenDblSpc, 1, 2 ,
true},
182{ ARM::VLD1LNq8Pseudo, ARM::VLD1LNd8,
true,
false,
false, EvenDblSpc, 1, 8 ,
true},
183{ ARM::VLD1LNq8Pseudo_UPD, ARM::VLD1LNd8_UPD,
true,
true,
true, EvenDblSpc, 1, 8 ,
true},
185{ ARM::VLD1d16QPseudo, ARM::VLD1d16Q,
true,
false,
false, SingleSpc, 4, 4 ,
false},
186{ ARM::VLD1d16QPseudoWB_fixed, ARM::VLD1d16Qwb_fixed,
true,
true,
false, SingleSpc, 4, 4 ,
false},
187{ ARM::VLD1d16QPseudoWB_register, ARM::VLD1d16Qwb_register,
true,
true,
true, SingleSpc, 4, 4 ,
false},
188{ ARM::VLD1d16TPseudo, ARM::VLD1d16T,
true,
false,
false, SingleSpc, 3, 4 ,
false},
189{ ARM::VLD1d16TPseudoWB_fixed, ARM::VLD1d16Twb_fixed,
true,
true,
false, SingleSpc, 3, 4 ,
false},
190{ ARM::VLD1d16TPseudoWB_register, ARM::VLD1d16Twb_register,
true,
true,
true, SingleSpc, 3, 4 ,
false},
192{ ARM::VLD1d32QPseudo, ARM::VLD1d32Q,
true,
false,
false, SingleSpc, 4, 2 ,
false},
193{ ARM::VLD1d32QPseudoWB_fixed, ARM::VLD1d32Qwb_fixed,
true,
true,
false, SingleSpc, 4, 2 ,
false},
194{ ARM::VLD1d32QPseudoWB_register, ARM::VLD1d32Qwb_register,
true,
true,
true, SingleSpc, 4, 2 ,
false},
195{ ARM::VLD1d32TPseudo, ARM::VLD1d32T,
true,
false,
false, SingleSpc, 3, 2 ,
false},
196{ ARM::VLD1d32TPseudoWB_fixed, ARM::VLD1d32Twb_fixed,
true,
true,
false, SingleSpc, 3, 2 ,
false},
197{ ARM::VLD1d32TPseudoWB_register, ARM::VLD1d32Twb_register,
true,
true,
true, SingleSpc, 3, 2 ,
false},
199{ ARM::VLD1d64QPseudo, ARM::VLD1d64Q,
true,
false,
false, SingleSpc, 4, 1 ,
false},
200{ ARM::VLD1d64QPseudoWB_fixed, ARM::VLD1d64Qwb_fixed,
true,
true,
false, SingleSpc, 4, 1 ,
false},
201{ ARM::VLD1d64QPseudoWB_register, ARM::VLD1d64Qwb_register,
true,
true,
true, SingleSpc, 4, 1 ,
false},
202{ ARM::VLD1d64TPseudo, ARM::VLD1d64T,
true,
false,
false, SingleSpc, 3, 1 ,
false},
203{ ARM::VLD1d64TPseudoWB_fixed, ARM::VLD1d64Twb_fixed,
true,
true,
false, SingleSpc, 3, 1 ,
false},
204{ ARM::VLD1d64TPseudoWB_register, ARM::VLD1d64Twb_register,
true,
true,
true, SingleSpc, 3, 1 ,
false},
206{ ARM::VLD1d8QPseudo, ARM::VLD1d8Q,
true,
false,
false, SingleSpc, 4, 8 ,
false},
207{ ARM::VLD1d8QPseudoWB_fixed, ARM::VLD1d8Qwb_fixed,
true,
true,
false, SingleSpc, 4, 8 ,
false},
208{ ARM::VLD1d8QPseudoWB_register, ARM::VLD1d8Qwb_register,
true,
true,
true, SingleSpc, 4, 8 ,
false},
209{ ARM::VLD1d8TPseudo, ARM::VLD1d8T,
true,
false,
false, SingleSpc, 3, 8 ,
false},
210{ ARM::VLD1d8TPseudoWB_fixed, ARM::VLD1d8Twb_fixed,
true,
true,
false, SingleSpc, 3, 8 ,
false},
211{ ARM::VLD1d8TPseudoWB_register, ARM::VLD1d8Twb_register,
true,
true,
true, SingleSpc, 3, 8 ,
false},
213{ ARM::VLD1q16HighQPseudo, ARM::VLD1d16Q,
true,
false,
false, SingleHighQSpc, 4, 4 ,
false},
214{ ARM::VLD1q16HighQPseudo_UPD, ARM::VLD1d16Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 4 ,
false},
215{ ARM::VLD1q16HighTPseudo, ARM::VLD1d16T,
true,
false,
false, SingleHighTSpc, 3, 4 ,
false},
216{ ARM::VLD1q16HighTPseudo_UPD, ARM::VLD1d16Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 4 ,
false},
217{ ARM::VLD1q16LowQPseudo_UPD, ARM::VLD1d16Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 4 ,
false},
218{ ARM::VLD1q16LowTPseudo_UPD, ARM::VLD1d16Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 4 ,
false},
220{ ARM::VLD1q32HighQPseudo, ARM::VLD1d32Q,
true,
false,
false, SingleHighQSpc, 4, 2 ,
false},
221{ ARM::VLD1q32HighQPseudo_UPD, ARM::VLD1d32Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 2 ,
false},
222{ ARM::VLD1q32HighTPseudo, ARM::VLD1d32T,
true,
false,
false, SingleHighTSpc, 3, 2 ,
false},
223{ ARM::VLD1q32HighTPseudo_UPD, ARM::VLD1d32Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 2 ,
false},
224{ ARM::VLD1q32LowQPseudo_UPD, ARM::VLD1d32Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 2 ,
false},
225{ ARM::VLD1q32LowTPseudo_UPD, ARM::VLD1d32Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 2 ,
false},
227{ ARM::VLD1q64HighQPseudo, ARM::VLD1d64Q,
true,
false,
false, SingleHighQSpc, 4, 1 ,
false},
228{ ARM::VLD1q64HighQPseudo_UPD, ARM::VLD1d64Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 1 ,
false},
229{ ARM::VLD1q64HighTPseudo, ARM::VLD1d64T,
true,
false,
false, SingleHighTSpc, 3, 1 ,
false},
230{ ARM::VLD1q64HighTPseudo_UPD, ARM::VLD1d64Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 1 ,
false},
231{ ARM::VLD1q64LowQPseudo_UPD, ARM::VLD1d64Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 1 ,
false},
232{ ARM::VLD1q64LowTPseudo_UPD, ARM::VLD1d64Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 1 ,
false},
234{ ARM::VLD1q8HighQPseudo, ARM::VLD1d8Q,
true,
false,
false, SingleHighQSpc, 4, 8 ,
false},
235{ ARM::VLD1q8HighQPseudo_UPD, ARM::VLD1d8Qwb_fixed,
true,
true,
true, SingleHighQSpc, 4, 8 ,
false},
236{ ARM::VLD1q8HighTPseudo, ARM::VLD1d8T,
true,
false,
false, SingleHighTSpc, 3, 8 ,
false},
237{ ARM::VLD1q8HighTPseudo_UPD, ARM::VLD1d8Twb_fixed,
true,
true,
true, SingleHighTSpc, 3, 8 ,
false},
238{ ARM::VLD1q8LowQPseudo_UPD, ARM::VLD1d8Qwb_fixed,
true,
true,
true, SingleLowSpc, 4, 8 ,
false},
239{ ARM::VLD1q8LowTPseudo_UPD, ARM::VLD1d8Twb_fixed,
true,
true,
true, SingleLowSpc, 3, 8 ,
false},
241{ ARM::VLD2DUPq16EvenPseudo, ARM::VLD2DUPd16x2,
true,
false,
false, EvenDblSpc, 2, 4 ,
false},
242{ ARM::VLD2DUPq16OddPseudo, ARM::VLD2DUPd16x2,
true,
false,
false, OddDblSpc, 2, 4 ,
false},
243{ ARM::VLD2DUPq16OddPseudoWB_fixed, ARM::VLD2DUPd16x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 4 ,
false},
244{ ARM::VLD2DUPq16OddPseudoWB_register, ARM::VLD2DUPd16x2wb_register,
true,
true,
true, OddDblSpc, 2, 4 ,
false},
245{ ARM::VLD2DUPq32EvenPseudo, ARM::VLD2DUPd32x2,
true,
false,
false, EvenDblSpc, 2, 2 ,
false},
246{ ARM::VLD2DUPq32OddPseudo, ARM::VLD2DUPd32x2,
true,
false,
false, OddDblSpc, 2, 2 ,
false},
247{ ARM::VLD2DUPq32OddPseudoWB_fixed, ARM::VLD2DUPd32x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 2 ,
false},
248{ ARM::VLD2DUPq32OddPseudoWB_register, ARM::VLD2DUPd32x2wb_register,
true,
true,
true, OddDblSpc, 2, 2 ,
false},
249{ ARM::VLD2DUPq8EvenPseudo, ARM::VLD2DUPd8x2,
true,
false,
false, EvenDblSpc, 2, 8 ,
false},
250{ ARM::VLD2DUPq8OddPseudo, ARM::VLD2DUPd8x2,
true,
false,
false, OddDblSpc, 2, 8 ,
false},
251{ ARM::VLD2DUPq8OddPseudoWB_fixed, ARM::VLD2DUPd8x2wb_fixed,
true,
true,
false, OddDblSpc, 2, 8 ,
false},
252{ ARM::VLD2DUPq8OddPseudoWB_register, ARM::VLD2DUPd8x2wb_register,
true,
true,
true, OddDblSpc, 2, 8 ,
false},
254{ ARM::VLD2LNd16Pseudo, ARM::VLD2LNd16,
true,
false,
false, SingleSpc, 2, 4 ,
true},
255{ ARM::VLD2LNd16Pseudo_UPD, ARM::VLD2LNd16_UPD,
true,
true,
true, SingleSpc, 2, 4 ,
true},
256{ ARM::VLD2LNd32Pseudo, ARM::VLD2LNd32,
true,
false,
false, SingleSpc, 2, 2 ,
true},
257{ ARM::VLD2LNd32Pseudo_UPD, ARM::VLD2LNd32_UPD,
true,
true,
true, SingleSpc, 2, 2 ,
true},
258{ ARM::VLD2LNd8Pseudo, ARM::VLD2LNd8,
true,
false,
false, SingleSpc, 2, 8 ,
true},
259{ ARM::VLD2LNd8Pseudo_UPD, ARM::VLD2LNd8_UPD,
true,
true,
true, SingleSpc, 2, 8 ,
true},
260{ ARM::VLD2LNq16Pseudo, ARM::VLD2LNq16,
true,
false,
false, EvenDblSpc, 2, 4 ,
true},
261{ ARM::VLD2LNq16Pseudo_UPD, ARM::VLD2LNq16_UPD,
true,
true,
true, EvenDblSpc, 2, 4 ,
true},
262{ ARM::VLD2LNq32Pseudo, ARM::VLD2LNq32,
true,
false,
false, EvenDblSpc, 2, 2 ,
true},
263{ ARM::VLD2LNq32Pseudo_UPD, ARM::VLD2LNq32_UPD,
true,
true,
true, EvenDblSpc, 2, 2 ,
true},
265{ ARM::VLD2q16Pseudo, ARM::VLD2q16,
true,
false,
false, SingleSpc, 4, 4 ,
false},
266{ ARM::VLD2q16PseudoWB_fixed, ARM::VLD2q16wb_fixed,
true,
true,
false, SingleSpc, 4, 4 ,
false},
267{ ARM::VLD2q16PseudoWB_register, ARM::VLD2q16wb_register,
true,
true,
true, SingleSpc, 4, 4 ,
false},
268{ ARM::VLD2q32Pseudo, ARM::VLD2q32,
true,
false,
false, SingleSpc, 4, 2 ,
false},
269{ ARM::VLD2q32PseudoWB_fixed, ARM::VLD2q32wb_fixed,
true,
true,
false, SingleSpc, 4, 2 ,
false},
270{ ARM::VLD2q32PseudoWB_register, ARM::VLD2q32wb_register,
true,
true,
true, SingleSpc, 4, 2 ,
false},
271{ ARM::VLD2q8Pseudo, ARM::VLD2q8,
true,
false,
false, SingleSpc, 4, 8 ,
false},
272{ ARM::VLD2q8PseudoWB_fixed, ARM::VLD2q8wb_fixed,
true,
true,
false, SingleSpc, 4, 8 ,
false},
273{ ARM::VLD2q8PseudoWB_register, ARM::VLD2q8wb_register,
true,
true,
true, SingleSpc, 4, 8 ,
false},
275{ ARM::VLD3DUPd16Pseudo, ARM::VLD3DUPd16,
true,
false,
false, SingleSpc, 3, 4,
true},
276{ ARM::VLD3DUPd16Pseudo_UPD, ARM::VLD3DUPd16_UPD,
true,
true,
true, SingleSpc, 3, 4,
true},
277{ ARM::VLD3DUPd32Pseudo, ARM::VLD3DUPd32,
true,
false,
false, SingleSpc, 3, 2,
true},
278{ ARM::VLD3DUPd32Pseudo_UPD, ARM::VLD3DUPd32_UPD,
true,
true,
true, SingleSpc, 3, 2,
true},
279{ ARM::VLD3DUPd8Pseudo, ARM::VLD3DUPd8,
true,
false,
false, SingleSpc, 3, 8,
true},
280{ ARM::VLD3DUPd8Pseudo_UPD, ARM::VLD3DUPd8_UPD,
true,
true,
true, SingleSpc, 3, 8,
true},
281{ ARM::VLD3DUPq16EvenPseudo, ARM::VLD3DUPq16,
true,
false,
false, EvenDblSpc, 3, 4 ,
true},
282{ ARM::VLD3DUPq16OddPseudo, ARM::VLD3DUPq16,
true,
false,
false, OddDblSpc, 3, 4 ,
true},
283{ ARM::VLD3DUPq16OddPseudo_UPD, ARM::VLD3DUPq16_UPD,
true,
true,
true, OddDblSpc, 3, 4 ,
true},
284{ ARM::VLD3DUPq32EvenPseudo, ARM::VLD3DUPq32,
true,
false,
false, EvenDblSpc, 3, 2 ,
true},
285{ ARM::VLD3DUPq32OddPseudo, ARM::VLD3DUPq32,
true,
false,
false, OddDblSpc, 3, 2 ,
true},
286{ ARM::VLD3DUPq32OddPseudo_UPD, ARM::VLD3DUPq32_UPD,
true,
true,
true, OddDblSpc, 3, 2 ,
true},
287{ ARM::VLD3DUPq8EvenPseudo, ARM::VLD3DUPq8,
true,
false,
false, EvenDblSpc, 3, 8 ,
true},
288{ ARM::VLD3DUPq8OddPseudo, ARM::VLD3DUPq8,
true,
false,
false, OddDblSpc, 3, 8 ,
true},
289{ ARM::VLD3DUPq8OddPseudo_UPD, ARM::VLD3DUPq8_UPD,
true,
true,
true, OddDblSpc, 3, 8 ,
true},
291{ ARM::VLD3LNd16Pseudo, ARM::VLD3LNd16,
true,
false,
false, SingleSpc, 3, 4 ,
true},
292{ ARM::VLD3LNd16Pseudo_UPD, ARM::VLD3LNd16_UPD,
true,
true,
true, SingleSpc, 3, 4 ,
true},
293{ ARM::VLD3LNd32Pseudo, ARM::VLD3LNd32,
true,
false,
false, SingleSpc, 3, 2 ,
true},
294{ ARM::VLD3LNd32Pseudo_UPD, ARM::VLD3LNd32_UPD,
true,
true,
true, SingleSpc, 3, 2 ,
true},
295{ ARM::VLD3LNd8Pseudo, ARM::VLD3LNd8,
true,
false,
false, SingleSpc, 3, 8 ,
true},
296{ ARM::VLD3LNd8Pseudo_UPD, ARM::VLD3LNd8_UPD,
true,
true,
true, SingleSpc, 3, 8 ,
true},
297{ ARM::VLD3LNq16Pseudo, ARM::VLD3LNq16,
true,
false,
false, EvenDblSpc, 3, 4 ,
true},
298{ ARM::VLD3LNq16Pseudo_UPD, ARM::VLD3LNq16_UPD,
true,
true,
true, EvenDblSpc, 3, 4 ,
true},
299{ ARM::VLD3LNq32Pseudo, ARM::VLD3LNq32,
true,
false,
false, EvenDblSpc, 3, 2 ,
true},
300{ ARM::VLD3LNq32Pseudo_UPD, ARM::VLD3LNq32_UPD,
true,
true,
true, EvenDblSpc, 3, 2 ,
true},
302{ ARM::VLD3d16Pseudo, ARM::VLD3d16,
true,
false,
false, SingleSpc, 3, 4 ,
true},
303{ ARM::VLD3d16Pseudo_UPD, ARM::VLD3d16_UPD,
true,
true,
true, SingleSpc, 3, 4 ,
true},
304{ ARM::VLD3d32Pseudo, ARM::VLD3d32,
true,
false,
false, SingleSpc, 3, 2 ,
true},
305{ ARM::VLD3d32Pseudo_UPD, ARM::VLD3d32_UPD,
true,
true,
true, SingleSpc, 3, 2 ,
true},
306{ ARM::VLD3d8Pseudo, ARM::VLD3d8,
true,
false,
false, SingleSpc, 3, 8 ,
true},
307{ ARM::VLD3d8Pseudo_UPD, ARM::VLD3d8_UPD,
true,
true,
true, SingleSpc, 3, 8 ,
true},
309{ ARM::VLD3q16Pseudo_UPD, ARM::VLD3q16_UPD,
true,
true,
true, EvenDblSpc, 3, 4 ,
true},
310{ ARM::VLD3q16oddPseudo, ARM::VLD3q16,
true,
false,
false, OddDblSpc, 3, 4 ,
true},
311{ ARM::VLD3q16oddPseudo_UPD, ARM::VLD3q16_UPD,
true,
true,
true, OddDblSpc, 3, 4 ,
true},
312{ ARM::VLD3q32Pseudo_UPD, ARM::VLD3q32_UPD,
true,
true,
true, EvenDblSpc, 3, 2 ,
true},
313{ ARM::VLD3q32oddPseudo, ARM::VLD3q32,
true,
false,
false, OddDblSpc, 3, 2 ,
true},
314{ ARM::VLD3q32oddPseudo_UPD, ARM::VLD3q32_UPD,
true,
true,
true, OddDblSpc, 3, 2 ,
true},
315{ ARM::VLD3q8Pseudo_UPD, ARM::VLD3q8_UPD,
true,
true,
true, EvenDblSpc, 3, 8 ,
true},
316{ ARM::VLD3q8oddPseudo, ARM::VLD3q8,
true,
false,
false, OddDblSpc, 3, 8 ,
true},
317{ ARM::VLD3q8oddPseudo_UPD, ARM::VLD3q8_UPD,
true,
true,
true, OddDblSpc, 3, 8 ,
true},
319{ ARM::VLD4DUPd16Pseudo, ARM::VLD4DUPd16,
true,
false,
false, SingleSpc, 4, 4,
true},
320{ ARM::VLD4DUPd16Pseudo_UPD, ARM::VLD4DUPd16_UPD,
true,
true,
true, SingleSpc, 4, 4,
true},
321{ ARM::VLD4DUPd32Pseudo, ARM::VLD4DUPd32,
true,
false,
false, SingleSpc, 4, 2,
true},
322{ ARM::VLD4DUPd32Pseudo_UPD, ARM::VLD4DUPd32_UPD,
true,
true,
true, SingleSpc, 4, 2,
true},
323{ ARM::VLD4DUPd8Pseudo, ARM::VLD4DUPd8,
true,
false,
false, SingleSpc, 4, 8,
true},
324{ ARM::VLD4DUPd8Pseudo_UPD, ARM::VLD4DUPd8_UPD,
true,
true,
true, SingleSpc, 4, 8,
true},
325{ ARM::VLD4DUPq16EvenPseudo, ARM::VLD4DUPq16,
true,
false,
false, EvenDblSpc, 4, 4 ,
true},
326{ ARM::VLD4DUPq16OddPseudo, ARM::VLD4DUPq16,
true,
false,
false, OddDblSpc, 4, 4 ,
true},
327{ ARM::VLD4DUPq16OddPseudo_UPD, ARM::VLD4DUPq16_UPD,
true,
true,
true, OddDblSpc, 4, 4 ,
true},
328{ ARM::VLD4DUPq32EvenPseudo, ARM::VLD4DUPq32,
true,
false,
false, EvenDblSpc, 4, 2 ,
true},
329{ ARM::VLD4DUPq32OddPseudo, ARM::VLD4DUPq32,
true,
false,
false, OddDblSpc, 4, 2 ,
true},
330{ ARM::VLD4DUPq32OddPseudo_UPD, ARM::VLD4DUPq32_UPD,
true,
true,
true, OddDblSpc, 4, 2 ,
true},
331{ ARM::VLD4DUPq8EvenPseudo, ARM::VLD4DUPq8,
true,
false,
false, EvenDblSpc, 4, 8 ,
true},
332{ ARM::VLD4DUPq8OddPseudo, ARM::VLD4DUPq8,
true,
false,
false, OddDblSpc, 4, 8 ,
true},
333{ ARM::VLD4DUPq8OddPseudo_UPD, ARM::VLD4DUPq8_UPD,
true,
true,
true, OddDblSpc, 4, 8 ,
true},
335{ ARM::VLD4LNd16Pseudo, ARM::VLD4LNd16,
true,
false,
false, SingleSpc, 4, 4 ,
true},
336{ ARM::VLD4LNd16Pseudo_UPD, ARM::VLD4LNd16_UPD,
true,
true,
true, SingleSpc, 4, 4 ,
true},
337{ ARM::VLD4LNd32Pseudo, ARM::VLD4LNd32,
true,
false,
false, SingleSpc, 4, 2 ,
true},
338{ ARM::VLD4LNd32Pseudo_UPD, ARM::VLD4LNd32_UPD,
true,
true,
true, SingleSpc, 4, 2 ,
true},
339{ ARM::VLD4LNd8Pseudo, ARM::VLD4LNd8,
true,
false,
false, SingleSpc, 4, 8 ,
true},
340{ ARM::VLD4LNd8Pseudo_UPD, ARM::VLD4LNd8_UPD,
true,
true,
true, SingleSpc, 4, 8 ,
true},
341{ ARM::VLD4LNq16Pseudo, ARM::VLD4LNq16,
true,
false,
false, EvenDblSpc, 4, 4 ,
true},
342{ ARM::VLD4LNq16Pseudo_UPD, ARM::VLD4LNq16_UPD,
true,
true,
true, EvenDblSpc, 4, 4 ,
true},
343{ ARM::VLD4LNq32Pseudo, ARM::VLD4LNq32,
true,
false,
false, EvenDblSpc, 4, 2 ,
true},
344{ ARM::VLD4LNq32Pseudo_UPD, ARM::VLD4LNq32_UPD,
true,
true,
true, EvenDblSpc, 4, 2 ,
true},
346{ ARM::VLD4d16Pseudo, ARM::VLD4d16,
true,
false,
false, SingleSpc, 4, 4 ,
true},
347{ ARM::VLD4d16Pseudo_UPD, ARM::VLD4d16_UPD,
true,
true,
true, SingleSpc, 4, 4 ,
true},
348{ ARM::VLD4d32Pseudo, ARM::VLD4d32,
true,
false,
false, SingleSpc, 4, 2 ,
true},
349{ ARM::VLD4d32Pseudo_UPD, ARM::VLD4d32_UPD,
true,
true,
true, SingleSpc, 4, 2 ,
true},
350{ ARM::VLD4d8Pseudo, ARM::VLD4d8,
true,
false,
false, SingleSpc, 4, 8 ,
true},
351{ ARM::VLD4d8Pseudo_UPD, ARM::VLD4d8_UPD,
true,
true,
true, SingleSpc, 4, 8 ,
true},
353{ ARM::VLD4q16Pseudo_UPD, ARM::VLD4q16_UPD,
true,
true,
true, EvenDblSpc, 4, 4 ,
true},
354{ ARM::VLD4q16oddPseudo, ARM::VLD4q16,
true,
false,
false, OddDblSpc, 4, 4 ,
true},
355{ ARM::VLD4q16oddPseudo_UPD, ARM::VLD4q16_UPD,
true,
true,
true, OddDblSpc, 4, 4 ,
true},
356{ ARM::VLD4q32Pseudo_UPD, ARM::VLD4q32_UPD,
true,
true,
true, EvenDblSpc, 4, 2 ,
true},
357{ ARM::VLD4q32oddPseudo, ARM::VLD4q32,
true,
false,
false, OddDblSpc, 4, 2 ,
true},
358{ ARM::VLD4q32oddPseudo_UPD, ARM::VLD4q32_UPD,
true,
true,
true, OddDblSpc, 4, 2 ,
true},
359{ ARM::VLD4q8Pseudo_UPD, ARM::VLD4q8_UPD,
true,
true,
true, EvenDblSpc, 4, 8 ,
true},
360{ ARM::VLD4q8oddPseudo, ARM::VLD4q8,
true,
false,
false, OddDblSpc, 4, 8 ,
true},
361{ ARM::VLD4q8oddPseudo_UPD, ARM::VLD4q8_UPD,
true,
true,
true, OddDblSpc, 4, 8 ,
true},
363{ ARM::VST1LNq16Pseudo, ARM::VST1LNd16,
false,
false,
false, EvenDblSpc, 1, 4 ,
true},
364{ ARM::VST1LNq16Pseudo_UPD, ARM::VST1LNd16_UPD,
false,
true,
true, EvenDblSpc, 1, 4 ,
true},
365{ ARM::VST1LNq32Pseudo, ARM::VST1LNd32,
false,
false,
false, EvenDblSpc, 1, 2 ,
true},
366{ ARM::VST1LNq32Pseudo_UPD, ARM::VST1LNd32_UPD,
false,
true,
true, EvenDblSpc, 1, 2 ,
true},
367{ ARM::VST1LNq8Pseudo, ARM::VST1LNd8,
false,
false,
false, EvenDblSpc, 1, 8 ,
true},
368{ ARM::VST1LNq8Pseudo_UPD, ARM::VST1LNd8_UPD,
false,
true,
true, EvenDblSpc, 1, 8 ,
true},
370{ ARM::VST1d16QPseudo, ARM::VST1d16Q,
false,
false,
false, SingleSpc, 4, 4 ,
false},
371{ ARM::VST1d16QPseudoWB_fixed, ARM::VST1d16Qwb_fixed,
false,
true,
false, SingleSpc, 4, 4 ,
false},
372{ ARM::VST1d16QPseudoWB_register, ARM::VST1d16Qwb_register,
false,
true,
true, SingleSpc, 4, 4 ,
false},
373{ ARM::VST1d16TPseudo, ARM::VST1d16T,
false,
false,
false, SingleSpc, 3, 4 ,
false},
374{ ARM::VST1d16TPseudoWB_fixed, ARM::VST1d16Twb_fixed,
false,
true,
false, SingleSpc, 3, 4 ,
false},
375{ ARM::VST1d16TPseudoWB_register, ARM::VST1d16Twb_register,
false,
true,
true, SingleSpc, 3, 4 ,
false},
377{ ARM::VST1d32QPseudo, ARM::VST1d32Q,
false,
false,
false, SingleSpc, 4, 2 ,
false},
378{ ARM::VST1d32QPseudoWB_fixed, ARM::VST1d32Qwb_fixed,
false,
true,
false, SingleSpc, 4, 2 ,
false},
379{ ARM::VST1d32QPseudoWB_register, ARM::VST1d32Qwb_register,
false,
true,
true, SingleSpc, 4, 2 ,
false},
380{ ARM::VST1d32TPseudo, ARM::VST1d32T,
false,
false,
false, SingleSpc, 3, 2 ,
false},
381{ ARM::VST1d32TPseudoWB_fixed, ARM::VST1d32Twb_fixed,
false,
true,
false, SingleSpc, 3, 2 ,
false},
382{ ARM::VST1d32TPseudoWB_register, ARM::VST1d32Twb_register,
false,
true,
true, SingleSpc, 3, 2 ,
false},
384{ ARM::VST1d64QPseudo, ARM::VST1d64Q,
false,
false,
false, SingleSpc, 4, 1 ,
false},
385{ ARM::VST1d64QPseudoWB_fixed, ARM::VST1d64Qwb_fixed,
false,
true,
false, SingleSpc, 4, 1 ,
false},
386{ ARM::VST1d64QPseudoWB_register, ARM::VST1d64Qwb_register,
false,
true,
true, SingleSpc, 4, 1 ,
false},
387{ ARM::VST1d64TPseudo, ARM::VST1d64T,
false,
false,
false, SingleSpc, 3, 1 ,
false},
388{ ARM::VST1d64TPseudoWB_fixed, ARM::VST1d64Twb_fixed,
false,
true,
false, SingleSpc, 3, 1 ,
false},
389{ ARM::VST1d64TPseudoWB_register, ARM::VST1d64Twb_register,
false,
true,
true, SingleSpc, 3, 1 ,
false},
391{ ARM::VST1d8QPseudo, ARM::VST1d8Q,
false,
false,
false, SingleSpc, 4, 8 ,
false},
392{ ARM::VST1d8QPseudoWB_fixed, ARM::VST1d8Qwb_fixed,
false,
true,
false, SingleSpc, 4, 8 ,
false},
393{ ARM::VST1d8QPseudoWB_register, ARM::VST1d8Qwb_register,
false,
true,
true, SingleSpc, 4, 8 ,
false},
394{ ARM::VST1d8TPseudo, ARM::VST1d8T,
false,
false,
false, SingleSpc, 3, 8 ,
false},
395{ ARM::VST1d8TPseudoWB_fixed, ARM::VST1d8Twb_fixed,
false,
true,
false, SingleSpc, 3, 8 ,
false},
396{ ARM::VST1d8TPseudoWB_register, ARM::VST1d8Twb_register,
false,
true,
true, SingleSpc, 3, 8 ,
false},
398{ ARM::VST1q16HighQPseudo, ARM::VST1d16Q,
false,
false,
false, SingleHighQSpc, 4, 4 ,
false},
399{ ARM::VST1q16HighQPseudo_UPD, ARM::VST1d16Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
400{ ARM::VST1q16HighTPseudo, ARM::VST1d16T,
false,
false,
false, SingleHighTSpc, 3, 4 ,
false},
401{ ARM::VST1q16HighTPseudo_UPD, ARM::VST1d16Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 4 ,
false},
402{ ARM::VST1q16LowQPseudo_UPD, ARM::VST1d16Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 4 ,
false},
403{ ARM::VST1q16LowTPseudo_UPD, ARM::VST1d16Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 4 ,
false},
405{ ARM::VST1q32HighQPseudo, ARM::VST1d32Q,
false,
false,
false, SingleHighQSpc, 4, 2 ,
false},
406{ ARM::VST1q32HighQPseudo_UPD, ARM::VST1d32Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
407{ ARM::VST1q32HighTPseudo, ARM::VST1d32T,
false,
false,
false, SingleHighTSpc, 3, 2 ,
false},
408{ ARM::VST1q32HighTPseudo_UPD, ARM::VST1d32Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 2 ,
false},
409{ ARM::VST1q32LowQPseudo_UPD, ARM::VST1d32Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 2 ,
false},
410{ ARM::VST1q32LowTPseudo_UPD, ARM::VST1d32Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 2 ,
false},
412{ ARM::VST1q64HighQPseudo, ARM::VST1d64Q,
false,
false,
false, SingleHighQSpc, 4, 1 ,
false},
413{ ARM::VST1q64HighQPseudo_UPD, ARM::VST1d64Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
414{ ARM::VST1q64HighTPseudo, ARM::VST1d64T,
false,
false,
false, SingleHighTSpc, 3, 1 ,
false},
415{ ARM::VST1q64HighTPseudo_UPD, ARM::VST1d64Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 1 ,
false},
416{ ARM::VST1q64LowQPseudo_UPD, ARM::VST1d64Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 1 ,
false},
417{ ARM::VST1q64LowTPseudo_UPD, ARM::VST1d64Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 1 ,
false},
419{ ARM::VST1q8HighQPseudo, ARM::VST1d8Q,
false,
false,
false, SingleHighQSpc, 4, 8 ,
false},
420{ ARM::VST1q8HighQPseudo_UPD, ARM::VST1d8Qwb_fixed,
false,
true,
true, SingleHighQSpc, 4, 8 ,
false},
421{ ARM::VST1q8HighTPseudo, ARM::VST1d8T,
false,
false,
false, SingleHighTSpc, 3, 8 ,
false},
422{ ARM::VST1q8HighTPseudo_UPD, ARM::VST1d8Twb_fixed,
false,
true,
true, SingleHighTSpc, 3, 8 ,
false},
423{ ARM::VST1q8LowQPseudo_UPD, ARM::VST1d8Qwb_fixed,
false,
true,
true, SingleLowSpc, 4, 8 ,
false},
424{ ARM::VST1q8LowTPseudo_UPD, ARM::VST1d8Twb_fixed,
false,
true,
true, SingleLowSpc, 3, 8 ,
false},
426{ ARM::VST2LNd16Pseudo, ARM::VST2LNd16,
false,
false,
false, SingleSpc, 2, 4 ,
true},
427{ ARM::VST2LNd16Pseudo_UPD, ARM::VST2LNd16_UPD,
false,
true,
true, SingleSpc, 2, 4 ,
true},
428{ ARM::VST2LNd32Pseudo, ARM::VST2LNd32,
false,
false,
false, SingleSpc, 2, 2 ,
true},
429{ ARM::VST2LNd32Pseudo_UPD, ARM::VST2LNd32_UPD,
false,
true,
true, SingleSpc, 2, 2 ,
true},
430{ ARM::VST2LNd8Pseudo, ARM::VST2LNd8,
false,
false,
false, SingleSpc, 2, 8 ,
true},
431{ ARM::VST2LNd8Pseudo_UPD, ARM::VST2LNd8_UPD,
false,
true,
true, SingleSpc, 2, 8 ,
true},
432{ ARM::VST2LNq16Pseudo, ARM::VST2LNq16,
false,
false,
false, EvenDblSpc, 2, 4,
true},
433{ ARM::VST2LNq16Pseudo_UPD, ARM::VST2LNq16_UPD,
false,
true,
true, EvenDblSpc, 2, 4,
true},
434{ ARM::VST2LNq32Pseudo, ARM::VST2LNq32,
false,
false,
false, EvenDblSpc, 2, 2,
true},
435{ ARM::VST2LNq32Pseudo_UPD, ARM::VST2LNq32_UPD,
false,
true,
true, EvenDblSpc, 2, 2,
true},
437{ ARM::VST2q16Pseudo, ARM::VST2q16,
false,
false,
false, SingleSpc, 4, 4 ,
false},
438{ ARM::VST2q16PseudoWB_fixed, ARM::VST2q16wb_fixed,
false,
true,
false, SingleSpc, 4, 4 ,
false},
439{ ARM::VST2q16PseudoWB_register, ARM::VST2q16wb_register,
false,
true,
true, SingleSpc, 4, 4 ,
false},
440{ ARM::VST2q32Pseudo, ARM::VST2q32,
false,
false,
false, SingleSpc, 4, 2 ,
false},
441{ ARM::VST2q32PseudoWB_fixed, ARM::VST2q32wb_fixed,
false,
true,
false, SingleSpc, 4, 2 ,
false},
442{ ARM::VST2q32PseudoWB_register, ARM::VST2q32wb_register,
false,
true,
true, SingleSpc, 4, 2 ,
false},
443{ ARM::VST2q8Pseudo, ARM::VST2q8,
false,
false,
false, SingleSpc, 4, 8 ,
false},
444{ ARM::VST2q8PseudoWB_fixed, ARM::VST2q8wb_fixed,
false,
true,
false, SingleSpc, 4, 8 ,
false},
445{ ARM::VST2q8PseudoWB_register, ARM::VST2q8wb_register,
false,
true,
true, SingleSpc, 4, 8 ,
false},
447{ ARM::VST3LNd16Pseudo, ARM::VST3LNd16,
false,
false,
false, SingleSpc, 3, 4 ,
true},
448{ ARM::VST3LNd16Pseudo_UPD, ARM::VST3LNd16_UPD,
false,
true,
true, SingleSpc, 3, 4 ,
true},
449{ ARM::VST3LNd32Pseudo, ARM::VST3LNd32,
false,
false,
false, SingleSpc, 3, 2 ,
true},
450{ ARM::VST3LNd32Pseudo_UPD, ARM::VST3LNd32_UPD,
false,
true,
true, SingleSpc, 3, 2 ,
true},
451{ ARM::VST3LNd8Pseudo, ARM::VST3LNd8,
false,
false,
false, SingleSpc, 3, 8 ,
true},
452{ ARM::VST3LNd8Pseudo_UPD, ARM::VST3LNd8_UPD,
false,
true,
true, SingleSpc, 3, 8 ,
true},
453{ ARM::VST3LNq16Pseudo, ARM::VST3LNq16,
false,
false,
false, EvenDblSpc, 3, 4,
true},
454{ ARM::VST3LNq16Pseudo_UPD, ARM::VST3LNq16_UPD,
false,
true,
true, EvenDblSpc, 3, 4,
true},
455{ ARM::VST3LNq32Pseudo, ARM::VST3LNq32,
false,
false,
false, EvenDblSpc, 3, 2,
true},
456{ ARM::VST3LNq32Pseudo_UPD, ARM::VST3LNq32_UPD,
false,
true,
true, EvenDblSpc, 3, 2,
true},
458{ ARM::VST3d16Pseudo, ARM::VST3d16,
false,
false,
false, SingleSpc, 3, 4 ,
true},
459{ ARM::VST3d16Pseudo_UPD, ARM::VST3d16_UPD,
false,
true,
true, SingleSpc, 3, 4 ,
true},
460{ ARM::VST3d32Pseudo, ARM::VST3d32,
false,
false,
false, SingleSpc, 3, 2 ,
true},
461{ ARM::VST3d32Pseudo_UPD, ARM::VST3d32_UPD,
false,
true,
true, SingleSpc, 3, 2 ,
true},
462{ ARM::VST3d8Pseudo, ARM::VST3d8,
false,
false,
false, SingleSpc, 3, 8 ,
true},
463{ ARM::VST3d8Pseudo_UPD, ARM::VST3d8_UPD,
false,
true,
true, SingleSpc, 3, 8 ,
true},
465{ ARM::VST3q16Pseudo_UPD, ARM::VST3q16_UPD,
false,
true,
true, EvenDblSpc, 3, 4 ,
true},
466{ ARM::VST3q16oddPseudo, ARM::VST3q16,
false,
false,
false, OddDblSpc, 3, 4 ,
true},
467{ ARM::VST3q16oddPseudo_UPD, ARM::VST3q16_UPD,
false,
true,
true, OddDblSpc, 3, 4 ,
true},
468{ ARM::VST3q32Pseudo_UPD, ARM::VST3q32_UPD,
false,
true,
true, EvenDblSpc, 3, 2 ,
true},
469{ ARM::VST3q32oddPseudo, ARM::VST3q32,
false,
false,
false, OddDblSpc, 3, 2 ,
true},
470{ ARM::VST3q32oddPseudo_UPD, ARM::VST3q32_UPD,
false,
true,
true, OddDblSpc, 3, 2 ,
true},
471{ ARM::VST3q8Pseudo_UPD, ARM::VST3q8_UPD,
false,
true,
true, EvenDblSpc, 3, 8 ,
true},
472{ ARM::VST3q8oddPseudo, ARM::VST3q8,
false,
false,
false, OddDblSpc, 3, 8 ,
true},
473{ ARM::VST3q8oddPseudo_UPD, ARM::VST3q8_UPD,
false,
true,
true, OddDblSpc, 3, 8 ,
true},
475{ ARM::VST4LNd16Pseudo, ARM::VST4LNd16,
false,
false,
false, SingleSpc, 4, 4 ,
true},
476{ ARM::VST4LNd16Pseudo_UPD, ARM::VST4LNd16_UPD,
false,
true,
true, SingleSpc, 4, 4 ,
true},
477{ ARM::VST4LNd32Pseudo, ARM::VST4LNd32,
false,
false,
false, SingleSpc, 4, 2 ,
true},
478{ ARM::VST4LNd32Pseudo_UPD, ARM::VST4LNd32_UPD,
false,
true,
true, SingleSpc, 4, 2 ,
true},
479{ ARM::VST4LNd8Pseudo, ARM::VST4LNd8,
false,
false,
false, SingleSpc, 4, 8 ,
true},
480{ ARM::VST4LNd8Pseudo_UPD, ARM::VST4LNd8_UPD,
false,
true,
true, SingleSpc, 4, 8 ,
true},
481{ ARM::VST4LNq16Pseudo, ARM::VST4LNq16,
false,
false,
false, EvenDblSpc, 4, 4,
true},
482{ ARM::VST4LNq16Pseudo_UPD, ARM::VST4LNq16_UPD,
false,
true,
true, EvenDblSpc, 4, 4,
true},
483{ ARM::VST4LNq32Pseudo, ARM::VST4LNq32,
false,
false,
false, EvenDblSpc, 4, 2,
true},
484{ ARM::VST4LNq32Pseudo_UPD, ARM::VST4LNq32_UPD,
false,
true,
true, EvenDblSpc, 4, 2,
true},
486{ ARM::VST4d16Pseudo, ARM::VST4d16,
false,
false,
false, SingleSpc, 4, 4 ,
true},
487{ ARM::VST4d16Pseudo_UPD, ARM::VST4d16_UPD,
false,
true,
true, SingleSpc, 4, 4 ,
true},
488{ ARM::VST4d32Pseudo, ARM::VST4d32,
false,
false,
false, SingleSpc, 4, 2 ,
true},
489{ ARM::VST4d32Pseudo_UPD, ARM::VST4d32_UPD,
false,
true,
true, SingleSpc, 4, 2 ,
true},
490{ ARM::VST4d8Pseudo, ARM::VST4d8,
false,
false,
false, SingleSpc, 4, 8 ,
true},
491{ ARM::VST4d8Pseudo_UPD, ARM::VST4d8_UPD,
false,
true,
true, SingleSpc, 4, 8 ,
true},
493{ ARM::VST4q16Pseudo_UPD, ARM::VST4q16_UPD,
false,
true,
true, EvenDblSpc, 4, 4 ,
true},
494{ ARM::VST4q16oddPseudo, ARM::VST4q16,
false,
false,
false, OddDblSpc, 4, 4 ,
true},
495{ ARM::VST4q16oddPseudo_UPD, ARM::VST4q16_UPD,
false,
true,
true, OddDblSpc, 4, 4 ,
true},
496{ ARM::VST4q32Pseudo_UPD, ARM::VST4q32_UPD,
false,
true,
true, EvenDblSpc, 4, 2 ,
true},
497{ ARM::VST4q32oddPseudo, ARM::VST4q32,
false,
false,
false, OddDblSpc, 4, 2 ,
true},
498{ ARM::VST4q32oddPseudo_UPD, ARM::VST4q32_UPD,
false,
true,
true, OddDblSpc, 4, 2 ,
true},
499{ ARM::VST4q8Pseudo_UPD, ARM::VST4q8_UPD,
false,
true,
true, EvenDblSpc, 4, 8 ,
true},
500{ ARM::VST4q8oddPseudo, ARM::VST4q8,
false,
false,
false, OddDblSpc, 4, 8 ,
true},
501{ ARM::VST4q8oddPseudo_UPD, ARM::VST4q8_UPD,
false,
true,
true, OddDblSpc, 4, 8 ,
true}
509 static std::atomic<bool> TableChecked(
false);
510 if (!TableChecked.load(std::memory_order_relaxed)) {
512 TableChecked.store(
true, std::memory_order_relaxed);
528 if (RegSpc == SingleSpc || RegSpc == SingleLowSpc) {
529 D0 =
TRI->getSubReg(
Reg, ARM::dsub_0);
530 D1 =
TRI->getSubReg(
Reg, ARM::dsub_1);
531 D2 =
TRI->getSubReg(
Reg, ARM::dsub_2);
532 D3 =
TRI->getSubReg(
Reg, ARM::dsub_3);
533 }
else if (RegSpc == SingleHighQSpc) {
534 D0 =
TRI->getSubReg(
Reg, ARM::dsub_4);
535 D1 =
TRI->getSubReg(
Reg, ARM::dsub_5);
536 D2 =
TRI->getSubReg(
Reg, ARM::dsub_6);
537 D3 =
TRI->getSubReg(
Reg, ARM::dsub_7);
538 }
else if (RegSpc == SingleHighTSpc) {
539 D0 =
TRI->getSubReg(
Reg, ARM::dsub_3);
540 D1 =
TRI->getSubReg(
Reg, ARM::dsub_4);
541 D2 =
TRI->getSubReg(
Reg, ARM::dsub_5);
542 D3 =
TRI->getSubReg(
Reg, ARM::dsub_6);
543 }
else if (RegSpc == EvenDblSpc) {
544 D0 =
TRI->getSubReg(
Reg, ARM::dsub_0);
545 D1 =
TRI->getSubReg(
Reg, ARM::dsub_2);
546 D2 =
TRI->getSubReg(
Reg, ARM::dsub_4);
547 D3 =
TRI->getSubReg(
Reg, ARM::dsub_6);
549 assert(RegSpc == OddDblSpc &&
"unknown register spacing");
550 D0 =
TRI->getSubReg(
Reg, ARM::dsub_1);
551 D1 =
TRI->getSubReg(
Reg, ARM::dsub_3);
552 D2 =
TRI->getSubReg(
Reg, ARM::dsub_5);
553 D3 =
TRI->getSubReg(
Reg, ARM::dsub_7);
561 MachineBasicBlock &
MBB = *
MI.getParent();
565 assert(TableEntry && TableEntry->IsLoad &&
"NEONLdStTable lookup failed");
566 NEONRegSpacing RegSpc = (NEONRegSpacing)TableEntry->RegSpacing;
567 unsigned NumRegs = TableEntry->NumRegs;
570 TII->get(TableEntry->RealOpc));
573 bool DstIsDead =
MI.getOperand(
OpIdx).isDead();
576 bool IsVLD2DUP = TableEntry->RealOpc == ARM::VLD2DUPd8x2 ||
577 TableEntry->RealOpc == ARM::VLD2DUPd16x2 ||
578 TableEntry->RealOpc == ARM::VLD2DUPd32x2 ||
579 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_fixed ||
580 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_fixed ||
581 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_fixed ||
582 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_register ||
583 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_register ||
584 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_register;
587 unsigned SubRegIndex;
588 if (RegSpc == EvenDblSpc) {
589 SubRegIndex = ARM::dsub_0;
591 assert(RegSpc == OddDblSpc &&
"Unexpected spacing!");
592 SubRegIndex = ARM::dsub_1;
594 Register SubReg =
TRI->getSubReg(DstReg, SubRegIndex);
595 MCRegister DstRegPair =
596 TRI->getMatchingSuperReg(SubReg, ARM::dsub_0, &ARM::DPairSpcRegClass);
599 MCRegister D0, D1, D2, D3;
602 if (NumRegs > 1 && TableEntry->copyAllListRegs)
604 if (NumRegs > 2 && TableEntry->copyAllListRegs)
606 if (NumRegs > 3 && TableEntry->copyAllListRegs)
610 if (TableEntry->isUpdating)
618 if (TableEntry->hasWritebackOperand) {
626 const MachineOperand &AM6Offset =
MI.getOperand(
OpIdx++);
627 if (TableEntry->RealOpc == ARM::VLD1d8Qwb_fixed ||
628 TableEntry->RealOpc == ARM::VLD1d16Qwb_fixed ||
629 TableEntry->RealOpc == ARM::VLD1d32Qwb_fixed ||
630 TableEntry->RealOpc == ARM::VLD1d64Qwb_fixed ||
631 TableEntry->RealOpc == ARM::VLD1d8Twb_fixed ||
632 TableEntry->RealOpc == ARM::VLD1d16Twb_fixed ||
633 TableEntry->RealOpc == ARM::VLD1d32Twb_fixed ||
634 TableEntry->RealOpc == ARM::VLD1d64Twb_fixed ||
635 TableEntry->RealOpc == ARM::VLD2DUPd8x2wb_fixed ||
636 TableEntry->RealOpc == ARM::VLD2DUPd16x2wb_fixed ||
637 TableEntry->RealOpc == ARM::VLD2DUPd32x2wb_fixed) {
639 "A fixed writing-back pseudo instruction provides an offset "
649 unsigned SrcOpIdx = 0;
650 if (RegSpc == EvenDblSpc || RegSpc == OddDblSpc || RegSpc == SingleLowSpc ||
651 RegSpc == SingleHighQSpc || RegSpc == SingleHighTSpc)
661 MachineOperand MO =
MI.getOperand(SrcOpIdx);
671 MI.eraseFromParent();
679 MachineBasicBlock &
MBB = *
MI.getParent();
683 assert(TableEntry && !TableEntry->IsLoad &&
"NEONLdStTable lookup failed");
684 NEONRegSpacing RegSpc = (NEONRegSpacing)TableEntry->RegSpacing;
685 unsigned NumRegs = TableEntry->NumRegs;
688 TII->get(TableEntry->RealOpc));
690 if (TableEntry->isUpdating)
697 if (TableEntry->hasWritebackOperand) {
705 const MachineOperand &AM6Offset =
MI.getOperand(
OpIdx++);
706 if (TableEntry->RealOpc == ARM::VST1d8Qwb_fixed ||
707 TableEntry->RealOpc == ARM::VST1d16Qwb_fixed ||
708 TableEntry->RealOpc == ARM::VST1d32Qwb_fixed ||
709 TableEntry->RealOpc == ARM::VST1d64Qwb_fixed ||
710 TableEntry->RealOpc == ARM::VST1d8Twb_fixed ||
711 TableEntry->RealOpc == ARM::VST1d16Twb_fixed ||
712 TableEntry->RealOpc == ARM::VST1d32Twb_fixed ||
713 TableEntry->RealOpc == ARM::VST1d64Twb_fixed) {
715 "A fixed writing-back pseudo instruction provides an offset "
722 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
723 bool SrcIsUndef =
MI.getOperand(
OpIdx).isUndef();
725 MCRegister D0, D1, D2, D3;
728 if (NumRegs > 1 && TableEntry->copyAllListRegs)
730 if (NumRegs > 2 && TableEntry->copyAllListRegs)
732 if (NumRegs > 3 && TableEntry->copyAllListRegs)
739 if (SrcIsKill && !SrcIsUndef)
741 else if (!SrcIsUndef)
742 MIB.
addReg(SrcReg, RegState::Implicit);
747 MI.eraseFromParent();
755 MachineBasicBlock &
MBB = *
MI.getParent();
759 assert(TableEntry &&
"NEONLdStTable lookup failed");
760 NEONRegSpacing RegSpc = (NEONRegSpacing)TableEntry->RegSpacing;
761 unsigned NumRegs = TableEntry->NumRegs;
762 unsigned RegElts = TableEntry->RegElts;
765 TII->get(TableEntry->RealOpc));
769 unsigned Lane =
MI.getOperand(
MI.getDesc().getNumOperands() - 3).getImm();
772 assert(RegSpc != OddDblSpc &&
"unexpected register spacing for VLD/VST-lane");
773 if (RegSpc == EvenDblSpc && Lane >= RegElts) {
777 assert(Lane < RegElts &&
"out of range lane for VLD/VST-lane");
779 MCRegister D0, D1, D2, D3;
781 bool DstIsDead =
false;
782 if (TableEntry->IsLoad) {
783 DstIsDead =
MI.getOperand(
OpIdx).isDead();
784 DstReg =
MI.getOperand(
OpIdx++).getReg();
795 if (TableEntry->isUpdating)
802 if (TableEntry->hasWritebackOperand)
806 MachineOperand MO =
MI.getOperand(
OpIdx++);
807 if (!TableEntry->IsLoad)
832 if (TableEntry->IsLoad)
838 MI.eraseFromParent();
844 unsigned Opc,
bool IsExt) {
846 MachineBasicBlock &
MBB = *
MI.getParent();
855 MachineOperand VdSrc(
MI.getOperand(
OpIdx++));
859 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
861 MCRegister D0, D1, D2, D3;
866 MachineOperand VmSrc(
MI.getOperand(
OpIdx++));
876 MI.eraseFromParent();
882 MachineBasicBlock &
MBB = *
MI.getParent();
884 MI.getOpcode() == ARM::MQQPRStore ||
MI.getOpcode() == ARM::MQQQQPRStore
887 MachineInstrBuilder MIB =
895 MIB.
add(
MI.getOperand(1));
897 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_0), Flags);
898 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_1), Flags);
899 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_2), Flags);
900 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_3), Flags);
901 if (
MI.getOpcode() == ARM::MQQQQPRStore ||
902 MI.getOpcode() == ARM::MQQQQPRLoad) {
903 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_4), Flags);
904 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_5), Flags);
905 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_6), Flags);
906 MIB.
addReg(
TRI->getSubReg(SrcReg, ARM::dsub_7), Flags);
909 if (NewOpc == ARM::VSTMDIA)
910 MIB.
addReg(SrcReg, RegState::Implicit);
914 MI.eraseFromParent();
963 unsigned TargetFlag) {
967 unsigned Imm = MO.
getImm();
968 switch (TargetFlag) {
970 Imm = (Imm >> 24) & 0xff;
973 Imm = (Imm >> 16) & 0xff;
976 Imm = (Imm >> 8) & 0xff;
982 Imm = (Imm >> 16) & 0xffff;
1003void ARMExpandPseudo::ExpandTMOV32BitImm(MachineBasicBlock &
MBB,
1005 MachineInstr &
MI = *
MBBI;
1007 bool DstIsDead =
MI.getOperand(0).isDead();
1008 const MachineOperand &MO =
MI.getOperand(1);
1009 unsigned MIFlags =
MI.getFlags();
1018 unsigned PendingShift = 0;
1019 for (
unsigned Byte = 0;
Byte < 4; ++
Byte) {
1025 bool ZeroImm = Operand.
isImm() && Operand.
getImm() == 0;
1026 unsigned Op = PendingShift ? ARM::tADDi8 : ARM::tMOVi8;
1030 if (PendingShift && (!ZeroImm || Byte == 3)) {
1045 MachineInstrBuilder MIB =
1048 if (
Op == ARM::tADDi8)
1058 if (PendingShift || !ZeroImm)
1064 (--
MBBI)->getOperand(0).setIsDead(DstIsDead);
1066 MI.eraseFromParent();
1069void ARMExpandPseudo::ExpandMOV32BitImm(MachineBasicBlock &
MBB,
1071 MachineInstr &
MI = *
MBBI;
1072 unsigned Opcode =
MI.getOpcode();
1076 bool DstIsDead =
MI.getOperand(0).isDead();
1077 bool isCC = Opcode == ARM::MOVCCi32imm || Opcode == ARM::t2MOVCCi32imm;
1078 const MachineOperand &MO =
MI.getOperand(isCC ? 2 : 1);
1083 if (!STI->hasV6T2Ops() &&
1084 (Opcode == ARM::MOVi32imm || Opcode == ARM::MOVCCi32imm)) {
1088 assert (MO.
isImm() &&
"MOVi32imm w/ non-immediate source operand!");
1089 unsigned ImmVal = (unsigned)MO.
getImm();
1090 unsigned SOImmValV1 = 0, SOImmValV2 = 0;
1106 SOImmValV1 = ~(-SOImmValV1);
1109 unsigned MIFlags =
MI.getFlags();
1114 LO16.setMIFlags(MIFlags);
1115 HI16.setMIFlags(MIFlags);
1120 LO16.copyImplicitOps(
MI);
1121 HI16.copyImplicitOps(
MI);
1122 MI.eraseFromParent();
1126 unsigned LO16Opc = 0;
1127 unsigned HI16Opc = 0;
1128 unsigned MIFlags =
MI.getFlags();
1129 if (Opcode == ARM::t2MOVi32imm || Opcode == ARM::t2MOVCCi32imm) {
1130 LO16Opc = ARM::t2MOVi16;
1131 HI16Opc = ARM::t2MOVTi16;
1133 LO16Opc = ARM::MOVi16;
1134 HI16Opc = ARM::MOVTi16;
1138 LO16.setMIFlags(MIFlags);
1141 LO16.addImm(Pred).addReg(PredReg);
1144 LO16.copyImplicitOps(
MI);
1148 if (!(HIOperand.isImm() && HIOperand.getImm() == 0)) {
1152 HI16.setMIFlags(MIFlags);
1153 HI16.add(HIOperand);
1155 HI16.addImm(Pred).addReg(PredReg);
1156 HI16.copyImplicitOps(
MI);
1159 LO16->getOperand(0).setIsDead(DstIsDead);
1162 if (RequiresBundling)
1165 MI.eraseFromParent();
1173 const std::initializer_list<unsigned> &Regs,
1177 if (!
Op.isReg() || !
Op.isUse())
1183 std::set_difference(Regs.begin(), Regs.end(), OpRegs.
begin(), OpRegs.
end(),
1184 std::back_inserter(ClearRegs));
1187void ARMExpandPseudo::CMSEClearGPRegs(
1189 const DebugLoc &
DL,
const SmallVectorImpl<unsigned> &ClearRegs,
1190 unsigned ClobberReg) {
1192 if (STI->hasV8_1MMainlineOps()) {
1194 MachineInstrBuilder CLRM =
1196 for (
unsigned R : ClearRegs)
1197 CLRM.
addReg(R, RegState::Define);
1198 CLRM.
addReg(ARM::APSR, RegState::Define);
1199 CLRM.
addReg(ARM::CPSR, RegState::Define | RegState::Implicit);
1203 for (
unsigned Reg : ClearRegs) {
1204 if (
Reg == ClobberReg)
1212 .
addImm(STI->hasDSP() ? 0xc00 : 0x800)
1231 if ((
Reg >= ARM::Q0 &&
Reg <= ARM::Q7) ||
1232 (
Reg >= ARM::D0 &&
Reg <= ARM::D15) ||
1233 (
Reg >= ARM::S0 &&
Reg <= ARM::S31))
1238 if (
Reg >= ARM::Q0 &&
Reg <= ARM::Q7) {
1239 int R =
Reg - ARM::Q0;
1240 ClearRegs.
reset(R * 4, (R + 1) * 4);
1241 }
else if (
Reg >= ARM::D0 &&
Reg <= ARM::D15) {
1242 int R =
Reg - ARM::D0;
1243 ClearRegs.
reset(R * 2, (R + 1) * 2);
1244 }
else if (
Reg >= ARM::S0 &&
Reg <= ARM::S31) {
1245 ClearRegs[
Reg - ARM::S0] =
false;
1252ARMExpandPseudo::CMSEClearFPRegs(MachineBasicBlock &
MBB,
1254 BitVector ClearRegs(16,
true);
1257 if (STI->hasV8_1MMainlineOps())
1258 return CMSEClearFPRegsV81(
MBB,
MBBI, ClearRegs);
1260 return CMSEClearFPRegsV8(
MBB,
MBBI, ClearRegs);
1266ARMExpandPseudo::CMSEClearFPRegsV8(MachineBasicBlock &
MBB,
1268 const BitVector &ClearRegs) {
1269 if (!STI->hasFPRegs())
1278 MachineBasicBlock *ClearBB, *DoneBB;
1280 ClearBB = DoneBB = &
MBB;
1297 for (
const MachineOperand &
Op : RetI.operands()) {
1301 if (
Reg == ARM::NoRegister ||
Reg == ARM::LR)
1323 .
addReg(ARM::CPSR, RegState::Kill);
1327 for (
unsigned D = 0;
D < 8;
D++) {
1329 if (ClearRegs[
D * 2 + 0] && ClearRegs[
D * 2 + 1]) {
1330 unsigned Reg = ARM::D0 +
D;
1337 if (ClearRegs[
D * 2 + 0]) {
1338 unsigned Reg = ARM::S0 +
D * 2;
1344 if (ClearRegs[
D * 2 + 1]) {
1345 unsigned Reg = ARM::S0 +
D * 2 + 1;
1375ARMExpandPseudo::CMSEClearFPRegsV81(MachineBasicBlock &
MBB,
1377 const BitVector &ClearRegs) {
1382 int Start = -1, End = -1;
1383 for (
int S = 0,
E = ClearRegs.
size(); S !=
E; ++S) {
1384 if (ClearRegs[S] && S == End + 1) {
1390 MachineInstrBuilder VSCCLRM =
1393 while (++Start <= End)
1394 VSCCLRM.
addReg(ARM::S0 + Start, RegState::Define);
1395 VSCCLRM.
addReg(ARM::VPR, RegState::Define);
1401 MachineInstrBuilder VSCCLRM =
1404 while (++Start <= End)
1405 VSCCLRM.
addReg(ARM::S0 + Start, RegState::Define);
1406 VSCCLRM.
addReg(ARM::VPR, RegState::Define);
1412void ARMExpandPseudo::CMSESaveClearFPRegs(
1414 const LivePhysRegs &LiveRegs, SmallVectorImpl<unsigned> &ScratchRegs) {
1415 if (STI->hasV8_1MMainlineOps())
1416 CMSESaveClearFPRegsV81(
MBB,
MBBI,
DL, LiveRegs);
1417 else if (STI->hasV8MMainlineOps())
1418 CMSESaveClearFPRegsV8(
MBB,
MBBI,
DL, LiveRegs, ScratchRegs);
1422void ARMExpandPseudo::CMSESaveClearFPRegsV8(
1424 const LivePhysRegs &LiveRegs, SmallVectorImpl<unsigned> &ScratchRegs) {
1428 unsigned SpareReg = ScratchRegs.
front();
1437 std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs;
1438 std::vector<unsigned> NonclearedFPRegs;
1439 bool ReturnsFPReg =
false;
1440 for (
const MachineOperand &
Op :
MBBI->operands()) {
1441 if (
Op.isReg() &&
Op.isUse()) {
1447 if (ScratchRegs.
size() >= 2) {
1450 ClearedFPRegs.emplace_back(
Reg, SaveReg1, SaveReg2);
1454 .
addReg(SaveReg1, RegState::Define)
1455 .
addReg(SaveReg2, RegState::Define)
1459 NonclearedFPRegs.push_back(
Reg);
1462 if (ScratchRegs.
size() >= 1) {
1464 ClearedFPRegs.emplace_back(
Reg, SaveReg, 0);
1471 NonclearedFPRegs.push_back(
Reg);
1474 }
else if (
Op.isReg() &&
Op.isDef()) {
1478 ReturnsFPReg =
true;
1482 bool PassesFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty());
1484 if (PassesFPReg || ReturnsFPReg)
1485 assert(STI->hasFPRegs() &&
"Subtarget needs fpregs");
1511 if (ReturnsFPReg && !PassesFPReg) {
1512 bool S0Dead = !LiveRegs.contains(ARM::S0);
1521 MachineInstrBuilder VLSTM =
1536 for (
const auto &Regs : ClearedFPRegs) {
1537 unsigned Reg, SaveReg1, SaveReg2;
1538 std::tie(
Reg, SaveReg1, SaveReg2) = Regs;
1550 for (
unsigned Reg : NonclearedFPRegs) {
1560 MCRegister SReg0 =
TRI->getSubReg(
Reg, ARM::ssub_0);
1603void ARMExpandPseudo::CMSESaveClearFPRegsV81(MachineBasicBlock &
MBB,
1606 const LivePhysRegs &LiveRegs) {
1607 BitVector ClearRegs(32,
true);
1613 if (!DefFP && ClearRegs.
count() == ClearRegs.
size()) {
1621 MachineInstrBuilder VLSTM =
1636 MachineInstrBuilder VPUSH =
1640 for (
unsigned Reg = ARM::S16;
Reg <= ARM::S31; ++
Reg)
1644 (void)CMSEClearFPRegsV81(
MBB,
MBBI, ClearRegs);
1655void ARMExpandPseudo::CMSERestoreFPRegs(
1657 SmallVectorImpl<unsigned> &AvailableRegs) {
1658 if (STI->hasV8_1MMainlineOps())
1659 CMSERestoreFPRegsV81(
MBB,
MBBI,
DL, AvailableRegs);
1660 else if (STI->hasV8MMainlineOps())
1661 CMSERestoreFPRegsV8(
MBB,
MBBI,
DL, AvailableRegs);
1664void ARMExpandPseudo::CMSERestoreFPRegsV8(
1666 SmallVectorImpl<unsigned> &AvailableRegs) {
1669 unsigned ScratchReg = ARM::NoRegister;
1670 if (STI->fixCMSE_CVE_2021_35465())
1674 std::vector<std::tuple<unsigned, unsigned, unsigned>> ClearedFPRegs;
1675 std::vector<unsigned> NonclearedFPRegs;
1676 for (
const MachineOperand &
Op :
MBBI->operands()) {
1677 if (
Op.isReg() &&
Op.isDef()) {
1683 if (AvailableRegs.
size() >= 2) {
1686 ClearedFPRegs.emplace_back(
Reg, SaveReg1, SaveReg2);
1690 .
addReg(SaveReg1, RegState::Define)
1691 .
addReg(SaveReg2, RegState::Define)
1695 NonclearedFPRegs.push_back(
Reg);
1698 if (AvailableRegs.
size() >= 1) {
1700 ClearedFPRegs.emplace_back(
Reg, SaveReg, 0);
1707 NonclearedFPRegs.push_back(
Reg);
1713 bool returnsFPReg = (!NonclearedFPRegs.empty() || !ClearedFPRegs.empty());
1716 assert(STI->hasFPRegs() &&
"Subtarget needs fpregs");
1719 for (
unsigned Reg : NonclearedFPRegs) {
1736 MachineInstrBuilder VLLDM =
1743 if (STI->fixCMSE_CVE_2021_35465()) {
1744 auto Bundler = MIBundleBuilder(
MBB, VLLDM);
1747 .
addReg(ScratchReg, RegState::Define)
1763 if (STI->hasFPRegs())
1765 .
addReg(ARM::S0, RegState::Define)
1766 .
addReg(ARM::S0, RegState::Undef)
1776 for (
const auto &Regs : ClearedFPRegs) {
1777 unsigned Reg, SaveReg1, SaveReg2;
1778 std::tie(
Reg, SaveReg1, SaveReg2) = Regs;
1802 if ((
Reg >= ARM::Q0 &&
Reg <= ARM::Q7) ||
1803 (
Reg >= ARM::D0 &&
Reg <= ARM::D15) ||
1804 (
Reg >= ARM::S0 &&
Reg <= ARM::S31))
1810void ARMExpandPseudo::CMSERestoreFPRegsV81(
1812 SmallVectorImpl<unsigned> &AvailableRegs) {
1814 if (STI->fixCMSE_CVE_2021_35465()) {
1817 .
addReg(ARM::VPR, RegState::Define);
1841 MachineInstrBuilder VPOP =
1845 for (
unsigned Reg = ARM::S16;
Reg <= ARM::S31; ++
Reg)
1856 return ARM::tCMPhir;
1862bool ARMExpandPseudo::ExpandCMP_SWAP(MachineBasicBlock &
MBB,
1864 unsigned LdrexOp,
unsigned StrexOp,
1867 bool IsThumb = STI->isThumb();
1869 MachineInstr &
MI = *
MBBI;
1871 const MachineOperand &Dest =
MI.getOperand(0);
1872 Register TempReg =
MI.getOperand(1).getReg();
1875 assert(!
MI.getOperand(2).isUndef() &&
"cannot handle undef");
1876 Register AddrReg =
MI.getOperand(2).getReg();
1877 Register DesiredReg =
MI.getOperand(3).getReg();
1881 assert(STI->hasV8MBaselineOps() &&
1882 "CMP_SWAP not expected to be custom expanded for Thumb1");
1883 assert((UxtOp == 0 || UxtOp == ARM::tUXTB || UxtOp == ARM::tUXTH) &&
1884 "ARMv8-M.baseline does not have t2UXTB/t2UXTH");
1886 "DesiredReg used for UXT op must be tGPR");
1895 MF->
insert(++LoadCmpBB->getIterator(), StoreBB);
1896 MF->
insert(++StoreBB->getIterator(), DoneBB);
1899 MachineInstrBuilder MIB =
1901 .
addReg(DesiredReg, RegState::Kill);
1912 MachineInstrBuilder MIB;
1915 if (LdrexOp == ARM::t2LDREX)
1924 unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;
1928 .
addReg(ARM::CPSR, RegState::Kill);
1929 LoadCmpBB->addSuccessor(DoneBB);
1930 LoadCmpBB->addSuccessor(StoreBB);
1939 if (StrexOp == ARM::t2STREX)
1944 IsThumb ? (IsThumb1Only ? ARM::tCMPi8 : ARM::t2CMPri) :
ARM::CMPri;
1946 .
addReg(TempReg, RegState::Kill)
1952 .
addReg(ARM::CPSR, RegState::Kill);
1953 StoreBB->addSuccessor(LoadCmpBB);
1954 StoreBB->addSuccessor(DoneBB);
1962 MI.eraseFromParent();
1965 LivePhysRegs LiveRegs;
1970 StoreBB->clearLiveIns();
1972 LoadCmpBB->clearLiveIns();
1987 MIB.
addReg(RegLo, Flags);
1988 MIB.
addReg(RegHi, Flags);
1994bool ARMExpandPseudo::ExpandCMP_SWAP_64(MachineBasicBlock &
MBB,
1997 bool IsThumb = STI->isThumb();
1999 MachineInstr &
MI = *
MBBI;
2001 MachineOperand &Dest =
MI.getOperand(0);
2004 assert(!
MI.getOperand(1).isUndef() &&
"cannot handle undef");
2005 Register AddrAndTempReg =
MI.getOperand(1).getReg();
2006 Register AddrReg =
TRI->getSubReg(AddrAndTempReg, ARM::gsub_0);
2007 Register TempReg =
TRI->getSubReg(AddrAndTempReg, ARM::gsub_1);
2008 assert(
MI.getOperand(1).getReg() ==
MI.getOperand(2).getReg() &&
2009 "tied operands have different registers");
2010 Register DesiredReg =
MI.getOperand(3).getReg();
2011 MachineOperand
New =
MI.getOperand(4);
2012 New.setIsKill(
false);
2016 Register DesiredLo =
TRI->getSubReg(DesiredReg, ARM::gsub_0);
2017 Register DesiredHi =
TRI->getSubReg(DesiredReg, ARM::gsub_1);
2025 MF->
insert(++LoadCmpBB->getIterator(), StoreBB);
2026 MF->
insert(++StoreBB->getIterator(), DoneBB);
2033 unsigned LDREXD = IsThumb ? ARM::t2LDREXD : ARM::LDREXD;
2034 MachineInstrBuilder MIB;
2039 unsigned CMPrrLo =
getCmpOpcode(IsThumb, DestLo, DesiredLo);
2045 unsigned CMPrrHi =
getCmpOpcode(IsThumb, DestHi, DesiredHi);
2050 .
addReg(ARM::CPSR, RegState::Kill);
2052 unsigned Bcc = IsThumb ? ARM::tBcc : ARM::Bcc;
2056 .
addReg(ARM::CPSR, RegState::Kill);
2057 LoadCmpBB->addSuccessor(DoneBB);
2058 LoadCmpBB->addSuccessor(StoreBB);
2064 unsigned STREXD = IsThumb ? ARM::t2STREXD : ARM::STREXD;
2070 unsigned CMPri = IsThumb ? ARM::t2CMPri : ARM::CMPri;
2072 .
addReg(TempReg, RegState::Kill)
2078 .
addReg(ARM::CPSR, RegState::Kill);
2079 StoreBB->addSuccessor(LoadCmpBB);
2080 StoreBB->addSuccessor(DoneBB);
2088 MI.eraseFromParent();
2091 LivePhysRegs LiveRegs;
2096 StoreBB->clearLiveIns();
2098 LoadCmpBB->clearLiveIns();
2113 for (
unsigned Reg = ARM::R4;
Reg < ARM::R8; ++
Reg) {
2125 for (
unsigned LoReg = ARM::R7, HiReg = ARM::R11; LoReg >= ARM::R4;
2127 if (JumpReg == LoReg)
2136 for (
unsigned Reg = ARM::R4;
Reg < ARM::R8; ++
Reg) {
2145 if (JumpReg >= ARM::R4 && JumpReg <= ARM::R7) {
2146 Register LoReg = JumpReg == ARM::R4 ? ARM::R5 : ARM::R4;
2159 for (
unsigned Reg = ARM::R4;
Reg < ARM::R12; ++
Reg) {
2174 for (
int R = 0; R < 4; ++R) {
2182 for (
int R = 0; R < 4; ++R)
2189 for (
unsigned Reg = ARM::R4;
Reg < ARM::R12; ++
Reg)
2194bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &
MBB,
2197 MachineInstr &
MI = *
MBBI;
2198 unsigned Opcode =
MI.getOpcode();
2206 if (DstReg ==
MI.getOperand(3).getReg()) {
2208 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBITd : ARM::VBITq;
2210 .
add(
MI.getOperand(0))
2211 .
add(
MI.getOperand(3))
2212 .
add(
MI.getOperand(2))
2213 .
add(
MI.getOperand(1))
2215 .
add(
MI.getOperand(5));
2216 }
else if (DstReg ==
MI.getOperand(2).getReg()) {
2218 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBIFd : ARM::VBIFq;
2220 .
add(
MI.getOperand(0))
2221 .
add(
MI.getOperand(2))
2222 .
add(
MI.getOperand(3))
2223 .
add(
MI.getOperand(1))
2225 .
add(
MI.getOperand(5));
2228 unsigned NewOpc = Opcode == ARM::VBSPd ? ARM::VBSLd : ARM::VBSLq;
2229 if (DstReg ==
MI.getOperand(1).getReg()) {
2231 .
add(
MI.getOperand(0))
2232 .
add(
MI.getOperand(1))
2233 .
add(
MI.getOperand(2))
2234 .
add(
MI.getOperand(3))
2236 .
add(
MI.getOperand(5));
2239 unsigned MoveOpc = Opcode == ARM::VBSPd ? ARM::VORRd : ARM::VORRq;
2245 .
addReg(
MI.getOperand(1).getReg(), MO1Flags)
2246 .
addReg(
MI.getOperand(1).getReg(), MO1Flags)
2248 .
add(
MI.getOperand(5));
2250 .
add(
MI.getOperand(0))
2254 .
add(
MI.getOperand(2))
2255 .
add(
MI.getOperand(3))
2257 .
add(
MI.getOperand(5));
2260 MI.eraseFromParent();
2264 case ARM::CLEANUPRET:
2265 case ARM::CATCHRET: {
2266 unsigned RetOpcode = STI->isThumb() ? ARM::tBX_RET : ARM::BX_RET;
2269 MI.eraseFromParent();
2272 case ARM::TCRETURNdi:
2273 case ARM::TCRETURNri:
2274 case ARM::TCRETURNrinotr12: {
2276 if (
MBBI->getOpcode() == ARM::SEH_EpilogEnd)
2278 if (
MBBI->getOpcode() == ARM::SEH_Nop_Ret)
2281 "Can only insert epilog into returning blocks");
2282 unsigned RetOpcode =
MBBI->getOpcode();
2284 const ARMBaseInstrInfo &
TII = *
static_cast<const ARMBaseInstrInfo *
>(
2289 if (
MBBI->getOpcode() == ARM::SEH_EpilogEnd)
2291 if (
MBBI->getOpcode() == ARM::SEH_Nop_Ret)
2293 MachineOperand &JumpTarget =
MBBI->getOperand(0);
2296 if (RetOpcode == ARM::TCRETURNdi) {
2318 }
else if (RetOpcode == ARM::TCRETURNri ||
2319 RetOpcode == ARM::TCRETURNrinotr12) {
2321 STI->isThumb() ? ARM::tTAILJMPr
2322 : (STI->hasV4TOps() ? ARM::TAILJMPr : ARM::TAILJMPr4);
2328 auto NewMI = std::prev(
MBBI);
2329 for (
unsigned i = 2, e =
MBBI->getNumOperands(); i != e; ++i)
2330 NewMI->addOperand(
MBBI->getOperand(i));
2335 if (
MI.isCandidateForAdditionalCallInfo())
2336 MI.getMF()->moveAdditionalCallInfo(&
MI, &*NewMI);
2345 case ARM::tBXNS_RET: {
2351 MachineBasicBlock &AfterBB = CMSEClearFPRegs(
MBB,
MBBI);
2353 if (STI->hasV8_1MMainlineOps()) {
2356 TII->get(ARM::VLDR_FPCXTNS_post), ARM::SP)
2367 return !Op.isReg() || Op.getReg() != ARM::R12;
2371 *
MBBI, {ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R12}, ClearRegs);
2372 CMSEClearGPRegs(AfterBB, AfterBB.
end(),
MBBI->getDebugLoc(), ClearRegs,
2375 MachineInstrBuilder NewMI =
2377 TII->get(ARM::tBXNS))
2380 for (
const MachineOperand &
Op :
MI.operands())
2382 MI.eraseFromParent();
2385 case ARM::tBLXNS_CALL: {
2393 LivePhysRegs LiveRegs(*
TRI);
2394 LiveRegs.addLiveOuts(
MBB);
2396 LiveRegs.stepBackward(
MI);
2397 LiveRegs.stepBackward(*
MBBI);
2402 SmallVector<unsigned, 16> ClearRegs;
2404 {ARM::R0, ARM::R1, ARM::R2, ARM::R3, ARM::R4,
2405 ARM::R5, ARM::R6, ARM::R7, ARM::R8, ARM::R9,
2406 ARM::R10, ARM::R11, ARM::R12},
2408 auto OriginalClearRegs = ClearRegs;
2412 unsigned ScratchReg = ClearRegs.
front();
2430 .
addReg(ARM::CPSR, RegState::Define)
2436 CMSESaveClearFPRegs(
MBB,
MBBI,
DL, LiveRegs,
2438 CMSEClearGPRegs(
MBB,
MBBI,
DL, ClearRegs, JumpReg);
2440 const MachineInstrBuilder NewCall =
2443 .
addReg(JumpReg, RegState::Kill);
2447 if (
MI.isCandidateForAdditionalCallInfo())
2448 MI.getMF()->moveAdditionalCallInfo(&
MI, NewCall.
getInstr());
2450 CMSERestoreFPRegs(
MBB,
MBBI,
DL, OriginalClearRegs);
2454 MI.eraseFromParent();
2459 case ARM::VMOVDcc: {
2460 unsigned newOpc = Opcode != ARM::VMOVDcc ? ARM::VMOVS : ARM::VMOVD;
2462 MI.getOperand(1).getReg())
2463 .
add(
MI.getOperand(2))
2465 .
add(
MI.getOperand(4))
2468 MI.eraseFromParent();
2475 MI.getOperand(1).getReg())
2476 .
add(
MI.getOperand(2))
2478 .
add(
MI.getOperand(4))
2482 MI.eraseFromParent();
2485 case ARM::MOVCCsi: {
2487 (
MI.getOperand(1).getReg()))
2488 .
add(
MI.getOperand(2))
2491 .
add(
MI.getOperand(5))
2495 MI.eraseFromParent();
2498 case ARM::MOVCCsr: {
2500 (
MI.getOperand(1).getReg()))
2501 .
add(
MI.getOperand(2))
2502 .
add(
MI.getOperand(3))
2505 .
add(
MI.getOperand(6))
2509 MI.eraseFromParent();
2512 case ARM::t2MOVCCi16:
2513 case ARM::MOVCCi16: {
2514 unsigned NewOpc = AFI->
isThumbFunction() ? ARM::t2MOVi16 : ARM::MOVi16;
2516 MI.getOperand(1).getReg())
2519 .
add(
MI.getOperand(4))
2521 MI.eraseFromParent();
2528 MI.getOperand(1).getReg())
2531 .
add(
MI.getOperand(4))
2535 MI.eraseFromParent();
2542 MI.getOperand(1).getReg())
2545 .
add(
MI.getOperand(4))
2549 MI.eraseFromParent();
2552 case ARM::t2MOVCClsl:
2553 case ARM::t2MOVCClsr:
2554 case ARM::t2MOVCCasr:
2555 case ARM::t2MOVCCror: {
2558 case ARM::t2MOVCClsl: NewOpc = ARM::t2LSLri;
break;
2559 case ARM::t2MOVCClsr: NewOpc = ARM::t2LSRri;
break;
2560 case ARM::t2MOVCCasr: NewOpc = ARM::t2ASRri;
break;
2561 case ARM::t2MOVCCror: NewOpc = ARM::t2RORri;
break;
2565 MI.getOperand(1).getReg())
2566 .
add(
MI.getOperand(2))
2569 .
add(
MI.getOperand(5))
2572 MI.eraseFromParent();
2575 case ARM::Int_eh_sjlj_dispatchsetup: {
2576 MachineFunction &MF = *
MI.getParent()->getParent();
2585 "base pointer without frame pointer?");
2599 if (RI.hasStackRealignment(MF)) {
2605 "The BIC instruction cannot encode "
2606 "immediates larger than 256 with all lower "
2609 ARM::t2BICri : ARM::BICri;
2611 .
addReg(ARM::R6, RegState::Kill)
2617 MI.eraseFromParent();
2625 MI.getOperand(0).getReg())
2626 .
add(
MI.getOperand(1))
2630 .
addReg(ARM::CPSR, RegState::Define);
2631 MI.eraseFromParent();
2637 MI.getOperand(0).getReg())
2638 .
add(
MI.getOperand(1))
2643 MI.eraseFromParent();
2648 const bool Thumb = Opcode == ARM::tTPsoft;
2650 MachineInstrBuilder MIB;
2652 if (STI->genLongCalls()) {
2655 MachineConstantPoolValue *CPV =
2657 "__aeabi_read_tp", PCLabelID, 0);
2661 TII->get(Thumb ? ARM::tLDRpci : ARM::LDRi12),
Reg)
2675 TII->get(Thumb ? ARM::tBL : ARM::BL));
2684 if (
MI.isCandidateForAdditionalCallInfo())
2686 MI.eraseFromParent();
2689 case ARM::tLDRpci_pic:
2690 case ARM::t2LDRpci_pic: {
2691 unsigned NewLdOpc = (Opcode == ARM::tLDRpci_pic)
2692 ? ARM::tLDRpci :
ARM::t2LDRpci;
2694 bool DstIsDead =
MI.getOperand(0).isDead();
2696 .
add(
MI.getOperand(1))
2703 .
add(
MI.getOperand(2))
2705 MI.eraseFromParent();
2709 case ARM::LDRLIT_ga_abs:
2710 case ARM::LDRLIT_ga_pcrel:
2711 case ARM::LDRLIT_ga_pcrel_ldr:
2712 case ARM::tLDRLIT_ga_abs:
2713 case ARM::t2LDRLIT_ga_pcrel:
2714 case ARM::tLDRLIT_ga_pcrel: {
2716 bool DstIsDead =
MI.getOperand(0).isDead();
2717 const MachineOperand &MO1 =
MI.getOperand(1);
2719 const GlobalValue *GV = MO1.
getGlobal();
2720 bool IsARM = Opcode != ARM::tLDRLIT_ga_pcrel &&
2721 Opcode != ARM::tLDRLIT_ga_abs &&
2722 Opcode != ARM::t2LDRLIT_ga_pcrel;
2724 Opcode != ARM::LDRLIT_ga_abs && Opcode != ARM::tLDRLIT_ga_abs;
2725 unsigned LDRLITOpc = IsARM ? ARM::LDRi12 : ARM::tLDRpci;
2726 if (Opcode == ARM::t2LDRLIT_ga_pcrel)
2727 LDRLITOpc = ARM::t2LDRpci;
2728 unsigned PICAddOpc =
2730 ? (Opcode == ARM::LDRLIT_ga_pcrel_ldr ? ARM::PICLDR : ARM::PICADD)
2735 unsigned ARMPCLabelIndex = 0;
2736 MachineConstantPoolValue *CPV;
2739 unsigned PCAdj = IsARM ? 8 : 4;
2750 MachineInstrBuilder MIB =
2758 MachineInstrBuilder MIB =
2762 .
addImm(ARMPCLabelIndex);
2768 MI.eraseFromParent();
2771 case ARM::MOV_ga_pcrel:
2772 case ARM::MOV_ga_pcrel_ldr:
2773 case ARM::t2MOV_ga_pcrel: {
2777 bool DstIsDead =
MI.getOperand(0).isDead();
2778 const MachineOperand &MO1 =
MI.getOperand(1);
2779 const GlobalValue *GV = MO1.
getGlobal();
2781 bool isARM = Opcode != ARM::t2MOV_ga_pcrel;
2782 unsigned LO16Opc = isARM ? ARM::MOVi16_ga_pcrel : ARM::t2MOVi16_ga_pcrel;
2783 unsigned HI16Opc = isARM ? ARM::MOVTi16_ga_pcrel :ARM::t2MOVTi16_ga_pcrel;
2786 unsigned PICAddOpc = isARM
2787 ? (Opcode == ARM::MOV_ga_pcrel_ldr ? ARM::PICLDR : ARM::PICADD)
2801 TII->get(PICAddOpc))
2806 if (Opcode == ARM::MOV_ga_pcrel_ldr)
2810 MI.eraseFromParent();
2814 case ARM::MOVi32imm:
2815 case ARM::MOVCCi32imm:
2816 case ARM::t2MOVi32imm:
2817 case ARM::t2MOVCCi32imm:
2821 case ARM::tMOVi32imm:
2822 ExpandTMOV32BitImm(
MBB,
MBBI);
2825 case ARM::tLEApcrelJT:
2827 if (
MI.getMF()->getJumpTableInfo()->getEntryKind() ==
2832 assert(STI->isThumb() &&
"Non-inline jump tables expected only in thumb");
2833 ExpandTMOV32BitImm(
MBB,
MBBI);
2836 case ARM::SUBS_PC_LR: {
2839 .
add(
MI.getOperand(0))
2840 .
add(
MI.getOperand(1))
2841 .
add(
MI.getOperand(2))
2842 .
addReg(ARM::CPSR, RegState::Undef)
2844 MI.eraseFromParent();
2847 case ARM::VLDMQIA: {
2848 unsigned NewOpc = ARM::VLDMDIA;
2849 MachineInstrBuilder MIB =
2854 bool DstIsDead =
MI.getOperand(
OpIdx).isDead();
2865 Register D0 =
TRI->getSubReg(DstReg, ARM::dsub_0);
2866 Register D1 =
TRI->getSubReg(DstReg, ARM::dsub_1);
2874 MI.eraseFromParent();
2878 case ARM::VSTMQIA: {
2879 unsigned NewOpc = ARM::VSTMDIA;
2880 MachineInstrBuilder MIB =
2885 bool SrcIsKill =
MI.getOperand(
OpIdx).isKill();
2889 MachineOperand Dst(
MI.getOperand(
OpIdx++));
2897 Register D0 =
TRI->getSubReg(SrcReg, ARM::dsub_0);
2898 Register D1 =
TRI->getSubReg(SrcReg, ARM::dsub_1);
2907 MI.eraseFromParent();
2911 case ARM::VLD2q8Pseudo:
2912 case ARM::VLD2q16Pseudo:
2913 case ARM::VLD2q32Pseudo:
2914 case ARM::VLD2q8PseudoWB_fixed:
2915 case ARM::VLD2q16PseudoWB_fixed:
2916 case ARM::VLD2q32PseudoWB_fixed:
2917 case ARM::VLD2q8PseudoWB_register:
2918 case ARM::VLD2q16PseudoWB_register:
2919 case ARM::VLD2q32PseudoWB_register:
2920 case ARM::VLD3d8Pseudo:
2921 case ARM::VLD3d16Pseudo:
2922 case ARM::VLD3d32Pseudo:
2923 case ARM::VLD1d8TPseudo:
2924 case ARM::VLD1d8TPseudoWB_fixed:
2925 case ARM::VLD1d8TPseudoWB_register:
2926 case ARM::VLD1d16TPseudo:
2927 case ARM::VLD1d16TPseudoWB_fixed:
2928 case ARM::VLD1d16TPseudoWB_register:
2929 case ARM::VLD1d32TPseudo:
2930 case ARM::VLD1d32TPseudoWB_fixed:
2931 case ARM::VLD1d32TPseudoWB_register:
2932 case ARM::VLD1d64TPseudo:
2933 case ARM::VLD1d64TPseudoWB_fixed:
2934 case ARM::VLD1d64TPseudoWB_register:
2935 case ARM::VLD3d8Pseudo_UPD:
2936 case ARM::VLD3d16Pseudo_UPD:
2937 case ARM::VLD3d32Pseudo_UPD:
2938 case ARM::VLD3q8Pseudo_UPD:
2939 case ARM::VLD3q16Pseudo_UPD:
2940 case ARM::VLD3q32Pseudo_UPD:
2941 case ARM::VLD3q8oddPseudo:
2942 case ARM::VLD3q16oddPseudo:
2943 case ARM::VLD3q32oddPseudo:
2944 case ARM::VLD3q8oddPseudo_UPD:
2945 case ARM::VLD3q16oddPseudo_UPD:
2946 case ARM::VLD3q32oddPseudo_UPD:
2947 case ARM::VLD4d8Pseudo:
2948 case ARM::VLD4d16Pseudo:
2949 case ARM::VLD4d32Pseudo:
2950 case ARM::VLD1d8QPseudo:
2951 case ARM::VLD1d8QPseudoWB_fixed:
2952 case ARM::VLD1d8QPseudoWB_register:
2953 case ARM::VLD1d16QPseudo:
2954 case ARM::VLD1d16QPseudoWB_fixed:
2955 case ARM::VLD1d16QPseudoWB_register:
2956 case ARM::VLD1d32QPseudo:
2957 case ARM::VLD1d32QPseudoWB_fixed:
2958 case ARM::VLD1d32QPseudoWB_register:
2959 case ARM::VLD1d64QPseudo:
2960 case ARM::VLD1d64QPseudoWB_fixed:
2961 case ARM::VLD1d64QPseudoWB_register:
2962 case ARM::VLD1q8HighQPseudo:
2963 case ARM::VLD1q8HighQPseudo_UPD:
2964 case ARM::VLD1q8LowQPseudo_UPD:
2965 case ARM::VLD1q8HighTPseudo:
2966 case ARM::VLD1q8HighTPseudo_UPD:
2967 case ARM::VLD1q8LowTPseudo_UPD:
2968 case ARM::VLD1q16HighQPseudo:
2969 case ARM::VLD1q16HighQPseudo_UPD:
2970 case ARM::VLD1q16LowQPseudo_UPD:
2971 case ARM::VLD1q16HighTPseudo:
2972 case ARM::VLD1q16HighTPseudo_UPD:
2973 case ARM::VLD1q16LowTPseudo_UPD:
2974 case ARM::VLD1q32HighQPseudo:
2975 case ARM::VLD1q32HighQPseudo_UPD:
2976 case ARM::VLD1q32LowQPseudo_UPD:
2977 case ARM::VLD1q32HighTPseudo:
2978 case ARM::VLD1q32HighTPseudo_UPD:
2979 case ARM::VLD1q32LowTPseudo_UPD:
2980 case ARM::VLD1q64HighQPseudo:
2981 case ARM::VLD1q64HighQPseudo_UPD:
2982 case ARM::VLD1q64LowQPseudo_UPD:
2983 case ARM::VLD1q64HighTPseudo:
2984 case ARM::VLD1q64HighTPseudo_UPD:
2985 case ARM::VLD1q64LowTPseudo_UPD:
2986 case ARM::VLD4d8Pseudo_UPD:
2987 case ARM::VLD4d16Pseudo_UPD:
2988 case ARM::VLD4d32Pseudo_UPD:
2989 case ARM::VLD4q8Pseudo_UPD:
2990 case ARM::VLD4q16Pseudo_UPD:
2991 case ARM::VLD4q32Pseudo_UPD:
2992 case ARM::VLD4q8oddPseudo:
2993 case ARM::VLD4q16oddPseudo:
2994 case ARM::VLD4q32oddPseudo:
2995 case ARM::VLD4q8oddPseudo_UPD:
2996 case ARM::VLD4q16oddPseudo_UPD:
2997 case ARM::VLD4q32oddPseudo_UPD:
2998 case ARM::VLD3DUPd8Pseudo:
2999 case ARM::VLD3DUPd16Pseudo:
3000 case ARM::VLD3DUPd32Pseudo:
3001 case ARM::VLD3DUPd8Pseudo_UPD:
3002 case ARM::VLD3DUPd16Pseudo_UPD:
3003 case ARM::VLD3DUPd32Pseudo_UPD:
3004 case ARM::VLD4DUPd8Pseudo:
3005 case ARM::VLD4DUPd16Pseudo:
3006 case ARM::VLD4DUPd32Pseudo:
3007 case ARM::VLD4DUPd8Pseudo_UPD:
3008 case ARM::VLD4DUPd16Pseudo_UPD:
3009 case ARM::VLD4DUPd32Pseudo_UPD:
3010 case ARM::VLD2DUPq8EvenPseudo:
3011 case ARM::VLD2DUPq8OddPseudo:
3012 case ARM::VLD2DUPq16EvenPseudo:
3013 case ARM::VLD2DUPq16OddPseudo:
3014 case ARM::VLD2DUPq32EvenPseudo:
3015 case ARM::VLD2DUPq32OddPseudo:
3016 case ARM::VLD2DUPq8OddPseudoWB_fixed:
3017 case ARM::VLD2DUPq8OddPseudoWB_register:
3018 case ARM::VLD2DUPq16OddPseudoWB_fixed:
3019 case ARM::VLD2DUPq16OddPseudoWB_register:
3020 case ARM::VLD2DUPq32OddPseudoWB_fixed:
3021 case ARM::VLD2DUPq32OddPseudoWB_register:
3022 case ARM::VLD3DUPq8EvenPseudo:
3023 case ARM::VLD3DUPq8OddPseudo:
3024 case ARM::VLD3DUPq16EvenPseudo:
3025 case ARM::VLD3DUPq16OddPseudo:
3026 case ARM::VLD3DUPq32EvenPseudo:
3027 case ARM::VLD3DUPq32OddPseudo:
3028 case ARM::VLD3DUPq8OddPseudo_UPD:
3029 case ARM::VLD3DUPq16OddPseudo_UPD:
3030 case ARM::VLD3DUPq32OddPseudo_UPD:
3031 case ARM::VLD4DUPq8EvenPseudo:
3032 case ARM::VLD4DUPq8OddPseudo:
3033 case ARM::VLD4DUPq16EvenPseudo:
3034 case ARM::VLD4DUPq16OddPseudo:
3035 case ARM::VLD4DUPq32EvenPseudo:
3036 case ARM::VLD4DUPq32OddPseudo:
3037 case ARM::VLD4DUPq8OddPseudo_UPD:
3038 case ARM::VLD4DUPq16OddPseudo_UPD:
3039 case ARM::VLD4DUPq32OddPseudo_UPD:
3043 case ARM::VST2q8Pseudo:
3044 case ARM::VST2q16Pseudo:
3045 case ARM::VST2q32Pseudo:
3046 case ARM::VST2q8PseudoWB_fixed:
3047 case ARM::VST2q16PseudoWB_fixed:
3048 case ARM::VST2q32PseudoWB_fixed:
3049 case ARM::VST2q8PseudoWB_register:
3050 case ARM::VST2q16PseudoWB_register:
3051 case ARM::VST2q32PseudoWB_register:
3052 case ARM::VST3d8Pseudo:
3053 case ARM::VST3d16Pseudo:
3054 case ARM::VST3d32Pseudo:
3055 case ARM::VST1d8TPseudo:
3056 case ARM::VST1d8TPseudoWB_fixed:
3057 case ARM::VST1d8TPseudoWB_register:
3058 case ARM::VST1d16TPseudo:
3059 case ARM::VST1d16TPseudoWB_fixed:
3060 case ARM::VST1d16TPseudoWB_register:
3061 case ARM::VST1d32TPseudo:
3062 case ARM::VST1d32TPseudoWB_fixed:
3063 case ARM::VST1d32TPseudoWB_register:
3064 case ARM::VST1d64TPseudo:
3065 case ARM::VST1d64TPseudoWB_fixed:
3066 case ARM::VST1d64TPseudoWB_register:
3067 case ARM::VST3d8Pseudo_UPD:
3068 case ARM::VST3d16Pseudo_UPD:
3069 case ARM::VST3d32Pseudo_UPD:
3070 case ARM::VST3q8Pseudo_UPD:
3071 case ARM::VST3q16Pseudo_UPD:
3072 case ARM::VST3q32Pseudo_UPD:
3073 case ARM::VST3q8oddPseudo:
3074 case ARM::VST3q16oddPseudo:
3075 case ARM::VST3q32oddPseudo:
3076 case ARM::VST3q8oddPseudo_UPD:
3077 case ARM::VST3q16oddPseudo_UPD:
3078 case ARM::VST3q32oddPseudo_UPD:
3079 case ARM::VST4d8Pseudo:
3080 case ARM::VST4d16Pseudo:
3081 case ARM::VST4d32Pseudo:
3082 case ARM::VST1d8QPseudo:
3083 case ARM::VST1d8QPseudoWB_fixed:
3084 case ARM::VST1d8QPseudoWB_register:
3085 case ARM::VST1d16QPseudo:
3086 case ARM::VST1d16QPseudoWB_fixed:
3087 case ARM::VST1d16QPseudoWB_register:
3088 case ARM::VST1d32QPseudo:
3089 case ARM::VST1d32QPseudoWB_fixed:
3090 case ARM::VST1d32QPseudoWB_register:
3091 case ARM::VST1d64QPseudo:
3092 case ARM::VST1d64QPseudoWB_fixed:
3093 case ARM::VST1d64QPseudoWB_register:
3094 case ARM::VST4d8Pseudo_UPD:
3095 case ARM::VST4d16Pseudo_UPD:
3096 case ARM::VST4d32Pseudo_UPD:
3097 case ARM::VST1q8HighQPseudo:
3098 case ARM::VST1q8LowQPseudo_UPD:
3099 case ARM::VST1q8HighTPseudo:
3100 case ARM::VST1q8LowTPseudo_UPD:
3101 case ARM::VST1q16HighQPseudo:
3102 case ARM::VST1q16LowQPseudo_UPD:
3103 case ARM::VST1q16HighTPseudo:
3104 case ARM::VST1q16LowTPseudo_UPD:
3105 case ARM::VST1q32HighQPseudo:
3106 case ARM::VST1q32LowQPseudo_UPD:
3107 case ARM::VST1q32HighTPseudo:
3108 case ARM::VST1q32LowTPseudo_UPD:
3109 case ARM::VST1q64HighQPseudo:
3110 case ARM::VST1q64LowQPseudo_UPD:
3111 case ARM::VST1q64HighTPseudo:
3112 case ARM::VST1q64LowTPseudo_UPD:
3113 case ARM::VST1q8HighTPseudo_UPD:
3114 case ARM::VST1q16HighTPseudo_UPD:
3115 case ARM::VST1q32HighTPseudo_UPD:
3116 case ARM::VST1q64HighTPseudo_UPD:
3117 case ARM::VST1q8HighQPseudo_UPD:
3118 case ARM::VST1q16HighQPseudo_UPD:
3119 case ARM::VST1q32HighQPseudo_UPD:
3120 case ARM::VST1q64HighQPseudo_UPD:
3121 case ARM::VST4q8Pseudo_UPD:
3122 case ARM::VST4q16Pseudo_UPD:
3123 case ARM::VST4q32Pseudo_UPD:
3124 case ARM::VST4q8oddPseudo:
3125 case ARM::VST4q16oddPseudo:
3126 case ARM::VST4q32oddPseudo:
3127 case ARM::VST4q8oddPseudo_UPD:
3128 case ARM::VST4q16oddPseudo_UPD:
3129 case ARM::VST4q32oddPseudo_UPD:
3133 case ARM::VLD1LNq8Pseudo:
3134 case ARM::VLD1LNq16Pseudo:
3135 case ARM::VLD1LNq32Pseudo:
3136 case ARM::VLD1LNq8Pseudo_UPD:
3137 case ARM::VLD1LNq16Pseudo_UPD:
3138 case ARM::VLD1LNq32Pseudo_UPD:
3139 case ARM::VLD2LNd8Pseudo:
3140 case ARM::VLD2LNd16Pseudo:
3141 case ARM::VLD2LNd32Pseudo:
3142 case ARM::VLD2LNq16Pseudo:
3143 case ARM::VLD2LNq32Pseudo:
3144 case ARM::VLD2LNd8Pseudo_UPD:
3145 case ARM::VLD2LNd16Pseudo_UPD:
3146 case ARM::VLD2LNd32Pseudo_UPD:
3147 case ARM::VLD2LNq16Pseudo_UPD:
3148 case ARM::VLD2LNq32Pseudo_UPD:
3149 case ARM::VLD3LNd8Pseudo:
3150 case ARM::VLD3LNd16Pseudo:
3151 case ARM::VLD3LNd32Pseudo:
3152 case ARM::VLD3LNq16Pseudo:
3153 case ARM::VLD3LNq32Pseudo:
3154 case ARM::VLD3LNd8Pseudo_UPD:
3155 case ARM::VLD3LNd16Pseudo_UPD:
3156 case ARM::VLD3LNd32Pseudo_UPD:
3157 case ARM::VLD3LNq16Pseudo_UPD:
3158 case ARM::VLD3LNq32Pseudo_UPD:
3159 case ARM::VLD4LNd8Pseudo:
3160 case ARM::VLD4LNd16Pseudo:
3161 case ARM::VLD4LNd32Pseudo:
3162 case ARM::VLD4LNq16Pseudo:
3163 case ARM::VLD4LNq32Pseudo:
3164 case ARM::VLD4LNd8Pseudo_UPD:
3165 case ARM::VLD4LNd16Pseudo_UPD:
3166 case ARM::VLD4LNd32Pseudo_UPD:
3167 case ARM::VLD4LNq16Pseudo_UPD:
3168 case ARM::VLD4LNq32Pseudo_UPD:
3169 case ARM::VST1LNq8Pseudo:
3170 case ARM::VST1LNq16Pseudo:
3171 case ARM::VST1LNq32Pseudo:
3172 case ARM::VST1LNq8Pseudo_UPD:
3173 case ARM::VST1LNq16Pseudo_UPD:
3174 case ARM::VST1LNq32Pseudo_UPD:
3175 case ARM::VST2LNd8Pseudo:
3176 case ARM::VST2LNd16Pseudo:
3177 case ARM::VST2LNd32Pseudo:
3178 case ARM::VST2LNq16Pseudo:
3179 case ARM::VST2LNq32Pseudo:
3180 case ARM::VST2LNd8Pseudo_UPD:
3181 case ARM::VST2LNd16Pseudo_UPD:
3182 case ARM::VST2LNd32Pseudo_UPD:
3183 case ARM::VST2LNq16Pseudo_UPD:
3184 case ARM::VST2LNq32Pseudo_UPD:
3185 case ARM::VST3LNd8Pseudo:
3186 case ARM::VST3LNd16Pseudo:
3187 case ARM::VST3LNd32Pseudo:
3188 case ARM::VST3LNq16Pseudo:
3189 case ARM::VST3LNq32Pseudo:
3190 case ARM::VST3LNd8Pseudo_UPD:
3191 case ARM::VST3LNd16Pseudo_UPD:
3192 case ARM::VST3LNd32Pseudo_UPD:
3193 case ARM::VST3LNq16Pseudo_UPD:
3194 case ARM::VST3LNq32Pseudo_UPD:
3195 case ARM::VST4LNd8Pseudo:
3196 case ARM::VST4LNd16Pseudo:
3197 case ARM::VST4LNd32Pseudo:
3198 case ARM::VST4LNq16Pseudo:
3199 case ARM::VST4LNq32Pseudo:
3200 case ARM::VST4LNd8Pseudo_UPD:
3201 case ARM::VST4LNd16Pseudo_UPD:
3202 case ARM::VST4LNd32Pseudo_UPD:
3203 case ARM::VST4LNq16Pseudo_UPD:
3204 case ARM::VST4LNq32Pseudo_UPD:
3208 case ARM::VTBL3Pseudo: ExpandVTBL(
MBBI, ARM::VTBL3,
false);
return true;
3209 case ARM::VTBL4Pseudo: ExpandVTBL(
MBBI, ARM::VTBL4,
false);
return true;
3210 case ARM::VTBX3Pseudo: ExpandVTBL(
MBBI, ARM::VTBX3,
true);
return true;
3211 case ARM::VTBX4Pseudo: ExpandVTBL(
MBBI, ARM::VTBX4,
true);
return true;
3213 case ARM::MQQPRLoad:
3214 case ARM::MQQPRStore:
3215 case ARM::MQQQQPRLoad:
3216 case ARM::MQQQQPRStore:
3217 ExpandMQQPRLoadStore(
MBBI);
3220 case ARM::tCMP_SWAP_8:
3222 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREXB, ARM::t2STREXB, ARM::tUXTB,
3224 case ARM::tCMP_SWAP_16:
3226 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREXH, ARM::t2STREXH, ARM::tUXTH,
3228 case ARM::tCMP_SWAP_32:
3230 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::t2LDREX, ARM::t2STREX, 0, NextMBBI);
3232 case ARM::CMP_SWAP_8:
3234 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREXB, ARM::STREXB, ARM::UXTB,
3236 case ARM::CMP_SWAP_16:
3238 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREXH, ARM::STREXH, ARM::UXTH,
3240 case ARM::CMP_SWAP_32:
3242 return ExpandCMP_SWAP(
MBB,
MBBI, ARM::LDREX, ARM::STREX, 0, NextMBBI);
3244 case ARM::CMP_SWAP_64:
3245 return ExpandCMP_SWAP_64(
MBB,
MBBI, NextMBBI);
3247 case ARM::tBL_PUSHLR:
3248 case ARM::BL_PUSHLR: {
3249 const bool Thumb = Opcode == ARM::tBL_PUSHLR;
3251 assert(
Reg == ARM::LR &&
"expect LR register!");
3252 MachineInstrBuilder MIB;
3264 .
addReg(ARM::SP, RegState::Define)
3275 MI.eraseFromParent();
3278 case ARM::t2CALL_BTI: {
3279 MachineFunction &MF = *
MI.getMF();
3280 MachineInstrBuilder MIB =
3283 for (
unsigned i = 0; i <
MI.getNumOperands(); ++i)
3284 MIB.
add(
MI.getOperand(i));
3285 if (
MI.isCandidateForAdditionalCallInfo())
3287 MIBundleBuilder Bundler(
MBB,
MI);
3288 Bundler.append(MIB);
3289 Bundler.append(
BuildMI(MF,
MI.getDebugLoc(),
TII->get(ARM::t2BTI)));
3291 MI.eraseFromParent();
3295 case ARM::STOREDUAL: {
3296 Register PairReg =
MI.getOperand(0).getReg();
3298 MachineInstrBuilder MIB =
3300 TII->get(Opcode == ARM::LOADDUAL ? ARM::LDRD : ARM::STRD))
3301 .
addReg(
TRI->getSubReg(PairReg, ARM::gsub_0),
3303 .
addReg(
TRI->getSubReg(PairReg, ARM::gsub_1),
3309 MI.eraseFromParent();
3315bool ARMExpandPseudo::ExpandMBB(MachineBasicBlock &
MBB) {
3328bool ARMExpandPseudo::runOnMachineFunction(MachineFunction &MF) {
3332 AFI = MF.
getInfo<ARMFunctionInfo>();
3334 LLVM_DEBUG(
dbgs() <<
"********** ARM EXPAND PSEUDO INSTRUCTIONS **********\n"
3335 <<
"********** Function: " << MF.
getName() <<
'\n');
3338 for (MachineBasicBlock &
MBB : MF)
3341 MF.verify(
this,
"After expanding ARM pseudo instructions.");
3343 LLVM_DEBUG(
dbgs() <<
"***************************************************\n");
3350 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 addExclusiveRegPair(MachineInstrBuilder &MIB, MachineOperand &Reg, RegState Flags, bool IsThumb, const TargetRegisterInfo *TRI)
ARM's ldrexd/strexd take a consecutive register pair (represented as a single GPRPair register),...
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 unsigned getCmpOpcode(bool IsThumb, Register LHS, Register RHS)
static MachineOperand getMovOperand(const MachineOperand &MO, unsigned TargetFlag)
static MachineOperand makeImplicit(const MachineOperand &MO)
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")
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, ARMCP::ARMCPModifier Modifier=ARMCP::no_modifier, bool AddCurrentAddress=false)
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
Represent the analysis usage information of a pass.
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
BitVector & reset()
Reset all bits in the bitvector.
size_type count() const
Returns the number of bits which are set.
size_type size() const
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.
const HexagonRegisterInfo & getRegisterInfo() const
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
LLVM_ABI 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...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
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 & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
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 & 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
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
MachineOperand class - Representation of each machine instruction operand.
static MachineOperand CreateMCSymbol(MCSymbol *Sym, unsigned TargetFlags=0)
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.
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)
MCSymbol * getMCSymbol() const
@ 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_LaneMask
Mask to represent active parts of registers.
@ 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.
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.
@ HI16
High 16 bits of absolute address.
@ LO16
Low 16 bits of absolute address.
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.
RegState
Flags to represent properties of register accesses.
@ Kill
The last use of a register.
@ Define
Register definition.
constexpr RegState getKillRegState(bool B)
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
constexpr RegState getDeadRegState(bool B)
static std::array< MachineOperand, 2 > predOps(ARMCC::CondCodes Pred, unsigned PredReg=0)
Get the operands corresponding to the given Pred value.
constexpr RegState getRenamableRegState(bool B)
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...
constexpr RegState getDefRegState(bool B)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
RegState getRegState(const MachineOperand &RegOp)
Get all register state flags from machine operand RegOp.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
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,...
DWARFExpression::Operation Op
static MachineOperand t1CondCodeOp(bool isDead=false)
Get the operand corresponding to the conditional code result for Thumb1.
LLVM_ABI 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...
constexpr RegState getUndefRegState(bool B)
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.