xref: /llvm-project/llvm/unittests/Target/ARM/MachineInstrTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
1 #include "ARMBaseInstrInfo.h"
2 #include "ARMSubtarget.h"
3 #include "ARMTargetMachine.h"
4 #include "llvm/MC/TargetRegistry.h"
5 #include "llvm/Support/TargetSelect.h"
6 #include "llvm/Target/TargetMachine.h"
7 #include "llvm/Target/TargetOptions.h"
8 
9 #include "gtest/gtest.h"
10 
11 using namespace llvm;
12 
13 TEST(MachineInstructionDoubleWidthResult, IsCorrect) {
14   using namespace ARM;
15 
16   auto DoubleWidthResult = [](unsigned Opcode) {
17     switch (Opcode) {
18     default:
19       break;
20     case MVE_VMULLBp16:
21     case MVE_VMULLBp8:
22     case MVE_VMULLBs16:
23     case MVE_VMULLBs32:
24     case MVE_VMULLBs8:
25     case MVE_VMULLBu16:
26     case MVE_VMULLBu32:
27     case MVE_VMULLBu8:
28     case MVE_VMULLTp16:
29     case MVE_VMULLTp8:
30     case MVE_VMULLTs16:
31     case MVE_VMULLTs32:
32     case MVE_VMULLTs8:
33     case MVE_VMULLTu16:
34     case MVE_VMULLTu32:
35     case MVE_VMULLTu8:
36     case MVE_VQDMULL_qr_s16bh:
37     case MVE_VQDMULL_qr_s16th:
38     case MVE_VQDMULL_qr_s32bh:
39     case MVE_VQDMULL_qr_s32th:
40     case MVE_VQDMULLs16bh:
41     case MVE_VQDMULLs16th:
42     case MVE_VQDMULLs32bh:
43     case MVE_VQDMULLs32th:
44     case MVE_VMOVLs16bh:
45     case MVE_VMOVLs16th:
46     case MVE_VMOVLs8bh:
47     case MVE_VMOVLs8th:
48     case MVE_VMOVLu16bh:
49     case MVE_VMOVLu16th:
50     case MVE_VMOVLu8bh:
51     case MVE_VMOVLu8th:
52     case MVE_VSHLL_imms16bh:
53     case MVE_VSHLL_imms16th:
54     case MVE_VSHLL_imms8bh:
55     case MVE_VSHLL_imms8th:
56     case MVE_VSHLL_immu16bh:
57     case MVE_VSHLL_immu16th:
58     case MVE_VSHLL_immu8bh:
59     case MVE_VSHLL_immu8th:
60     case MVE_VSHLL_lws16bh:
61     case MVE_VSHLL_lws16th:
62     case MVE_VSHLL_lws8bh:
63     case MVE_VSHLL_lws8th:
64     case MVE_VSHLL_lwu16bh:
65     case MVE_VSHLL_lwu16th:
66     case MVE_VSHLL_lwu8bh:
67     case MVE_VSHLL_lwu8th:
68       return true;
69     }
70     return false;
71   };
72 
73   LLVMInitializeARMTargetInfo();
74   LLVMInitializeARMTarget();
75   LLVMInitializeARMTargetMC();
76 
77   auto TT(Triple::normalize("thumbv8.1m.main-none-none-eabi"));
78   std::string Error;
79   const Target *T = TargetRegistry::lookupTarget(TT, Error);
80   if (!T) {
81     dbgs() << Error;
82     GTEST_SKIP();
83   }
84 
85   TargetOptions Options;
86   auto TM = std::unique_ptr<TargetMachine>(
87       T->createTargetMachine(TT, "generic", "", Options, std::nullopt,
88                              std::nullopt, CodeGenOptLevel::Default));
89   ARMSubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
90                   std::string(TM->getTargetFeatureString()),
91                   *static_cast<const ARMBaseTargetMachine *>(TM.get()), false);
92   const ARMBaseInstrInfo *TII = ST.getInstrInfo();
93   auto MII = TM->getMCInstrInfo();
94 
95   for (unsigned i = 0; i < ARM::INSTRUCTION_LIST_END; ++i) {
96     const MCInstrDesc &Desc = TII->get(i);
97 
98     uint64_t Flags = Desc.TSFlags;
99     if ((Flags & ARMII::DomainMask) != ARMII::DomainMVE)
100       continue;
101 
102     bool Valid = (Flags & ARMII::DoubleWidthResult) != 0;
103     ASSERT_EQ(DoubleWidthResult(i), Valid)
104               << MII->getName(i)
105               << ": mismatched expectation for tail-predicated safety\n";
106   }
107 }
108 
109 TEST(MachineInstructionHorizontalReduction, IsCorrect) {
110   using namespace ARM;
111 
112   auto HorizontalReduction = [](unsigned Opcode) {
113     switch (Opcode) {
114     default:
115       break;
116     case MVE_VABAVs16:
117     case MVE_VABAVs32:
118     case MVE_VABAVs8:
119     case MVE_VABAVu16:
120     case MVE_VABAVu32:
121     case MVE_VABAVu8:
122     case MVE_VADDLVs32acc:
123     case MVE_VADDLVs32no_acc:
124     case MVE_VADDLVu32acc:
125     case MVE_VADDLVu32no_acc:
126     case MVE_VADDVs16acc:
127     case MVE_VADDVs16no_acc:
128     case MVE_VADDVs32acc:
129     case MVE_VADDVs32no_acc:
130     case MVE_VADDVs8acc:
131     case MVE_VADDVs8no_acc:
132     case MVE_VADDVu16acc:
133     case MVE_VADDVu16no_acc:
134     case MVE_VADDVu32acc:
135     case MVE_VADDVu32no_acc:
136     case MVE_VADDVu8acc:
137     case MVE_VADDVu8no_acc:
138     case MVE_VMAXAVs16:
139     case MVE_VMAXAVs32:
140     case MVE_VMAXAVs8:
141     case MVE_VMAXNMAVf16:
142     case MVE_VMAXNMAVf32:
143     case MVE_VMAXNMVf16:
144     case MVE_VMAXNMVf32:
145     case MVE_VMAXVs16:
146     case MVE_VMAXVs32:
147     case MVE_VMAXVs8:
148     case MVE_VMAXVu16:
149     case MVE_VMAXVu32:
150     case MVE_VMAXVu8:
151     case MVE_VMINAVs16:
152     case MVE_VMINAVs32:
153     case MVE_VMINAVs8:
154     case MVE_VMINNMAVf16:
155     case MVE_VMINNMAVf32:
156     case MVE_VMINNMVf16:
157     case MVE_VMINNMVf32:
158     case MVE_VMINVs16:
159     case MVE_VMINVs32:
160     case MVE_VMINVs8:
161     case MVE_VMINVu16:
162     case MVE_VMINVu32:
163     case MVE_VMINVu8:
164     case MVE_VMLADAVas16:
165     case MVE_VMLADAVas32:
166     case MVE_VMLADAVas8:
167     case MVE_VMLADAVau16:
168     case MVE_VMLADAVau32:
169     case MVE_VMLADAVau8:
170     case MVE_VMLADAVaxs16:
171     case MVE_VMLADAVaxs32:
172     case MVE_VMLADAVaxs8:
173     case MVE_VMLADAVs16:
174     case MVE_VMLADAVs32:
175     case MVE_VMLADAVs8:
176     case MVE_VMLADAVu16:
177     case MVE_VMLADAVu32:
178     case MVE_VMLADAVu8:
179     case MVE_VMLADAVxs16:
180     case MVE_VMLADAVxs32:
181     case MVE_VMLADAVxs8:
182     case MVE_VMLALDAVas16:
183     case MVE_VMLALDAVas32:
184     case MVE_VMLALDAVau16:
185     case MVE_VMLALDAVau32:
186     case MVE_VMLALDAVaxs16:
187     case MVE_VMLALDAVaxs32:
188     case MVE_VMLALDAVs16:
189     case MVE_VMLALDAVs32:
190     case MVE_VMLALDAVu16:
191     case MVE_VMLALDAVu32:
192     case MVE_VMLALDAVxs16:
193     case MVE_VMLALDAVxs32:
194     case MVE_VMLSDAVas16:
195     case MVE_VMLSDAVas32:
196     case MVE_VMLSDAVas8:
197     case MVE_VMLSDAVaxs16:
198     case MVE_VMLSDAVaxs32:
199     case MVE_VMLSDAVaxs8:
200     case MVE_VMLSDAVs16:
201     case MVE_VMLSDAVs32:
202     case MVE_VMLSDAVs8:
203     case MVE_VMLSDAVxs16:
204     case MVE_VMLSDAVxs32:
205     case MVE_VMLSDAVxs8:
206     case MVE_VMLSLDAVas16:
207     case MVE_VMLSLDAVas32:
208     case MVE_VMLSLDAVaxs16:
209     case MVE_VMLSLDAVaxs32:
210     case MVE_VMLSLDAVs16:
211     case MVE_VMLSLDAVs32:
212     case MVE_VMLSLDAVxs16:
213     case MVE_VMLSLDAVxs32:
214     case MVE_VRMLALDAVHas32:
215     case MVE_VRMLALDAVHau32:
216     case MVE_VRMLALDAVHaxs32:
217     case MVE_VRMLALDAVHs32:
218     case MVE_VRMLALDAVHu32:
219     case MVE_VRMLALDAVHxs32:
220     case MVE_VRMLSLDAVHas32:
221     case MVE_VRMLSLDAVHaxs32:
222     case MVE_VRMLSLDAVHs32:
223     case MVE_VRMLSLDAVHxs32:
224       return true;
225     }
226     return false;
227   };
228 
229   LLVMInitializeARMTargetInfo();
230   LLVMInitializeARMTarget();
231   LLVMInitializeARMTargetMC();
232 
233   auto TT(Triple::normalize("thumbv8.1m.main-none-none-eabi"));
234   std::string Error;
235   const Target *T = TargetRegistry::lookupTarget(TT, Error);
236   if (!T) {
237     dbgs() << Error;
238     GTEST_SKIP();
239   }
240 
241   TargetOptions Options;
242   auto TM = std::unique_ptr<TargetMachine>(
243       T->createTargetMachine(TT, "generic", "", Options, std::nullopt,
244                              std::nullopt, CodeGenOptLevel::Default));
245   ARMSubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
246                   std::string(TM->getTargetFeatureString()),
247                   *static_cast<const ARMBaseTargetMachine *>(TM.get()), false);
248   const ARMBaseInstrInfo *TII = ST.getInstrInfo();
249   auto MII = TM->getMCInstrInfo();
250 
251   for (unsigned i = 0; i < ARM::INSTRUCTION_LIST_END; ++i) {
252     const MCInstrDesc &Desc = TII->get(i);
253 
254     uint64_t Flags = Desc.TSFlags;
255     if ((Flags & ARMII::DomainMask) != ARMII::DomainMVE)
256       continue;
257     bool Valid = (Flags & ARMII::HorizontalReduction) != 0;
258     ASSERT_EQ(HorizontalReduction(i), Valid)
259               << MII->getName(i)
260               << ": mismatched expectation for tail-predicated safety\n";
261   }
262 }
263 
264 TEST(MachineInstructionRetainsPreviousHalfElement, IsCorrect) {
265   using namespace ARM;
266 
267   auto RetainsPreviousHalfElement = [](unsigned Opcode) {
268     switch (Opcode) {
269     default:
270       break;
271     case MVE_VMOVNi16bh:
272     case MVE_VMOVNi16th:
273     case MVE_VMOVNi32bh:
274     case MVE_VMOVNi32th:
275     case MVE_VQMOVNs16bh:
276     case MVE_VQMOVNs16th:
277     case MVE_VQMOVNs32bh:
278     case MVE_VQMOVNs32th:
279     case MVE_VQMOVNu16bh:
280     case MVE_VQMOVNu16th:
281     case MVE_VQMOVNu32bh:
282     case MVE_VQMOVNu32th:
283     case MVE_VQMOVUNs16bh:
284     case MVE_VQMOVUNs16th:
285     case MVE_VQMOVUNs32bh:
286     case MVE_VQMOVUNs32th:
287     case MVE_VQRSHRNbhs16:
288     case MVE_VQRSHRNbhs32:
289     case MVE_VQRSHRNbhu16:
290     case MVE_VQRSHRNbhu32:
291     case MVE_VQRSHRNths16:
292     case MVE_VQRSHRNths32:
293     case MVE_VQRSHRNthu16:
294     case MVE_VQRSHRNthu32:
295     case MVE_VQRSHRUNs16bh:
296     case MVE_VQRSHRUNs16th:
297     case MVE_VQRSHRUNs32bh:
298     case MVE_VQRSHRUNs32th:
299     case MVE_VQSHRNbhs16:
300     case MVE_VQSHRNbhs32:
301     case MVE_VQSHRNbhu16:
302     case MVE_VQSHRNbhu32:
303     case MVE_VQSHRNths16:
304     case MVE_VQSHRNths32:
305     case MVE_VQSHRNthu16:
306     case MVE_VQSHRNthu32:
307     case MVE_VQSHRUNs16bh:
308     case MVE_VQSHRUNs16th:
309     case MVE_VQSHRUNs32bh:
310     case MVE_VQSHRUNs32th:
311     case MVE_VRSHRNi16bh:
312     case MVE_VRSHRNi16th:
313     case MVE_VRSHRNi32bh:
314     case MVE_VRSHRNi32th:
315     case MVE_VSHRNi16bh:
316     case MVE_VSHRNi16th:
317     case MVE_VSHRNi32bh:
318     case MVE_VSHRNi32th:
319     case MVE_VCVTf16f32bh:
320     case MVE_VCVTf16f32th:
321     case MVE_VCVTf32f16bh:
322     case MVE_VCVTf32f16th:
323       return true;
324     }
325     return false;
326   };
327 
328   LLVMInitializeARMTargetInfo();
329   LLVMInitializeARMTarget();
330   LLVMInitializeARMTargetMC();
331 
332   auto TT(Triple::normalize("thumbv8.1m.main-none-none-eabi"));
333   std::string Error;
334   const Target *T = TargetRegistry::lookupTarget(TT, Error);
335   if (!T) {
336     dbgs() << Error;
337     GTEST_SKIP();
338   }
339 
340   TargetOptions Options;
341   auto TM = std::unique_ptr<TargetMachine>(
342       T->createTargetMachine(TT, "generic", "", Options, std::nullopt,
343                              std::nullopt, CodeGenOptLevel::Default));
344   ARMSubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
345                   std::string(TM->getTargetFeatureString()),
346                   *static_cast<const ARMBaseTargetMachine *>(TM.get()), false);
347   const ARMBaseInstrInfo *TII = ST.getInstrInfo();
348   auto MII = TM->getMCInstrInfo();
349 
350   for (unsigned i = 0; i < ARM::INSTRUCTION_LIST_END; ++i) {
351     const MCInstrDesc &Desc = TII->get(i);
352 
353     uint64_t Flags = Desc.TSFlags;
354     if ((Flags & ARMII::DomainMask) != ARMII::DomainMVE)
355       continue;
356 
357     bool Valid = (Flags & ARMII::RetainsPreviousHalfElement) != 0;
358     ASSERT_EQ(RetainsPreviousHalfElement(i), Valid)
359               << MII->getName(i)
360               << ": mismatched expectation for tail-predicated safety\n";
361   }
362 }
363 // Test for instructions that aren't immediately obviously valid within a
364 // tail-predicated loop. This should be marked up in their tablegen
365 // descriptions. Currently we, conservatively, disallow:
366 // - cross beat carries.
367 // - complex operations.
368 // - horizontal operations with exchange.
369 // - byte swapping.
370 // - interleaved memory instructions.
371 // TODO: Add to this list once we can handle them safely.
372 TEST(MachineInstrValidTailPredication, IsCorrect) {
373 
374   using namespace ARM;
375 
376   auto IsValidTPOpcode = [](unsigned Opcode) {
377     switch (Opcode) {
378     default:
379       return false;
380     case MVE_ASRLi:
381     case MVE_ASRLr:
382     case MVE_LSRL:
383     case MVE_LSLLi:
384     case MVE_LSLLr:
385     case MVE_SQRSHR:
386     case MVE_SQRSHRL:
387     case MVE_SQSHL:
388     case MVE_SQSHLL:
389     case MVE_SRSHR:
390     case MVE_SRSHRL:
391     case MVE_UQRSHL:
392     case MVE_UQRSHLL:
393     case MVE_UQSHL:
394     case MVE_UQSHLL:
395     case MVE_URSHR:
396     case MVE_URSHRL:
397     case MVE_VABDf16:
398     case MVE_VABDf32:
399     case MVE_VABDs16:
400     case MVE_VABDs32:
401     case MVE_VABDs8:
402     case MVE_VABDu16:
403     case MVE_VABDu32:
404     case MVE_VABDu8:
405     case MVE_VABSf16:
406     case MVE_VABSf32:
407     case MVE_VABSs16:
408     case MVE_VABSs32:
409     case MVE_VABSs8:
410     case MVE_VADD_qr_f16:
411     case MVE_VADD_qr_f32:
412     case MVE_VADD_qr_i16:
413     case MVE_VADD_qr_i32:
414     case MVE_VADD_qr_i8:
415     case MVE_VADDVs16acc:
416     case MVE_VADDVs16no_acc:
417     case MVE_VADDVs32acc:
418     case MVE_VADDVs32no_acc:
419     case MVE_VADDVs8acc:
420     case MVE_VADDVs8no_acc:
421     case MVE_VADDVu16acc:
422     case MVE_VADDVu16no_acc:
423     case MVE_VADDVu32acc:
424     case MVE_VADDVu32no_acc:
425     case MVE_VADDVu8acc:
426     case MVE_VADDVu8no_acc:
427     case MVE_VADDf16:
428     case MVE_VADDf32:
429     case MVE_VADDi16:
430     case MVE_VADDi32:
431     case MVE_VADDi8:
432     case MVE_VAND:
433     case MVE_VBIC:
434     case MVE_VBICimmi16:
435     case MVE_VBICimmi32:
436     case MVE_VBRSR16:
437     case MVE_VBRSR32:
438     case MVE_VBRSR8:
439     case MVE_VCLSs16:
440     case MVE_VCLSs32:
441     case MVE_VCLSs8:
442     case MVE_VCLZs16:
443     case MVE_VCLZs32:
444     case MVE_VCLZs8:
445     case MVE_VCMPf16:
446     case MVE_VCMPf16r:
447     case MVE_VCMPf32:
448     case MVE_VCMPf32r:
449     case MVE_VCMPi16:
450     case MVE_VCMPi16r:
451     case MVE_VCMPi32:
452     case MVE_VCMPi32r:
453     case MVE_VCMPi8:
454     case MVE_VCMPi8r:
455     case MVE_VCMPs16:
456     case MVE_VCMPs16r:
457     case MVE_VCMPs32:
458     case MVE_VCMPs32r:
459     case MVE_VCMPs8:
460     case MVE_VCMPs8r:
461     case MVE_VCMPu16:
462     case MVE_VCMPu16r:
463     case MVE_VCMPu32:
464     case MVE_VCMPu32r:
465     case MVE_VCMPu8:
466     case MVE_VCMPu8r:
467     case MVE_VCTP16:
468     case MVE_VCTP32:
469     case MVE_VCTP64:
470     case MVE_VCTP8:
471     case MVE_VCVTf16s16_fix:
472     case MVE_VCVTf16s16n:
473     case MVE_VCVTf16u16_fix:
474     case MVE_VCVTf16u16n:
475     case MVE_VCVTf32s32_fix:
476     case MVE_VCVTf32s32n:
477     case MVE_VCVTf32u32_fix:
478     case MVE_VCVTf32u32n:
479     case MVE_VCVTs16f16_fix:
480     case MVE_VCVTs16f16a:
481     case MVE_VCVTs16f16m:
482     case MVE_VCVTs16f16n:
483     case MVE_VCVTs16f16p:
484     case MVE_VCVTs16f16z:
485     case MVE_VCVTs32f32_fix:
486     case MVE_VCVTs32f32a:
487     case MVE_VCVTs32f32m:
488     case MVE_VCVTs32f32n:
489     case MVE_VCVTs32f32p:
490     case MVE_VCVTs32f32z:
491     case MVE_VCVTu16f16_fix:
492     case MVE_VCVTu16f16a:
493     case MVE_VCVTu16f16m:
494     case MVE_VCVTu16f16n:
495     case MVE_VCVTu16f16p:
496     case MVE_VCVTu16f16z:
497     case MVE_VCVTu32f32_fix:
498     case MVE_VCVTu32f32a:
499     case MVE_VCVTu32f32m:
500     case MVE_VCVTu32f32n:
501     case MVE_VCVTu32f32p:
502     case MVE_VCVTu32f32z:
503     case MVE_VDDUPu16:
504     case MVE_VDDUPu32:
505     case MVE_VDDUPu8:
506     case MVE_VDUP16:
507     case MVE_VDUP32:
508     case MVE_VDUP8:
509     case MVE_VDWDUPu16:
510     case MVE_VDWDUPu32:
511     case MVE_VDWDUPu8:
512     case MVE_VEOR:
513     case MVE_VFMA_qr_Sf16:
514     case MVE_VFMA_qr_Sf32:
515     case MVE_VFMA_qr_f16:
516     case MVE_VFMA_qr_f32:
517     case MVE_VFMAf16:
518     case MVE_VFMAf32:
519     case MVE_VFMSf16:
520     case MVE_VFMSf32:
521     case MVE_VMAXAs16:
522     case MVE_VMAXAs32:
523     case MVE_VMAXAs8:
524     case MVE_VMAXs16:
525     case MVE_VMAXs32:
526     case MVE_VMAXs8:
527     case MVE_VMAXu16:
528     case MVE_VMAXu32:
529     case MVE_VMAXu8:
530     case MVE_VMAXNMf16:
531     case MVE_VMAXNMf32:
532     case MVE_VMAXNMAf16:
533     case MVE_VMAXNMAf32:
534     case MVE_VMINAs16:
535     case MVE_VMINAs32:
536     case MVE_VMINAs8:
537     case MVE_VMINs16:
538     case MVE_VMINs32:
539     case MVE_VMINs8:
540     case MVE_VMINu16:
541     case MVE_VMINu32:
542     case MVE_VMINu8:
543     case MVE_VMINNMf16:
544     case MVE_VMINNMf32:
545     case MVE_VMINNMAf16:
546     case MVE_VMINNMAf32:
547     case MVE_VMLADAVas16:
548     case MVE_VMLADAVas32:
549     case MVE_VMLADAVas8:
550     case MVE_VMLADAVau16:
551     case MVE_VMLADAVau32:
552     case MVE_VMLADAVau8:
553     case MVE_VMLADAVs16:
554     case MVE_VMLADAVs32:
555     case MVE_VMLADAVs8:
556     case MVE_VMLADAVu16:
557     case MVE_VMLADAVu32:
558     case MVE_VMLADAVu8:
559     case MVE_VMLALDAVs16:
560     case MVE_VMLALDAVs32:
561     case MVE_VMLALDAVu16:
562     case MVE_VMLALDAVu32:
563     case MVE_VMLALDAVas16:
564     case MVE_VMLALDAVas32:
565     case MVE_VMLALDAVau16:
566     case MVE_VMLALDAVau32:
567     case MVE_VMLSDAVas16:
568     case MVE_VMLSDAVas32:
569     case MVE_VMLSDAVas8:
570     case MVE_VMLSDAVs16:
571     case MVE_VMLSDAVs32:
572     case MVE_VMLSDAVs8:
573     case MVE_VMLSLDAVas16:
574     case MVE_VMLSLDAVas32:
575     case MVE_VMLSLDAVs16:
576     case MVE_VMLSLDAVs32:
577     case MVE_VRMLALDAVHas32:
578     case MVE_VRMLALDAVHau32:
579     case MVE_VRMLALDAVHs32:
580     case MVE_VRMLALDAVHu32:
581     case MVE_VRMLSLDAVHas32:
582     case MVE_VRMLSLDAVHs32:
583     case MVE_VMLAS_qr_i16:
584     case MVE_VMLAS_qr_i32:
585     case MVE_VMLAS_qr_i8:
586     case MVE_VMLA_qr_i16:
587     case MVE_VMLA_qr_i32:
588     case MVE_VMLA_qr_i8:
589     case MVE_VHADD_qr_s16:
590     case MVE_VHADD_qr_s32:
591     case MVE_VHADD_qr_s8:
592     case MVE_VHADD_qr_u16:
593     case MVE_VHADD_qr_u32:
594     case MVE_VHADD_qr_u8:
595     case MVE_VHADDs16:
596     case MVE_VHADDs32:
597     case MVE_VHADDs8:
598     case MVE_VHADDu16:
599     case MVE_VHADDu32:
600     case MVE_VHADDu8:
601     case MVE_VHSUB_qr_s16:
602     case MVE_VHSUB_qr_s32:
603     case MVE_VHSUB_qr_s8:
604     case MVE_VHSUB_qr_u16:
605     case MVE_VHSUB_qr_u32:
606     case MVE_VHSUB_qr_u8:
607     case MVE_VHSUBs16:
608     case MVE_VHSUBs32:
609     case MVE_VHSUBs8:
610     case MVE_VHSUBu16:
611     case MVE_VHSUBu32:
612     case MVE_VHSUBu8:
613     case MVE_VIDUPu16:
614     case MVE_VIDUPu32:
615     case MVE_VIDUPu8:
616     case MVE_VIWDUPu16:
617     case MVE_VIWDUPu32:
618     case MVE_VIWDUPu8:
619     case MVE_VLD20_8:
620     case MVE_VLD21_8:
621     case MVE_VLD20_16:
622     case MVE_VLD21_16:
623     case MVE_VLD20_32:
624     case MVE_VLD21_32:
625     case MVE_VLD20_8_wb:
626     case MVE_VLD21_8_wb:
627     case MVE_VLD20_16_wb:
628     case MVE_VLD21_16_wb:
629     case MVE_VLD20_32_wb:
630     case MVE_VLD21_32_wb:
631     case MVE_VLD40_8:
632     case MVE_VLD41_8:
633     case MVE_VLD42_8:
634     case MVE_VLD43_8:
635     case MVE_VLD40_16:
636     case MVE_VLD41_16:
637     case MVE_VLD42_16:
638     case MVE_VLD43_16:
639     case MVE_VLD40_32:
640     case MVE_VLD41_32:
641     case MVE_VLD42_32:
642     case MVE_VLD43_32:
643     case MVE_VLD40_8_wb:
644     case MVE_VLD41_8_wb:
645     case MVE_VLD42_8_wb:
646     case MVE_VLD43_8_wb:
647     case MVE_VLD40_16_wb:
648     case MVE_VLD41_16_wb:
649     case MVE_VLD42_16_wb:
650     case MVE_VLD43_16_wb:
651     case MVE_VLD40_32_wb:
652     case MVE_VLD41_32_wb:
653     case MVE_VLD42_32_wb:
654     case MVE_VLD43_32_wb:
655     case MVE_VLDRBS16:
656     case MVE_VLDRBS16_post:
657     case MVE_VLDRBS16_pre:
658     case MVE_VLDRBS16_rq:
659     case MVE_VLDRBS32:
660     case MVE_VLDRBS32_post:
661     case MVE_VLDRBS32_pre:
662     case MVE_VLDRBS32_rq:
663     case MVE_VLDRBU16:
664     case MVE_VLDRBU16_post:
665     case MVE_VLDRBU16_pre:
666     case MVE_VLDRBU16_rq:
667     case MVE_VLDRBU32:
668     case MVE_VLDRBU32_post:
669     case MVE_VLDRBU32_pre:
670     case MVE_VLDRBU32_rq:
671     case MVE_VLDRBU8:
672     case MVE_VLDRBU8_post:
673     case MVE_VLDRBU8_pre:
674     case MVE_VLDRBU8_rq:
675     case MVE_VLDRDU64_qi:
676     case MVE_VLDRDU64_qi_pre:
677     case MVE_VLDRDU64_rq:
678     case MVE_VLDRDU64_rq_u:
679     case MVE_VLDRHS32:
680     case MVE_VLDRHS32_post:
681     case MVE_VLDRHS32_pre:
682     case MVE_VLDRHS32_rq:
683     case MVE_VLDRHS32_rq_u:
684     case MVE_VLDRHU16:
685     case MVE_VLDRHU16_post:
686     case MVE_VLDRHU16_pre:
687     case MVE_VLDRHU16_rq:
688     case MVE_VLDRHU16_rq_u:
689     case MVE_VLDRHU32:
690     case MVE_VLDRHU32_post:
691     case MVE_VLDRHU32_pre:
692     case MVE_VLDRHU32_rq:
693     case MVE_VLDRHU32_rq_u:
694     case MVE_VLDRWU32:
695     case MVE_VLDRWU32_post:
696     case MVE_VLDRWU32_pre:
697     case MVE_VLDRWU32_qi:
698     case MVE_VLDRWU32_qi_pre:
699     case MVE_VLDRWU32_rq:
700     case MVE_VLDRWU32_rq_u:
701     case MVE_VMOVimmf32:
702     case MVE_VMOVimmi16:
703     case MVE_VMOVimmi32:
704     case MVE_VMOVimmi64:
705     case MVE_VMOVimmi8:
706     case MVE_VMOVNi16bh:
707     case MVE_VMOVNi16th:
708     case MVE_VMOVNi32bh:
709     case MVE_VMOVNi32th:
710     case MVE_VMULLBp16:
711     case MVE_VMULLBp8:
712     case MVE_VMULLBs16:
713     case MVE_VMULLBs32:
714     case MVE_VMULLBs8:
715     case MVE_VMULLBu16:
716     case MVE_VMULLBu32:
717     case MVE_VMULLBu8:
718     case MVE_VMULLTp16:
719     case MVE_VMULLTp8:
720     case MVE_VMULLTs16:
721     case MVE_VMULLTs32:
722     case MVE_VMULLTs8:
723     case MVE_VMULLTu16:
724     case MVE_VMULLTu32:
725     case MVE_VMULLTu8:
726     case MVE_VMUL_qr_f16:
727     case MVE_VMUL_qr_f32:
728     case MVE_VMUL_qr_i16:
729     case MVE_VMUL_qr_i32:
730     case MVE_VMUL_qr_i8:
731     case MVE_VMULf16:
732     case MVE_VMULf32:
733     case MVE_VMULi16:
734     case MVE_VMULi8:
735     case MVE_VMULi32:
736     case MVE_VMULHs32:
737     case MVE_VMULHs16:
738     case MVE_VMULHs8:
739     case MVE_VMULHu32:
740     case MVE_VMULHu16:
741     case MVE_VMULHu8:
742     case MVE_VMVN:
743     case MVE_VMVNimmi16:
744     case MVE_VMVNimmi32:
745     case MVE_VNEGf16:
746     case MVE_VNEGf32:
747     case MVE_VNEGs16:
748     case MVE_VNEGs32:
749     case MVE_VNEGs8:
750     case MVE_VORN:
751     case MVE_VORR:
752     case MVE_VORRimmi16:
753     case MVE_VORRimmi32:
754     case MVE_VPST:
755     case MVE_VPTv16i8:
756     case MVE_VPTv8i16:
757     case MVE_VPTv4i32:
758     case MVE_VPTv16i8r:
759     case MVE_VPTv8i16r:
760     case MVE_VPTv4i32r:
761     case MVE_VPTv16s8:
762     case MVE_VPTv8s16:
763     case MVE_VPTv4s32:
764     case MVE_VPTv16s8r:
765     case MVE_VPTv8s16r:
766     case MVE_VPTv4s32r:
767     case MVE_VPTv16u8:
768     case MVE_VPTv8u16:
769     case MVE_VPTv4u32:
770     case MVE_VPTv16u8r:
771     case MVE_VPTv8u16r:
772     case MVE_VPTv4u32r:
773     case MVE_VPTv8f16:
774     case MVE_VPTv4f32:
775     case MVE_VPTv8f16r:
776     case MVE_VPTv4f32r:
777     case MVE_VQABSs16:
778     case MVE_VQABSs32:
779     case MVE_VQABSs8:
780     case MVE_VQADD_qr_s16:
781     case MVE_VQADD_qr_s32:
782     case MVE_VQADD_qr_s8:
783     case MVE_VQADD_qr_u16:
784     case MVE_VQADD_qr_u32:
785     case MVE_VQADD_qr_u8:
786     case MVE_VQADDs16:
787     case MVE_VQADDs32:
788     case MVE_VQADDs8:
789     case MVE_VQADDu16:
790     case MVE_VQADDu32:
791     case MVE_VQADDu8:
792     case MVE_VQDMULH_qr_s16:
793     case MVE_VQDMULH_qr_s32:
794     case MVE_VQDMULH_qr_s8:
795     case MVE_VQDMULHi16:
796     case MVE_VQDMULHi32:
797     case MVE_VQDMULHi8:
798     case MVE_VQDMULL_qr_s16bh:
799     case MVE_VQDMULL_qr_s16th:
800     case MVE_VQDMULL_qr_s32bh:
801     case MVE_VQDMULL_qr_s32th:
802     case MVE_VQDMULLs16bh:
803     case MVE_VQDMULLs16th:
804     case MVE_VQDMULLs32bh:
805     case MVE_VQDMULLs32th:
806     case MVE_VQRDMULH_qr_s16:
807     case MVE_VQRDMULH_qr_s32:
808     case MVE_VQRDMULH_qr_s8:
809     case MVE_VQRDMULHi16:
810     case MVE_VQRDMULHi32:
811     case MVE_VQRDMULHi8:
812     case MVE_VQNEGs16:
813     case MVE_VQNEGs32:
814     case MVE_VQNEGs8:
815     case MVE_VQMOVNs16bh:
816     case MVE_VQMOVNs16th:
817     case MVE_VQMOVNs32bh:
818     case MVE_VQMOVNs32th:
819     case MVE_VQMOVNu16bh:
820     case MVE_VQMOVNu16th:
821     case MVE_VQMOVNu32bh:
822     case MVE_VQMOVNu32th:
823     case MVE_VQMOVUNs16bh:
824     case MVE_VQMOVUNs16th:
825     case MVE_VQMOVUNs32bh:
826     case MVE_VQMOVUNs32th:
827     case MVE_VQRSHL_by_vecs16:
828     case MVE_VQRSHL_by_vecs32:
829     case MVE_VQRSHL_by_vecs8:
830     case MVE_VQRSHL_by_vecu16:
831     case MVE_VQRSHL_by_vecu32:
832     case MVE_VQRSHL_by_vecu8:
833     case MVE_VQRSHL_qrs16:
834     case MVE_VQRSHL_qrs32:
835     case MVE_VQRSHL_qrs8:
836     case MVE_VQRSHL_qru16:
837     case MVE_VQRSHL_qru8:
838     case MVE_VQRSHL_qru32:
839     case MVE_VQSHLU_imms16:
840     case MVE_VQSHLU_imms32:
841     case MVE_VQSHLU_imms8:
842     case MVE_VQSHLimms16:
843     case MVE_VQSHLimms32:
844     case MVE_VQSHLimms8:
845     case MVE_VQSHLimmu16:
846     case MVE_VQSHLimmu32:
847     case MVE_VQSHLimmu8:
848     case MVE_VQSHL_by_vecs16:
849     case MVE_VQSHL_by_vecs32:
850     case MVE_VQSHL_by_vecs8:
851     case MVE_VQSHL_by_vecu16:
852     case MVE_VQSHL_by_vecu32:
853     case MVE_VQSHL_by_vecu8:
854     case MVE_VQSHL_qrs16:
855     case MVE_VQSHL_qrs32:
856     case MVE_VQSHL_qrs8:
857     case MVE_VQSHL_qru16:
858     case MVE_VQSHL_qru32:
859     case MVE_VQSHL_qru8:
860     case MVE_VQRSHRNbhs16:
861     case MVE_VQRSHRNbhs32:
862     case MVE_VQRSHRNbhu16:
863     case MVE_VQRSHRNbhu32:
864     case MVE_VQRSHRNths16:
865     case MVE_VQRSHRNths32:
866     case MVE_VQRSHRNthu16:
867     case MVE_VQRSHRNthu32:
868     case MVE_VQRSHRUNs16bh:
869     case MVE_VQRSHRUNs16th:
870     case MVE_VQRSHRUNs32bh:
871     case MVE_VQRSHRUNs32th:
872     case MVE_VQSHRNbhs16:
873     case MVE_VQSHRNbhs32:
874     case MVE_VQSHRNbhu16:
875     case MVE_VQSHRNbhu32:
876     case MVE_VQSHRNths16:
877     case MVE_VQSHRNths32:
878     case MVE_VQSHRNthu16:
879     case MVE_VQSHRNthu32:
880     case MVE_VQSHRUNs16bh:
881     case MVE_VQSHRUNs16th:
882     case MVE_VQSHRUNs32bh:
883     case MVE_VQSHRUNs32th:
884     case MVE_VQSUB_qr_s16:
885     case MVE_VQSUB_qr_s32:
886     case MVE_VQSUB_qr_s8:
887     case MVE_VQSUB_qr_u16:
888     case MVE_VQSUB_qr_u32:
889     case MVE_VQSUB_qr_u8:
890     case MVE_VQSUBs16:
891     case MVE_VQSUBs32:
892     case MVE_VQSUBs8:
893     case MVE_VQSUBu16:
894     case MVE_VQSUBu32:
895     case MVE_VQSUBu8:
896     case MVE_VRHADDs16:
897     case MVE_VRHADDs32:
898     case MVE_VRHADDs8:
899     case MVE_VRHADDu16:
900     case MVE_VRHADDu32:
901     case MVE_VRHADDu8:
902     case MVE_VRINTf16A:
903     case MVE_VRINTf16M:
904     case MVE_VRINTf16N:
905     case MVE_VRINTf16P:
906     case MVE_VRINTf16X:
907     case MVE_VRINTf16Z:
908     case MVE_VRINTf32A:
909     case MVE_VRINTf32M:
910     case MVE_VRINTf32N:
911     case MVE_VRINTf32P:
912     case MVE_VRINTf32X:
913     case MVE_VRINTf32Z:
914     case MVE_VRMULHs32:
915     case MVE_VRMULHs16:
916     case MVE_VRMULHs8:
917     case MVE_VRMULHu32:
918     case MVE_VRMULHu16:
919     case MVE_VRMULHu8:
920     case MVE_VRSHL_by_vecs16:
921     case MVE_VRSHL_by_vecs32:
922     case MVE_VRSHL_by_vecs8:
923     case MVE_VRSHL_by_vecu16:
924     case MVE_VRSHL_by_vecu32:
925     case MVE_VRSHL_by_vecu8:
926     case MVE_VRSHL_qrs16:
927     case MVE_VRSHL_qrs32:
928     case MVE_VRSHL_qrs8:
929     case MVE_VRSHL_qru16:
930     case MVE_VRSHL_qru32:
931     case MVE_VRSHL_qru8:
932     case MVE_VRSHR_imms16:
933     case MVE_VRSHR_imms32:
934     case MVE_VRSHR_imms8:
935     case MVE_VRSHR_immu16:
936     case MVE_VRSHR_immu32:
937     case MVE_VRSHR_immu8:
938     case MVE_VRSHRNi16bh:
939     case MVE_VRSHRNi16th:
940     case MVE_VRSHRNi32bh:
941     case MVE_VRSHRNi32th:
942     case MVE_VSHL_by_vecs16:
943     case MVE_VSHL_by_vecs32:
944     case MVE_VSHL_by_vecs8:
945     case MVE_VSHL_by_vecu16:
946     case MVE_VSHL_by_vecu32:
947     case MVE_VSHL_by_vecu8:
948     case MVE_VSHL_immi16:
949     case MVE_VSHL_immi32:
950     case MVE_VSHL_immi8:
951     case MVE_VSHL_qrs16:
952     case MVE_VSHL_qrs32:
953     case MVE_VSHL_qrs8:
954     case MVE_VSHL_qru16:
955     case MVE_VSHL_qru32:
956     case MVE_VSHL_qru8:
957     case MVE_VSHR_imms16:
958     case MVE_VSHR_imms32:
959     case MVE_VSHR_imms8:
960     case MVE_VSHR_immu16:
961     case MVE_VSHR_immu32:
962     case MVE_VSHR_immu8:
963     case MVE_VSHRNi16bh:
964     case MVE_VSHRNi16th:
965     case MVE_VSHRNi32bh:
966     case MVE_VSHRNi32th:
967     case MVE_VSLIimm16:
968     case MVE_VSLIimm32:
969     case MVE_VSLIimm8:
970     case MVE_VSRIimm16:
971     case MVE_VSRIimm32:
972     case MVE_VSRIimm8:
973     case MVE_VSTRB16:
974     case MVE_VSTRB16_post:
975     case MVE_VSTRB16_pre:
976     case MVE_VSTRB16_rq:
977     case MVE_VSTRB32:
978     case MVE_VSTRB32_post:
979     case MVE_VSTRB32_pre:
980     case MVE_VSTRB32_rq:
981     case MVE_VSTRB8_rq:
982     case MVE_VSTRBU8:
983     case MVE_VSTRBU8_post:
984     case MVE_VSTRBU8_pre:
985     case MVE_VSTRD64_qi:
986     case MVE_VSTRD64_qi_pre:
987     case MVE_VSTRD64_rq:
988     case MVE_VSTRD64_rq_u:
989     case MVE_VSTRH16_rq:
990     case MVE_VSTRH16_rq_u:
991     case MVE_VSTRH32:
992     case MVE_VSTRH32_post:
993     case MVE_VSTRH32_pre:
994     case MVE_VSTRH32_rq:
995     case MVE_VSTRH32_rq_u:
996     case MVE_VSTRHU16:
997     case MVE_VSTRHU16_post:
998     case MVE_VSTRHU16_pre:
999     case MVE_VSTRW32_qi:
1000     case MVE_VSTRW32_qi_pre:
1001     case MVE_VSTRW32_rq:
1002     case MVE_VSTRW32_rq_u:
1003     case MVE_VSTRWU32:
1004     case MVE_VSTRWU32_post:
1005     case MVE_VSTRWU32_pre:
1006     case MVE_VSUB_qr_f16:
1007     case MVE_VSUB_qr_f32:
1008     case MVE_VSUB_qr_i16:
1009     case MVE_VSUB_qr_i32:
1010     case MVE_VSUB_qr_i8:
1011     case MVE_VSUBf16:
1012     case MVE_VSUBf32:
1013     case MVE_VSUBi16:
1014     case MVE_VSUBi32:
1015     case MVE_VSUBi8:
1016     case VLDR_P0_off:
1017     case VLDR_P0_post:
1018     case VLDR_P0_pre:
1019     case VLDR_VPR_off:
1020     case VLDR_VPR_post:
1021     case VLDR_VPR_pre:
1022     case VSTR_P0_off:
1023     case VSTR_P0_post:
1024     case VSTR_P0_pre:
1025     case VSTR_VPR_off:
1026     case VSTR_VPR_post:
1027     case VSTR_VPR_pre:
1028     case VMRS_P0:
1029     case VMRS_VPR:
1030       return true;
1031     }
1032   };
1033 
1034   LLVMInitializeARMTargetInfo();
1035   LLVMInitializeARMTarget();
1036   LLVMInitializeARMTargetMC();
1037 
1038   auto TT(Triple::normalize("thumbv8.1m.main-none-none-eabi"));
1039   std::string Error;
1040   const Target *T = TargetRegistry::lookupTarget(TT, Error);
1041   if (!T) {
1042     dbgs() << Error;
1043     GTEST_SKIP();
1044   }
1045 
1046   TargetOptions Options;
1047   auto TM = std::unique_ptr<TargetMachine>(
1048       T->createTargetMachine(TT, "generic", "", Options, std::nullopt,
1049                              std::nullopt, CodeGenOptLevel::Default));
1050   ARMSubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
1051                   std::string(TM->getTargetFeatureString()),
1052                   *static_cast<const ARMBaseTargetMachine *>(TM.get()), false);
1053 
1054   auto MII = TM->getMCInstrInfo();
1055   for (unsigned i = 0; i < ARM::INSTRUCTION_LIST_END; ++i) {
1056     uint64_t Flags = MII->get(i).TSFlags;
1057     if ((Flags & ARMII::DomainMask) != ARMII::DomainMVE)
1058       continue;
1059     bool Valid = (Flags & ARMII::ValidForTailPredication) != 0;
1060     ASSERT_EQ(IsValidTPOpcode(i), Valid)
1061               << MII->getName(i)
1062               << ": mismatched expectation for tail-predicated safety\n";
1063   }
1064 }
1065 
1066 TEST(MachineInstr, HasSideEffects) {
1067   using namespace ARM;
1068   std::set<unsigned> UnpredictableOpcodes = {
1069       // MVE Instructions
1070       MVE_VCTP8,
1071       MVE_VCTP16,
1072       MVE_VCTP32,
1073       MVE_VCTP64,
1074       MVE_VPST,
1075       MVE_VPTv16i8,
1076       MVE_VPTv8i16,
1077       MVE_VPTv4i32,
1078       MVE_VPTv16i8r,
1079       MVE_VPTv8i16r,
1080       MVE_VPTv4i32r,
1081       MVE_VPTv16s8,
1082       MVE_VPTv8s16,
1083       MVE_VPTv4s32,
1084       MVE_VPTv16s8r,
1085       MVE_VPTv8s16r,
1086       MVE_VPTv4s32r,
1087       MVE_VPTv16u8,
1088       MVE_VPTv8u16,
1089       MVE_VPTv4u32,
1090       MVE_VPTv16u8r,
1091       MVE_VPTv8u16r,
1092       MVE_VPTv4u32r,
1093       MVE_VPTv8f16,
1094       MVE_VPTv4f32,
1095       MVE_VPTv8f16r,
1096       MVE_VPTv4f32r,
1097       MVE_VADC,
1098       MVE_VADCI,
1099       MVE_VSBC,
1100       MVE_VSBCI,
1101       MVE_VSHLC,
1102       // FP Instructions
1103       FLDMXIA,
1104       FLDMXDB_UPD,
1105       FLDMXIA_UPD,
1106       FSTMXDB_UPD,
1107       FSTMXIA,
1108       FSTMXIA_UPD,
1109       VLDR_FPCXTNS_off,
1110       VLDR_FPCXTNS_off,
1111       VLDR_FPCXTNS_post,
1112       VLDR_FPCXTNS_pre,
1113       VLDR_FPCXTS_off,
1114       VLDR_FPCXTS_post,
1115       VLDR_FPCXTS_pre,
1116       VLDR_FPSCR_NZCVQC_off,
1117       VLDR_FPSCR_NZCVQC_post,
1118       VLDR_FPSCR_NZCVQC_pre,
1119       VLDR_FPSCR_off,
1120       VLDR_FPSCR_post,
1121       VLDR_FPSCR_pre,
1122       VLDR_P0_off,
1123       VLDR_P0_post,
1124       VLDR_P0_pre,
1125       VLDR_VPR_off,
1126       VLDR_VPR_post,
1127       VLDR_VPR_pre,
1128       VLLDM,
1129       VLLDM_T2,
1130       VLSTM,
1131       VLSTM_T2,
1132       VMRS,
1133       VMRS_FPCXTNS,
1134       VMRS_FPCXTS,
1135       VMRS_FPEXC,
1136       VMRS_FPINST,
1137       VMRS_FPINST2,
1138       VMRS_FPSCR_NZCVQC,
1139       VMRS_FPSID,
1140       VMRS_MVFR0,
1141       VMRS_MVFR1,
1142       VMRS_MVFR2,
1143       VMRS_P0,
1144       VMRS_VPR,
1145       VMSR,
1146       VMSR_FPCXTNS,
1147       VMSR_FPCXTS,
1148       VMSR_FPEXC,
1149       VMSR_FPINST,
1150       VMSR_FPINST2,
1151       VMSR_FPSCR_NZCVQC,
1152       VMSR_FPSID,
1153       VMSR_P0,
1154       VMSR_VPR,
1155       VSCCLRMD,
1156       VSCCLRMS,
1157       VSTR_FPCXTNS_off,
1158       VSTR_FPCXTNS_post,
1159       VSTR_FPCXTNS_pre,
1160       VSTR_FPCXTS_off,
1161       VSTR_FPCXTS_post,
1162       VSTR_FPCXTS_pre,
1163       VSTR_FPSCR_NZCVQC_off,
1164       VSTR_FPSCR_NZCVQC_post,
1165       VSTR_FPSCR_NZCVQC_pre,
1166       VSTR_FPSCR_off,
1167       VSTR_FPSCR_post,
1168       VSTR_FPSCR_pre,
1169       VSTR_P0_off,
1170       VSTR_P0_post,
1171       VSTR_P0_pre,
1172       VSTR_VPR_off,
1173       VSTR_VPR_post,
1174       VSTR_VPR_pre,
1175   };
1176 
1177   LLVMInitializeARMTargetInfo();
1178   LLVMInitializeARMTarget();
1179   LLVMInitializeARMTargetMC();
1180 
1181   auto TT(Triple::normalize("thumbv8.1m.main-none-none-eabi"));
1182   std::string Error;
1183   const Target *T = TargetRegistry::lookupTarget(TT, Error);
1184   if (!T) {
1185     dbgs() << Error;
1186     GTEST_SKIP();
1187   }
1188 
1189   TargetOptions Options;
1190   auto TM = std::unique_ptr<TargetMachine>(
1191       T->createTargetMachine(TT, "generic", "", Options, std::nullopt,
1192                              std::nullopt, CodeGenOptLevel::Default));
1193   ARMSubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
1194                   std::string(TM->getTargetFeatureString()),
1195                   *static_cast<const ARMBaseTargetMachine *>(TM.get()), false);
1196   const ARMBaseInstrInfo *TII = ST.getInstrInfo();
1197   auto MII = TM->getMCInstrInfo();
1198 
1199   for (unsigned Op = 0; Op < ARM::INSTRUCTION_LIST_END; ++Op) {
1200     const MCInstrDesc &Desc = TII->get(Op);
1201     if ((Desc.TSFlags &
1202          (ARMII::DomainMVE | ARMII::DomainVFP | ARMII::DomainNEONA8)) == 0)
1203       continue;
1204     if (UnpredictableOpcodes.count(Op))
1205       continue;
1206 
1207     ASSERT_FALSE(Desc.hasUnmodeledSideEffects())
1208         << MII->getName(Op) << " has unexpected side effects";
1209   }
1210 }
1211 
1212 TEST(MachineInstr, MVEVecSize) {
1213   using namespace ARM;
1214   auto MVEVecSize = [](unsigned Opcode) {
1215     switch (Opcode) {
1216     default:
1217     dbgs() << Opcode << "\n";
1218       llvm_unreachable("Unexpected MVE instruction!");
1219     case MVE_ASRLi:
1220     case MVE_ASRLr:
1221     case MVE_LSLLi:
1222     case MVE_LSLLr:
1223     case MVE_LSRL:
1224     case MVE_SQRSHR:
1225     case MVE_SQRSHRL:
1226     case MVE_SQSHL:
1227     case MVE_SQSHLL:
1228     case MVE_SRSHR:
1229     case MVE_SRSHRL:
1230     case MVE_UQRSHL:
1231     case MVE_UQRSHLL:
1232     case MVE_UQSHL:
1233     case MVE_UQSHLL:
1234     case MVE_URSHR:
1235     case MVE_URSHRL:
1236     case MVE_VABAVs8:
1237     case MVE_VABAVu8:
1238     case MVE_VABDs8:
1239     case MVE_VABDu8:
1240     case MVE_VABSs8:
1241     case MVE_VADDVs8acc:
1242     case MVE_VADDVs8no_acc:
1243     case MVE_VADDVu8acc:
1244     case MVE_VADDVu8no_acc:
1245     case MVE_VADD_qr_i8:
1246     case MVE_VADDi8:
1247     case MVE_VBRSR8:
1248     case MVE_VCADDi8:
1249     case MVE_VCLSs8:
1250     case MVE_VCLZs8:
1251     case MVE_VCMPi8:
1252     case MVE_VCMPi8r:
1253     case MVE_VCMPs8:
1254     case MVE_VCMPs8r:
1255     case MVE_VCMPu8:
1256     case MVE_VCMPu8r:
1257     case MVE_VCTP8:
1258     case MVE_VDDUPu8:
1259     case MVE_VDUP8:
1260     case MVE_VDWDUPu8:
1261     case MVE_VHADD_qr_s8:
1262     case MVE_VHADD_qr_u8:
1263     case MVE_VHADDs8:
1264     case MVE_VHADDu8:
1265     case MVE_VHCADDs8:
1266     case MVE_VHSUB_qr_s8:
1267     case MVE_VHSUB_qr_u8:
1268     case MVE_VHSUBs8:
1269     case MVE_VHSUBu8:
1270     case MVE_VIDUPu8:
1271     case MVE_VIWDUPu8:
1272     case MVE_VLD20_8:
1273     case MVE_VLD20_8_wb:
1274     case MVE_VLD21_8:
1275     case MVE_VLD21_8_wb:
1276     case MVE_VLD40_8:
1277     case MVE_VLD40_8_wb:
1278     case MVE_VLD41_8:
1279     case MVE_VLD41_8_wb:
1280     case MVE_VLD42_8:
1281     case MVE_VLD42_8_wb:
1282     case MVE_VLD43_8:
1283     case MVE_VLD43_8_wb:
1284     case MVE_VLDRBU8:
1285     case MVE_VLDRBU8_post:
1286     case MVE_VLDRBU8_pre:
1287     case MVE_VLDRBU8_rq:
1288     case MVE_VMAXAVs8:
1289     case MVE_VMAXAs8:
1290     case MVE_VMAXVs8:
1291     case MVE_VMAXVu8:
1292     case MVE_VMAXs8:
1293     case MVE_VMAXu8:
1294     case MVE_VMINAVs8:
1295     case MVE_VMINAs8:
1296     case MVE_VMINVs8:
1297     case MVE_VMINVu8:
1298     case MVE_VMINs8:
1299     case MVE_VMINu8:
1300     case MVE_VMLADAVas8:
1301     case MVE_VMLADAVau8:
1302     case MVE_VMLADAVaxs8:
1303     case MVE_VMLADAVs8:
1304     case MVE_VMLADAVu8:
1305     case MVE_VMLADAVxs8:
1306     case MVE_VMLAS_qr_i8:
1307     case MVE_VMLA_qr_i8:
1308     case MVE_VMLSDAVas8:
1309     case MVE_VMLSDAVaxs8:
1310     case MVE_VMLSDAVs8:
1311     case MVE_VMLSDAVxs8:
1312     case MVE_VMOV_from_lane_s8:
1313     case MVE_VMOV_from_lane_u8:
1314     case MVE_VMOV_to_lane_8:
1315     case MVE_VMOVimmi8:
1316     case MVE_VMULHs8:
1317     case MVE_VMULHu8:
1318     case MVE_VMUL_qr_i8:
1319     case MVE_VMULi8:
1320     case MVE_VNEGs8:
1321     case MVE_VPTv16i8:
1322     case MVE_VPTv16i8r:
1323     case MVE_VPTv16s8:
1324     case MVE_VPTv16s8r:
1325     case MVE_VPTv16u8:
1326     case MVE_VPTv16u8r:
1327     case MVE_VQABSs8:
1328     case MVE_VQADD_qr_s8:
1329     case MVE_VQADD_qr_u8:
1330     case MVE_VQADDs8:
1331     case MVE_VQADDu8:
1332     case MVE_VQDMLADHXs8:
1333     case MVE_VQDMLADHs8:
1334     case MVE_VQDMLAH_qrs8:
1335     case MVE_VQDMLASH_qrs8:
1336     case MVE_VQDMLSDHXs8:
1337     case MVE_VQDMLSDHs8:
1338     case MVE_VQDMULH_qr_s8:
1339     case MVE_VQDMULHi8:
1340     case MVE_VQNEGs8:
1341     case MVE_VQRDMLADHXs8:
1342     case MVE_VQRDMLADHs8:
1343     case MVE_VQRDMLAH_qrs8:
1344     case MVE_VQRDMLASH_qrs8:
1345     case MVE_VQRDMLSDHXs8:
1346     case MVE_VQRDMLSDHs8:
1347     case MVE_VQRDMULH_qr_s8:
1348     case MVE_VQRDMULHi8:
1349     case MVE_VQRSHL_by_vecs8:
1350     case MVE_VQRSHL_by_vecu8:
1351     case MVE_VQRSHL_qrs8:
1352     case MVE_VQRSHL_qru8:
1353     case MVE_VQSHLU_imms8:
1354     case MVE_VQSHL_by_vecs8:
1355     case MVE_VQSHL_by_vecu8:
1356     case MVE_VQSHL_qrs8:
1357     case MVE_VQSHL_qru8:
1358     case MVE_VQSHLimms8:
1359     case MVE_VQSHLimmu8:
1360     case MVE_VQSUB_qr_s8:
1361     case MVE_VQSUB_qr_u8:
1362     case MVE_VQSUBs8:
1363     case MVE_VQSUBu8:
1364     case MVE_VRHADDs8:
1365     case MVE_VRHADDu8:
1366     case MVE_VRMULHs8:
1367     case MVE_VRMULHu8:
1368     case MVE_VRSHL_by_vecs8:
1369     case MVE_VRSHL_by_vecu8:
1370     case MVE_VRSHL_qrs8:
1371     case MVE_VRSHL_qru8:
1372     case MVE_VRSHR_imms8:
1373     case MVE_VRSHR_immu8:
1374     case MVE_VSHL_by_vecs8:
1375     case MVE_VSHL_by_vecu8:
1376     case MVE_VSHL_immi8:
1377     case MVE_VSHL_qru8:
1378     case MVE_VSHL_qrs8:
1379     case MVE_VSHR_imms8:
1380     case MVE_VSHR_immu8:
1381     case MVE_VSLIimm8:
1382     case MVE_VSRIimm8:
1383     case MVE_VST20_8:
1384     case MVE_VST20_8_wb:
1385     case MVE_VST21_8:
1386     case MVE_VST21_8_wb:
1387     case MVE_VST40_8:
1388     case MVE_VST40_8_wb:
1389     case MVE_VST41_8:
1390     case MVE_VST41_8_wb:
1391     case MVE_VST42_8:
1392     case MVE_VST42_8_wb:
1393     case MVE_VST43_8:
1394     case MVE_VST43_8_wb:
1395     case MVE_VSTRB8_rq:
1396     case MVE_VSTRBU8:
1397     case MVE_VSTRBU8_post:
1398     case MVE_VSTRBU8_pre:
1399     case MVE_VSUB_qr_i8:
1400     case MVE_VSUBi8:
1401     case MVE_VAND:
1402     case MVE_VBIC:
1403     case MVE_VEOR:
1404     case MVE_VMVN:
1405     case MVE_VORN:
1406     case MVE_VORR:
1407     case MVE_VPNOT:
1408     case MVE_VPSEL:
1409     case MVE_VPST:
1410     case MQPRCopy:
1411       return 0;
1412     case MVE_VABAVs16:
1413     case MVE_VABAVu16:
1414     case MVE_VABDf16:
1415     case MVE_VABDs16:
1416     case MVE_VABDu16:
1417     case MVE_VABSf16:
1418     case MVE_VABSs16:
1419     case MVE_VADDVs16acc:
1420     case MVE_VADDVs16no_acc:
1421     case MVE_VADDVu16acc:
1422     case MVE_VADDVu16no_acc:
1423     case MVE_VADD_qr_f16:
1424     case MVE_VADD_qr_i16:
1425     case MVE_VADDf16:
1426     case MVE_VADDi16:
1427     case MVE_VBICimmi16:
1428     case MVE_VBRSR16:
1429     case MVE_VCADDf16:
1430     case MVE_VCADDi16:
1431     case MVE_VCLSs16:
1432     case MVE_VCLZs16:
1433     case MVE_VCMLAf16:
1434     case MVE_VCMPf16:
1435     case MVE_VCMPf16r:
1436     case MVE_VCMPi16:
1437     case MVE_VCMPi16r:
1438     case MVE_VCMPs16:
1439     case MVE_VCMPs16r:
1440     case MVE_VCMPu16:
1441     case MVE_VCMPu16r:
1442     case MVE_VCMULf16:
1443     case MVE_VCTP16:
1444     case MVE_VCVTf16s16_fix:
1445     case MVE_VCVTf16s16n:
1446     case MVE_VCVTf16u16_fix:
1447     case MVE_VCVTf16u16n:
1448     case MVE_VCVTs16f16_fix:
1449     case MVE_VCVTs16f16a:
1450     case MVE_VCVTs16f16m:
1451     case MVE_VCVTs16f16n:
1452     case MVE_VCVTs16f16p:
1453     case MVE_VCVTs16f16z:
1454     case MVE_VCVTu16f16_fix:
1455     case MVE_VCVTu16f16a:
1456     case MVE_VCVTu16f16m:
1457     case MVE_VCVTu16f16n:
1458     case MVE_VCVTu16f16p:
1459     case MVE_VCVTu16f16z:
1460     case MVE_VDDUPu16:
1461     case MVE_VDUP16:
1462     case MVE_VDWDUPu16:
1463     case MVE_VFMA_qr_Sf16:
1464     case MVE_VFMA_qr_f16:
1465     case MVE_VFMAf16:
1466     case MVE_VFMSf16:
1467     case MVE_VHADD_qr_s16:
1468     case MVE_VHADD_qr_u16:
1469     case MVE_VHADDs16:
1470     case MVE_VHADDu16:
1471     case MVE_VHCADDs16:
1472     case MVE_VHSUB_qr_s16:
1473     case MVE_VHSUB_qr_u16:
1474     case MVE_VHSUBs16:
1475     case MVE_VHSUBu16:
1476     case MVE_VIDUPu16:
1477     case MVE_VIWDUPu16:
1478     case MVE_VLD20_16:
1479     case MVE_VLD20_16_wb:
1480     case MVE_VLD21_16:
1481     case MVE_VLD21_16_wb:
1482     case MVE_VLD40_16:
1483     case MVE_VLD40_16_wb:
1484     case MVE_VLD41_16:
1485     case MVE_VLD41_16_wb:
1486     case MVE_VLD42_16:
1487     case MVE_VLD42_16_wb:
1488     case MVE_VLD43_16:
1489     case MVE_VLD43_16_wb:
1490     case MVE_VLDRBS16:
1491     case MVE_VLDRBS16_post:
1492     case MVE_VLDRBS16_pre:
1493     case MVE_VLDRBS16_rq:
1494     case MVE_VLDRBU16:
1495     case MVE_VLDRBU16_post:
1496     case MVE_VLDRBU16_pre:
1497     case MVE_VLDRBU16_rq:
1498     case MVE_VLDRHU16:
1499     case MVE_VLDRHU16_post:
1500     case MVE_VLDRHU16_pre:
1501     case MVE_VLDRHU16_rq:
1502     case MVE_VLDRHU16_rq_u:
1503     case MVE_VMAXAVs16:
1504     case MVE_VMAXAs16:
1505     case MVE_VMAXNMAVf16:
1506     case MVE_VMAXNMAf16:
1507     case MVE_VMAXNMVf16:
1508     case MVE_VMAXNMf16:
1509     case MVE_VMAXVs16:
1510     case MVE_VMAXVu16:
1511     case MVE_VMAXs16:
1512     case MVE_VMAXu16:
1513     case MVE_VMINAVs16:
1514     case MVE_VMINAs16:
1515     case MVE_VMINNMAVf16:
1516     case MVE_VMINNMAf16:
1517     case MVE_VMINNMVf16:
1518     case MVE_VMINNMf16:
1519     case MVE_VMINVs16:
1520     case MVE_VMINVu16:
1521     case MVE_VMINs16:
1522     case MVE_VMINu16:
1523     case MVE_VMLADAVas16:
1524     case MVE_VMLADAVau16:
1525     case MVE_VMLADAVaxs16:
1526     case MVE_VMLADAVs16:
1527     case MVE_VMLADAVu16:
1528     case MVE_VMLADAVxs16:
1529     case MVE_VMLALDAVas16:
1530     case MVE_VMLALDAVau16:
1531     case MVE_VMLALDAVaxs16:
1532     case MVE_VMLALDAVs16:
1533     case MVE_VMLALDAVu16:
1534     case MVE_VMLALDAVxs16:
1535     case MVE_VMLAS_qr_i16:
1536     case MVE_VMLA_qr_i16:
1537     case MVE_VMLSDAVas16:
1538     case MVE_VMLSDAVaxs16:
1539     case MVE_VMLSDAVs16:
1540     case MVE_VMLSDAVxs16:
1541     case MVE_VMLSLDAVas16:
1542     case MVE_VMLSLDAVaxs16:
1543     case MVE_VMLSLDAVs16:
1544     case MVE_VMLSLDAVxs16:
1545     case MVE_VMOVNi16bh:
1546     case MVE_VMOVNi16th:
1547     case MVE_VMOV_from_lane_s16:
1548     case MVE_VMOV_from_lane_u16:
1549     case MVE_VMOV_to_lane_16:
1550     case MVE_VMOVimmi16:
1551     case MVE_VMOVLs8bh:
1552     case MVE_VMOVLs8th:
1553     case MVE_VMOVLu8bh:
1554     case MVE_VMOVLu8th:
1555     case MVE_VMULLBp8:
1556     case MVE_VMULLBs8:
1557     case MVE_VMULLBu8:
1558     case MVE_VMULLTp8:
1559     case MVE_VMULLTs8:
1560     case MVE_VMULLTu8:
1561     case MVE_VMULHs16:
1562     case MVE_VMULHu16:
1563     case MVE_VMUL_qr_f16:
1564     case MVE_VMUL_qr_i16:
1565     case MVE_VMULf16:
1566     case MVE_VMULi16:
1567     case MVE_VMVNimmi16:
1568     case MVE_VNEGf16:
1569     case MVE_VNEGs16:
1570     case MVE_VORRimmi16:
1571     case MVE_VPTv8f16:
1572     case MVE_VPTv8f16r:
1573     case MVE_VPTv8i16:
1574     case MVE_VPTv8i16r:
1575     case MVE_VPTv8s16:
1576     case MVE_VPTv8s16r:
1577     case MVE_VPTv8u16:
1578     case MVE_VPTv8u16r:
1579     case MVE_VQABSs16:
1580     case MVE_VQADD_qr_s16:
1581     case MVE_VQADD_qr_u16:
1582     case MVE_VQADDs16:
1583     case MVE_VQADDu16:
1584     case MVE_VQDMLADHXs16:
1585     case MVE_VQDMLADHs16:
1586     case MVE_VQDMLAH_qrs16:
1587     case MVE_VQDMLASH_qrs16:
1588     case MVE_VQDMLSDHXs16:
1589     case MVE_VQDMLSDHs16:
1590     case MVE_VQDMULH_qr_s16:
1591     case MVE_VQDMULHi16:
1592     case MVE_VQDMULL_qr_s16bh:
1593     case MVE_VQDMULL_qr_s16th:
1594     case MVE_VQDMULLs16bh:
1595     case MVE_VQDMULLs16th:
1596     case MVE_VQMOVNs16bh:
1597     case MVE_VQMOVNs16th:
1598     case MVE_VQMOVNu16bh:
1599     case MVE_VQMOVNu16th:
1600     case MVE_VQMOVUNs16bh:
1601     case MVE_VQMOVUNs16th:
1602     case MVE_VQNEGs16:
1603     case MVE_VQRDMLADHXs16:
1604     case MVE_VQRDMLADHs16:
1605     case MVE_VQRDMLAH_qrs16:
1606     case MVE_VQRDMLASH_qrs16:
1607     case MVE_VQRDMLSDHXs16:
1608     case MVE_VQRDMLSDHs16:
1609     case MVE_VQRDMULH_qr_s16:
1610     case MVE_VQRDMULHi16:
1611     case MVE_VQRSHL_by_vecs16:
1612     case MVE_VQRSHL_by_vecu16:
1613     case MVE_VQRSHL_qrs16:
1614     case MVE_VQRSHL_qru16:
1615     case MVE_VQRSHRNbhs16:
1616     case MVE_VQRSHRNbhu16:
1617     case MVE_VQRSHRNths16:
1618     case MVE_VQRSHRNthu16:
1619     case MVE_VQRSHRUNs16bh:
1620     case MVE_VQRSHRUNs16th:
1621     case MVE_VQSHLU_imms16:
1622     case MVE_VQSHL_by_vecs16:
1623     case MVE_VQSHL_by_vecu16:
1624     case MVE_VQSHL_qrs16:
1625     case MVE_VQSHL_qru16:
1626     case MVE_VQSHLimms16:
1627     case MVE_VQSHLimmu16:
1628     case MVE_VQSHRNbhs16:
1629     case MVE_VQSHRNbhu16:
1630     case MVE_VQSHRNths16:
1631     case MVE_VQSHRNthu16:
1632     case MVE_VQSHRUNs16bh:
1633     case MVE_VQSHRUNs16th:
1634     case MVE_VQSUB_qr_s16:
1635     case MVE_VQSUB_qr_u16:
1636     case MVE_VQSUBs16:
1637     case MVE_VQSUBu16:
1638     case MVE_VREV16_8:
1639     case MVE_VRHADDs16:
1640     case MVE_VRHADDu16:
1641     case MVE_VRINTf16A:
1642     case MVE_VRINTf16M:
1643     case MVE_VRINTf16N:
1644     case MVE_VRINTf16P:
1645     case MVE_VRINTf16X:
1646     case MVE_VRINTf16Z:
1647     case MVE_VRMULHs16:
1648     case MVE_VRMULHu16:
1649     case MVE_VRSHL_by_vecs16:
1650     case MVE_VRSHL_by_vecu16:
1651     case MVE_VRSHL_qrs16:
1652     case MVE_VRSHL_qru16:
1653     case MVE_VRSHRNi16bh:
1654     case MVE_VRSHRNi16th:
1655     case MVE_VRSHR_imms16:
1656     case MVE_VRSHR_immu16:
1657     case MVE_VSHLL_imms8bh:
1658     case MVE_VSHLL_imms8th:
1659     case MVE_VSHLL_immu8bh:
1660     case MVE_VSHLL_immu8th:
1661     case MVE_VSHLL_lws8bh:
1662     case MVE_VSHLL_lws8th:
1663     case MVE_VSHLL_lwu8bh:
1664     case MVE_VSHLL_lwu8th:
1665     case MVE_VSHL_by_vecs16:
1666     case MVE_VSHL_by_vecu16:
1667     case MVE_VSHL_immi16:
1668     case MVE_VSHL_qrs16:
1669     case MVE_VSHL_qru16:
1670     case MVE_VSHRNi16bh:
1671     case MVE_VSHRNi16th:
1672     case MVE_VSHR_imms16:
1673     case MVE_VSHR_immu16:
1674     case MVE_VSLIimm16:
1675     case MVE_VSRIimm16:
1676     case MVE_VST20_16:
1677     case MVE_VST20_16_wb:
1678     case MVE_VST21_16:
1679     case MVE_VST21_16_wb:
1680     case MVE_VST40_16:
1681     case MVE_VST40_16_wb:
1682     case MVE_VST41_16:
1683     case MVE_VST41_16_wb:
1684     case MVE_VST42_16:
1685     case MVE_VST42_16_wb:
1686     case MVE_VST43_16:
1687     case MVE_VST43_16_wb:
1688     case MVE_VSTRB16:
1689     case MVE_VSTRB16_post:
1690     case MVE_VSTRB16_pre:
1691     case MVE_VSTRB16_rq:
1692     case MVE_VSTRH16_rq:
1693     case MVE_VSTRH16_rq_u:
1694     case MVE_VSTRHU16:
1695     case MVE_VSTRHU16_post:
1696     case MVE_VSTRHU16_pre:
1697     case MVE_VSUB_qr_f16:
1698     case MVE_VSUB_qr_i16:
1699     case MVE_VSUBf16:
1700     case MVE_VSUBi16:
1701       return 1;
1702     case MVE_VABAVs32:
1703     case MVE_VABAVu32:
1704     case MVE_VABDf32:
1705     case MVE_VABDs32:
1706     case MVE_VABDu32:
1707     case MVE_VABSf32:
1708     case MVE_VABSs32:
1709     case MVE_VADC:
1710     case MVE_VADCI:
1711     case MVE_VADDLVs32acc:
1712     case MVE_VADDLVs32no_acc:
1713     case MVE_VADDLVu32acc:
1714     case MVE_VADDLVu32no_acc:
1715     case MVE_VADDVs32acc:
1716     case MVE_VADDVs32no_acc:
1717     case MVE_VADDVu32acc:
1718     case MVE_VADDVu32no_acc:
1719     case MVE_VADD_qr_f32:
1720     case MVE_VADD_qr_i32:
1721     case MVE_VADDf32:
1722     case MVE_VADDi32:
1723     case MVE_VBICimmi32:
1724     case MVE_VBRSR32:
1725     case MVE_VCADDf32:
1726     case MVE_VCADDi32:
1727     case MVE_VCLSs32:
1728     case MVE_VCLZs32:
1729     case MVE_VCMLAf32:
1730     case MVE_VCMPf32:
1731     case MVE_VCMPf32r:
1732     case MVE_VCMPi32:
1733     case MVE_VCMPi32r:
1734     case MVE_VCMPs32:
1735     case MVE_VCMPs32r:
1736     case MVE_VCMPu32:
1737     case MVE_VCMPu32r:
1738     case MVE_VCMULf32:
1739     case MVE_VCTP32:
1740     case MVE_VCVTf16f32bh:
1741     case MVE_VCVTf16f32th:
1742     case MVE_VCVTf32f16bh:
1743     case MVE_VCVTf32f16th:
1744     case MVE_VCVTf32s32_fix:
1745     case MVE_VCVTf32s32n:
1746     case MVE_VCVTf32u32_fix:
1747     case MVE_VCVTf32u32n:
1748     case MVE_VCVTs32f32_fix:
1749     case MVE_VCVTs32f32a:
1750     case MVE_VCVTs32f32m:
1751     case MVE_VCVTs32f32n:
1752     case MVE_VCVTs32f32p:
1753     case MVE_VCVTs32f32z:
1754     case MVE_VCVTu32f32_fix:
1755     case MVE_VCVTu32f32a:
1756     case MVE_VCVTu32f32m:
1757     case MVE_VCVTu32f32n:
1758     case MVE_VCVTu32f32p:
1759     case MVE_VCVTu32f32z:
1760     case MVE_VDDUPu32:
1761     case MVE_VDUP32:
1762     case MVE_VDWDUPu32:
1763     case MVE_VFMA_qr_Sf32:
1764     case MVE_VFMA_qr_f32:
1765     case MVE_VFMAf32:
1766     case MVE_VFMSf32:
1767     case MVE_VHADD_qr_s32:
1768     case MVE_VHADD_qr_u32:
1769     case MVE_VHADDs32:
1770     case MVE_VHADDu32:
1771     case MVE_VHCADDs32:
1772     case MVE_VHSUB_qr_s32:
1773     case MVE_VHSUB_qr_u32:
1774     case MVE_VHSUBs32:
1775     case MVE_VHSUBu32:
1776     case MVE_VIDUPu32:
1777     case MVE_VIWDUPu32:
1778     case MVE_VLD20_32:
1779     case MVE_VLD20_32_wb:
1780     case MVE_VLD21_32:
1781     case MVE_VLD21_32_wb:
1782     case MVE_VLD40_32:
1783     case MVE_VLD40_32_wb:
1784     case MVE_VLD41_32:
1785     case MVE_VLD41_32_wb:
1786     case MVE_VLD42_32:
1787     case MVE_VLD42_32_wb:
1788     case MVE_VLD43_32:
1789     case MVE_VLD43_32_wb:
1790     case MVE_VLDRBS32:
1791     case MVE_VLDRBS32_post:
1792     case MVE_VLDRBS32_pre:
1793     case MVE_VLDRBS32_rq:
1794     case MVE_VLDRBU32:
1795     case MVE_VLDRBU32_post:
1796     case MVE_VLDRBU32_pre:
1797     case MVE_VLDRBU32_rq:
1798     case MVE_VLDRHS32:
1799     case MVE_VLDRHS32_post:
1800     case MVE_VLDRHS32_pre:
1801     case MVE_VLDRHS32_rq:
1802     case MVE_VLDRHS32_rq_u:
1803     case MVE_VLDRHU32:
1804     case MVE_VLDRHU32_post:
1805     case MVE_VLDRHU32_pre:
1806     case MVE_VLDRHU32_rq:
1807     case MVE_VLDRHU32_rq_u:
1808     case MVE_VLDRWU32:
1809     case MVE_VLDRWU32_post:
1810     case MVE_VLDRWU32_pre:
1811     case MVE_VLDRWU32_qi:
1812     case MVE_VLDRWU32_qi_pre:
1813     case MVE_VLDRWU32_rq:
1814     case MVE_VLDRWU32_rq_u:
1815     case MVE_VMAXAVs32:
1816     case MVE_VMAXAs32:
1817     case MVE_VMAXNMAVf32:
1818     case MVE_VMAXNMAf32:
1819     case MVE_VMAXNMVf32:
1820     case MVE_VMAXNMf32:
1821     case MVE_VMAXVs32:
1822     case MVE_VMAXVu32:
1823     case MVE_VMAXs32:
1824     case MVE_VMAXu32:
1825     case MVE_VMINAVs32:
1826     case MVE_VMINAs32:
1827     case MVE_VMINNMAVf32:
1828     case MVE_VMINNMAf32:
1829     case MVE_VMINNMVf32:
1830     case MVE_VMINNMf32:
1831     case MVE_VMINVs32:
1832     case MVE_VMINVu32:
1833     case MVE_VMINs32:
1834     case MVE_VMINu32:
1835     case MVE_VMLADAVas32:
1836     case MVE_VMLADAVau32:
1837     case MVE_VMLADAVaxs32:
1838     case MVE_VMLADAVs32:
1839     case MVE_VMLADAVu32:
1840     case MVE_VMLADAVxs32:
1841     case MVE_VMLALDAVas32:
1842     case MVE_VMLALDAVau32:
1843     case MVE_VMLALDAVaxs32:
1844     case MVE_VMLALDAVs32:
1845     case MVE_VMLALDAVu32:
1846     case MVE_VMLALDAVxs32:
1847     case MVE_VMLAS_qr_i32:
1848     case MVE_VMLA_qr_i32:
1849     case MVE_VMLSDAVas32:
1850     case MVE_VMLSDAVaxs32:
1851     case MVE_VMLSDAVs32:
1852     case MVE_VMLSDAVxs32:
1853     case MVE_VMLSLDAVas32:
1854     case MVE_VMLSLDAVaxs32:
1855     case MVE_VMLSLDAVs32:
1856     case MVE_VMLSLDAVxs32:
1857     case MVE_VMOVNi32bh:
1858     case MVE_VMOVNi32th:
1859     case MVE_VMOV_from_lane_32:
1860     case MVE_VMOV_q_rr:
1861     case MVE_VMOV_rr_q:
1862     case MVE_VMOV_to_lane_32:
1863     case MVE_VMOVimmf32:
1864     case MVE_VMOVimmi32:
1865     case MVE_VMOVLs16bh:
1866     case MVE_VMOVLs16th:
1867     case MVE_VMOVLu16bh:
1868     case MVE_VMOVLu16th:
1869     case MVE_VMULHs32:
1870     case MVE_VMULHu32:
1871     case MVE_VMULLBp16:
1872     case MVE_VMULLBs16:
1873     case MVE_VMULLBu16:
1874     case MVE_VMULLTp16:
1875     case MVE_VMULLTs16:
1876     case MVE_VMULLTu16:
1877     case MVE_VMUL_qr_f32:
1878     case MVE_VMUL_qr_i32:
1879     case MVE_VMULf32:
1880     case MVE_VMULi32:
1881     case MVE_VMVNimmi32:
1882     case MVE_VNEGf32:
1883     case MVE_VNEGs32:
1884     case MVE_VORRimmi32:
1885     case MVE_VPTv4f32:
1886     case MVE_VPTv4f32r:
1887     case MVE_VPTv4i32:
1888     case MVE_VPTv4i32r:
1889     case MVE_VPTv4s32:
1890     case MVE_VPTv4s32r:
1891     case MVE_VPTv4u32:
1892     case MVE_VPTv4u32r:
1893     case MVE_VQABSs32:
1894     case MVE_VQADD_qr_s32:
1895     case MVE_VQADD_qr_u32:
1896     case MVE_VQADDs32:
1897     case MVE_VQADDu32:
1898     case MVE_VQDMLADHXs32:
1899     case MVE_VQDMLADHs32:
1900     case MVE_VQDMLAH_qrs32:
1901     case MVE_VQDMLASH_qrs32:
1902     case MVE_VQDMLSDHXs32:
1903     case MVE_VQDMLSDHs32:
1904     case MVE_VQDMULH_qr_s32:
1905     case MVE_VQDMULHi32:
1906     case MVE_VQDMULL_qr_s32bh:
1907     case MVE_VQDMULL_qr_s32th:
1908     case MVE_VQDMULLs32bh:
1909     case MVE_VQDMULLs32th:
1910     case MVE_VQMOVNs32bh:
1911     case MVE_VQMOVNs32th:
1912     case MVE_VQMOVNu32bh:
1913     case MVE_VQMOVNu32th:
1914     case MVE_VQMOVUNs32bh:
1915     case MVE_VQMOVUNs32th:
1916     case MVE_VQNEGs32:
1917     case MVE_VQRDMLADHXs32:
1918     case MVE_VQRDMLADHs32:
1919     case MVE_VQRDMLAH_qrs32:
1920     case MVE_VQRDMLASH_qrs32:
1921     case MVE_VQRDMLSDHXs32:
1922     case MVE_VQRDMLSDHs32:
1923     case MVE_VQRDMULH_qr_s32:
1924     case MVE_VQRDMULHi32:
1925     case MVE_VQRSHL_by_vecs32:
1926     case MVE_VQRSHL_by_vecu32:
1927     case MVE_VQRSHL_qrs32:
1928     case MVE_VQRSHL_qru32:
1929     case MVE_VQRSHRNbhs32:
1930     case MVE_VQRSHRNbhu32:
1931     case MVE_VQRSHRNths32:
1932     case MVE_VQRSHRNthu32:
1933     case MVE_VQRSHRUNs32bh:
1934     case MVE_VQRSHRUNs32th:
1935     case MVE_VQSHLU_imms32:
1936     case MVE_VQSHL_by_vecs32:
1937     case MVE_VQSHL_by_vecu32:
1938     case MVE_VQSHL_qrs32:
1939     case MVE_VQSHL_qru32:
1940     case MVE_VQSHLimms32:
1941     case MVE_VQSHLimmu32:
1942     case MVE_VQSHRNbhs32:
1943     case MVE_VQSHRNbhu32:
1944     case MVE_VQSHRNths32:
1945     case MVE_VQSHRNthu32:
1946     case MVE_VQSHRUNs32bh:
1947     case MVE_VQSHRUNs32th:
1948     case MVE_VQSUB_qr_s32:
1949     case MVE_VQSUB_qr_u32:
1950     case MVE_VQSUBs32:
1951     case MVE_VQSUBu32:
1952     case MVE_VREV32_16:
1953     case MVE_VREV32_8:
1954     case MVE_VRHADDs32:
1955     case MVE_VRHADDu32:
1956     case MVE_VRINTf32A:
1957     case MVE_VRINTf32M:
1958     case MVE_VRINTf32N:
1959     case MVE_VRINTf32P:
1960     case MVE_VRINTf32X:
1961     case MVE_VRINTf32Z:
1962     case MVE_VRMLALDAVHas32:
1963     case MVE_VRMLALDAVHau32:
1964     case MVE_VRMLALDAVHaxs32:
1965     case MVE_VRMLALDAVHs32:
1966     case MVE_VRMLALDAVHu32:
1967     case MVE_VRMLALDAVHxs32:
1968     case MVE_VRMLSLDAVHas32:
1969     case MVE_VRMLSLDAVHaxs32:
1970     case MVE_VRMLSLDAVHs32:
1971     case MVE_VRMLSLDAVHxs32:
1972     case MVE_VRMULHs32:
1973     case MVE_VRMULHu32:
1974     case MVE_VRSHL_by_vecs32:
1975     case MVE_VRSHL_by_vecu32:
1976     case MVE_VRSHL_qrs32:
1977     case MVE_VRSHL_qru32:
1978     case MVE_VRSHRNi32bh:
1979     case MVE_VRSHRNi32th:
1980     case MVE_VRSHR_imms32:
1981     case MVE_VRSHR_immu32:
1982     case MVE_VSBC:
1983     case MVE_VSBCI:
1984     case MVE_VSHLC:
1985     case MVE_VSHLL_imms16bh:
1986     case MVE_VSHLL_imms16th:
1987     case MVE_VSHLL_immu16bh:
1988     case MVE_VSHLL_immu16th:
1989     case MVE_VSHLL_lws16bh:
1990     case MVE_VSHLL_lws16th:
1991     case MVE_VSHLL_lwu16bh:
1992     case MVE_VSHLL_lwu16th:
1993     case MVE_VSHL_by_vecs32:
1994     case MVE_VSHL_by_vecu32:
1995     case MVE_VSHL_immi32:
1996     case MVE_VSHL_qrs32:
1997     case MVE_VSHL_qru32:
1998     case MVE_VSHRNi32bh:
1999     case MVE_VSHRNi32th:
2000     case MVE_VSHR_imms32:
2001     case MVE_VSHR_immu32:
2002     case MVE_VSLIimm32:
2003     case MVE_VSRIimm32:
2004     case MVE_VST20_32:
2005     case MVE_VST20_32_wb:
2006     case MVE_VST21_32:
2007     case MVE_VST21_32_wb:
2008     case MVE_VST40_32:
2009     case MVE_VST40_32_wb:
2010     case MVE_VST41_32:
2011     case MVE_VST41_32_wb:
2012     case MVE_VST42_32:
2013     case MVE_VST42_32_wb:
2014     case MVE_VST43_32:
2015     case MVE_VST43_32_wb:
2016     case MVE_VSTRB32:
2017     case MVE_VSTRB32_post:
2018     case MVE_VSTRB32_pre:
2019     case MVE_VSTRB32_rq:
2020     case MVE_VSTRH32:
2021     case MVE_VSTRH32_post:
2022     case MVE_VSTRH32_pre:
2023     case MVE_VSTRH32_rq:
2024     case MVE_VSTRH32_rq_u:
2025     case MVE_VSTRW32_qi:
2026     case MVE_VSTRW32_qi_pre:
2027     case MVE_VSTRW32_rq:
2028     case MVE_VSTRW32_rq_u:
2029     case MVE_VSTRWU32:
2030     case MVE_VSTRWU32_post:
2031     case MVE_VSTRWU32_pre:
2032     case MVE_VSUB_qr_f32:
2033     case MVE_VSUB_qr_i32:
2034     case MVE_VSUBf32:
2035     case MVE_VSUBi32:
2036       return 2;
2037     case MVE_VCTP64:
2038     case MVE_VLDRDU64_qi:
2039     case MVE_VLDRDU64_qi_pre:
2040     case MVE_VLDRDU64_rq:
2041     case MVE_VLDRDU64_rq_u:
2042     case MVE_VMULLBs32:
2043     case MVE_VMULLBu32:
2044     case MVE_VMULLTs32:
2045     case MVE_VMULLTu32:
2046     case MVE_VMOVimmi64:
2047     case MVE_VREV64_16:
2048     case MVE_VREV64_32:
2049     case MVE_VREV64_8:
2050     case MVE_VSTRD64_qi:
2051     case MVE_VSTRD64_qi_pre:
2052     case MVE_VSTRD64_rq:
2053     case MVE_VSTRD64_rq_u:
2054       return 3;
2055     }
2056   };
2057   LLVMInitializeARMTargetInfo();
2058   LLVMInitializeARMTarget();
2059   LLVMInitializeARMTargetMC();
2060 
2061   auto TT(Triple::normalize("thumbv8.1m.main-none-none-eabi"));
2062   std::string Error;
2063   const Target *T = TargetRegistry::lookupTarget(TT, Error);
2064   if (!T) {
2065     dbgs() << Error;
2066     GTEST_SKIP();
2067   }
2068 
2069   TargetOptions Options;
2070   auto TM = std::unique_ptr<TargetMachine>(
2071       T->createTargetMachine(TT, "generic", "", Options, std::nullopt,
2072                              std::nullopt, CodeGenOptLevel::Default));
2073   ARMSubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()),
2074                   std::string(TM->getTargetFeatureString()),
2075                   *static_cast<const ARMBaseTargetMachine *>(TM.get()), false);
2076 
2077   auto MII = TM->getMCInstrInfo();
2078   for (unsigned i = 0; i < ARM::INSTRUCTION_LIST_END; ++i) {
2079     uint64_t Flags = MII->get(i).TSFlags;
2080     if ((Flags & ARMII::DomainMask) != ARMII::DomainMVE)
2081       continue;
2082     int Size = (Flags & ARMII::VecSize) >> ARMII::VecSizeShift;
2083     ASSERT_EQ(MVEVecSize(i), Size)
2084               << MII->getName(i)
2085               << ": mismatched expectation for MVE vec size\n";
2086   }
2087 }
2088