• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015, VIXL authors
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 //   * Redistributions of source code must retain the above copyright notice,
8 //     this list of conditions and the following disclaimer.
9 //   * Redistributions in binary form must reproduce the above copyright notice,
10 //     this list of conditions and the following disclaimer in the documentation
11 //     and/or other materials provided with the distribution.
12 //   * Neither the name of ARM Limited nor the names of its contributors may be
13 //     used to endorse or promote products derived from this software without
14 //     specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 
27 extern "C" {
28 #include <stdint.h>
29 }
30 
31 #include <cassert>
32 #include <cstdio>
33 #include <cstdlib>
34 #include <cstring>
35 #include <iomanip>
36 #include <iostream>
37 
38 #include "utils-vixl.h"
39 #include "aarch32/constants-aarch32.h"
40 #include "aarch32/instructions-aarch32.h"
41 #include "aarch32/operands-aarch32.h"
42 #include "aarch32/disasm-aarch32.h"
43 
44 namespace vixl {
45 namespace aarch32 {
46 
47 class T32CodeAddressIncrementer {
48   uint32_t* code_address_;
49   uint32_t increment_;
50 
51  public:
T32CodeAddressIncrementer(uint32_t instr,uint32_t * code_address)52   T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
53       : code_address_(code_address),
54         increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
~T32CodeAddressIncrementer()55   ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
56 };
57 
58 class A32CodeAddressIncrementer {
59   uint32_t* code_address_;
60 
61  public:
A32CodeAddressIncrementer(uint32_t * code_address)62   explicit A32CodeAddressIncrementer(uint32_t* code_address)
63       : code_address_(code_address) {}
~A32CodeAddressIncrementer()64   ~A32CodeAddressIncrementer() { *code_address_ += 4; }
65 };
66 
67 class DecodeNeon {
68   int lane_;
69   SpacingType spacing_;
70   bool valid_;
71 
72  public:
DecodeNeon(int lane,SpacingType spacing)73   DecodeNeon(int lane, SpacingType spacing)
74       : lane_(lane), spacing_(spacing), valid_(true) {}
DecodeNeon()75   DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
GetLane() const76   int GetLane() const { return lane_; }
GetSpacing() const77   SpacingType GetSpacing() const { return spacing_; }
IsValid() const78   bool IsValid() const { return valid_; }
79 };
80 
81 class DecodeNeonAndAlign : public DecodeNeon {
82  public:
83   Alignment align_;
DecodeNeonAndAlign(int lanes,SpacingType spacing,Alignment align)84   DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
85       : DecodeNeon(lanes, spacing), align_(align) {}
DecodeNeonAndAlign()86   DecodeNeonAndAlign() : align_(kBadAlignment) {}
GetAlign() const87   Alignment GetAlign() const { return align_; }
88 };
89 
90 // Start of generated code.
Dt_L_imm6_1_Decode(uint32_t value,uint32_t type_value)91 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
92   if ((value & 0xf) == 0x1) {
93     switch (type_value) {
94       case 0x0:
95         return S8;
96       case 0x1:
97         return U8;
98     }
99   } else if ((value & 0xe) == 0x2) {
100     switch (type_value) {
101       case 0x0:
102         return S16;
103       case 0x1:
104         return U16;
105     }
106   } else if ((value & 0xc) == 0x4) {
107     switch (type_value) {
108       case 0x0:
109         return S32;
110       case 0x1:
111         return U32;
112     }
113   } else if ((value & 0x8) == 0x8) {
114     switch (type_value) {
115       case 0x0:
116         return S64;
117       case 0x1:
118         return U64;
119     }
120   }
121   return kDataTypeValueInvalid;
122 }
123 
Dt_L_imm6_2_Decode(uint32_t value,uint32_t type_value)124 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
125   if ((value & 0xf) == 0x1) {
126     if (type_value == 0x1) return S8;
127   } else if ((value & 0xe) == 0x2) {
128     if (type_value == 0x1) return S16;
129   } else if ((value & 0xc) == 0x4) {
130     if (type_value == 0x1) return S32;
131   } else if ((value & 0x8) == 0x8) {
132     if (type_value == 0x1) return S64;
133   }
134   return kDataTypeValueInvalid;
135 }
136 
Dt_L_imm6_3_Decode(uint32_t value)137 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
138   if ((value & 0xf) == 0x1) {
139     return I8;
140   } else if ((value & 0xe) == 0x2) {
141     return I16;
142   } else if ((value & 0xc) == 0x4) {
143     return I32;
144   } else if ((value & 0x8) == 0x8) {
145     return I64;
146   }
147   return kDataTypeValueInvalid;
148 }
149 
Dt_L_imm6_4_Decode(uint32_t value)150 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
151   if ((value & 0xf) == 0x1) {
152     return Untyped8;
153   } else if ((value & 0xe) == 0x2) {
154     return Untyped16;
155   } else if ((value & 0xc) == 0x4) {
156     return Untyped32;
157   } else if ((value & 0x8) == 0x8) {
158     return Untyped64;
159   }
160   return kDataTypeValueInvalid;
161 }
162 
Dt_imm6_1_Decode(uint32_t value,uint32_t type_value)163 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
164   if ((value & 0x7) == 0x1) {
165     switch (type_value) {
166       case 0x0:
167         return S16;
168       case 0x1:
169         return U16;
170     }
171   } else if ((value & 0x6) == 0x2) {
172     switch (type_value) {
173       case 0x0:
174         return S32;
175       case 0x1:
176         return U32;
177     }
178   } else if ((value & 0x4) == 0x4) {
179     switch (type_value) {
180       case 0x0:
181         return S64;
182       case 0x1:
183         return U64;
184     }
185   }
186   return kDataTypeValueInvalid;
187 }
188 
Dt_imm6_2_Decode(uint32_t value,uint32_t type_value)189 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
190   if ((value & 0x7) == 0x1) {
191     if (type_value == 0x1) return S16;
192   } else if ((value & 0x6) == 0x2) {
193     if (type_value == 0x1) return S32;
194   } else if ((value & 0x4) == 0x4) {
195     if (type_value == 0x1) return S64;
196   }
197   return kDataTypeValueInvalid;
198 }
199 
Dt_imm6_3_Decode(uint32_t value)200 DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
201   if ((value & 0x7) == 0x1) {
202     return I16;
203   } else if ((value & 0x6) == 0x2) {
204     return I32;
205   } else if ((value & 0x4) == 0x4) {
206     return I64;
207   }
208   return kDataTypeValueInvalid;
209 }
210 
Dt_imm6_4_Decode(uint32_t value,uint32_t type_value)211 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
212   if ((value & 0x7) == 0x1) {
213     switch (type_value) {
214       case 0x0:
215         return S8;
216       case 0x1:
217         return U8;
218     }
219   } else if ((value & 0x6) == 0x2) {
220     switch (type_value) {
221       case 0x0:
222         return S16;
223       case 0x1:
224         return U16;
225     }
226   } else if ((value & 0x4) == 0x4) {
227     switch (type_value) {
228       case 0x0:
229         return S32;
230       case 0x1:
231         return U32;
232     }
233   }
234   return kDataTypeValueInvalid;
235 }
236 
Dt_op_U_size_1_Decode(uint32_t value)237 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
238   switch (value) {
239     case 0x0:
240       return S8;
241     case 0x1:
242       return S16;
243     case 0x2:
244       return S32;
245     case 0x4:
246       return U8;
247     case 0x5:
248       return U16;
249     case 0x6:
250       return U32;
251     case 0x8:
252       return P8;
253     case 0xa:
254       return P64;
255   }
256   return kDataTypeValueInvalid;
257 }
258 
Dt_op_size_1_Decode(uint32_t value)259 DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
260   switch (value) {
261     case 0x0:
262       return I8;
263     case 0x1:
264       return I16;
265     case 0x2:
266       return I32;
267     case 0x4:
268       return P8;
269   }
270   return kDataTypeValueInvalid;
271 }
272 
Dt_op_size_2_Decode(uint32_t value)273 DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
274   switch (value) {
275     case 0x0:
276       return S8;
277     case 0x1:
278       return S16;
279     case 0x2:
280       return S32;
281     case 0x4:
282       return U8;
283     case 0x5:
284       return U16;
285     case 0x6:
286       return U32;
287   }
288   return kDataTypeValueInvalid;
289 }
290 
Dt_op_size_3_Decode(uint32_t value)291 DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
292   switch (value) {
293     case 0x0:
294       return S16;
295     case 0x1:
296       return S32;
297     case 0x2:
298       return S64;
299     case 0x4:
300       return U16;
301     case 0x5:
302       return U32;
303     case 0x6:
304       return U64;
305   }
306   return kDataTypeValueInvalid;
307 }
308 
Dt_U_imm3H_1_Decode(uint32_t value)309 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
310   switch (value) {
311     case 0x1:
312       return S8;
313     case 0x2:
314       return S16;
315     case 0x4:
316       return S32;
317     case 0x9:
318       return U8;
319     case 0xa:
320       return U16;
321     case 0xc:
322       return U32;
323   }
324   return kDataTypeValueInvalid;
325 }
326 
Dt_U_opc1_opc2_1_Decode(uint32_t value,unsigned * lane)327 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
328   if ((value & 0x18) == 0x8) {
329     *lane = value & 7;
330     return S8;
331   }
332   if ((value & 0x19) == 0x1) {
333     *lane = (value >> 1) & 3;
334     return S16;
335   }
336   if ((value & 0x18) == 0x18) {
337     *lane = value & 7;
338     return U8;
339   }
340   if ((value & 0x19) == 0x11) {
341     *lane = (value >> 1) & 3;
342     return U16;
343   }
344   if ((value & 0x1b) == 0x0) {
345     *lane = (value >> 2) & 1;
346     return Untyped32;
347   }
348   *lane = -1;
349   return kDataTypeValueInvalid;
350 }
351 
Dt_opc1_opc2_1_Decode(uint32_t value,unsigned * lane)352 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
353   if ((value & 0x8) == 0x8) {
354     *lane = value & 7;
355     return Untyped8;
356   }
357   if ((value & 0x9) == 0x1) {
358     *lane = (value >> 1) & 3;
359     return Untyped16;
360   }
361   if ((value & 0xb) == 0x0) {
362     *lane = (value >> 2) & 1;
363     return Untyped32;
364   }
365   *lane = -1;
366   return kDataTypeValueInvalid;
367 }
368 
Dt_imm4_1_Decode(uint32_t value,unsigned * lane)369 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
370   if ((value & 0x1) == 0x1) {
371     *lane = (value >> 1) & 7;
372     return Untyped8;
373   }
374   if ((value & 0x3) == 0x2) {
375     *lane = (value >> 2) & 3;
376     return Untyped16;
377   }
378   if ((value & 0x7) == 0x4) {
379     *lane = (value >> 3) & 1;
380     return Untyped32;
381   }
382   *lane = -1;
383   return kDataTypeValueInvalid;
384 }
385 
Dt_B_E_1_Decode(uint32_t value)386 DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
387   switch (value) {
388     case 0x2:
389       return Untyped8;
390     case 0x1:
391       return Untyped16;
392     case 0x0:
393       return Untyped32;
394   }
395   return kDataTypeValueInvalid;
396 }
397 
Dt_op_1_Decode1(uint32_t value)398 DataTypeValue Dt_op_1_Decode1(uint32_t value) {
399   switch (value) {
400     case 0x0:
401       return F32;
402     case 0x1:
403       return F32;
404     case 0x2:
405       return S32;
406     case 0x3:
407       return U32;
408   }
409   return kDataTypeValueInvalid;
410 }
411 
Dt_op_1_Decode2(uint32_t value)412 DataTypeValue Dt_op_1_Decode2(uint32_t value) {
413   switch (value) {
414     case 0x0:
415       return S32;
416     case 0x1:
417       return U32;
418     case 0x2:
419       return F32;
420     case 0x3:
421       return F32;
422   }
423   return kDataTypeValueInvalid;
424 }
425 
Dt_op_2_Decode(uint32_t value)426 DataTypeValue Dt_op_2_Decode(uint32_t value) {
427   switch (value) {
428     case 0x0:
429       return U32;
430     case 0x1:
431       return S32;
432   }
433   return kDataTypeValueInvalid;
434 }
435 
Dt_op_3_Decode(uint32_t value)436 DataTypeValue Dt_op_3_Decode(uint32_t value) {
437   switch (value) {
438     case 0x0:
439       return S32;
440     case 0x1:
441       return U32;
442   }
443   return kDataTypeValueInvalid;
444 }
445 
Dt_U_sx_1_Decode(uint32_t value)446 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
447   switch (value) {
448     case 0x0:
449       return S16;
450     case 0x1:
451       return S32;
452     case 0x2:
453       return U16;
454     case 0x3:
455       return U32;
456   }
457   return kDataTypeValueInvalid;
458 }
459 
Dt_op_U_1_Decode1(uint32_t value)460 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
461   switch (value) {
462     case 0x0:
463       return F32;
464     case 0x1:
465       return F32;
466     case 0x2:
467       return S32;
468     case 0x3:
469       return U32;
470   }
471   return kDataTypeValueInvalid;
472 }
473 
Dt_op_U_1_Decode2(uint32_t value)474 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
475   switch (value) {
476     case 0x0:
477       return S32;
478     case 0x1:
479       return U32;
480     case 0x2:
481       return F32;
482     case 0x3:
483       return F32;
484   }
485   return kDataTypeValueInvalid;
486 }
487 
Dt_sz_1_Decode(uint32_t value)488 DataTypeValue Dt_sz_1_Decode(uint32_t value) {
489   switch (value) {
490     case 0x0:
491       return F32;
492   }
493   return kDataTypeValueInvalid;
494 }
495 
Dt_F_size_1_Decode(uint32_t value)496 DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
497   switch (value) {
498     case 0x0:
499       return S8;
500     case 0x1:
501       return S16;
502     case 0x2:
503       return S32;
504     case 0x6:
505       return F32;
506   }
507   return kDataTypeValueInvalid;
508 }
509 
Dt_F_size_2_Decode(uint32_t value)510 DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
511   switch (value) {
512     case 0x0:
513       return I8;
514     case 0x1:
515       return I16;
516     case 0x2:
517       return I32;
518     case 0x6:
519       return F32;
520   }
521   return kDataTypeValueInvalid;
522 }
523 
Dt_F_size_3_Decode(uint32_t value)524 DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
525   switch (value) {
526     case 0x1:
527       return I16;
528     case 0x2:
529       return I32;
530     case 0x6:
531       return F32;
532   }
533   return kDataTypeValueInvalid;
534 }
535 
Dt_F_size_4_Decode(uint32_t value)536 DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
537   switch (value) {
538     case 0x2:
539       return U32;
540     case 0x6:
541       return F32;
542   }
543   return kDataTypeValueInvalid;
544 }
545 
Dt_U_size_1_Decode(uint32_t value)546 DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
547   switch (value) {
548     case 0x0:
549       return S8;
550     case 0x1:
551       return S16;
552     case 0x2:
553       return S32;
554     case 0x4:
555       return U8;
556     case 0x5:
557       return U16;
558     case 0x6:
559       return U32;
560   }
561   return kDataTypeValueInvalid;
562 }
563 
Dt_U_size_2_Decode(uint32_t value)564 DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
565   switch (value) {
566     case 0x1:
567       return S16;
568     case 0x2:
569       return S32;
570     case 0x5:
571       return U16;
572     case 0x6:
573       return U32;
574   }
575   return kDataTypeValueInvalid;
576 }
577 
Dt_U_size_3_Decode(uint32_t value)578 DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
579   switch (value) {
580     case 0x0:
581       return S8;
582     case 0x1:
583       return S16;
584     case 0x2:
585       return S32;
586     case 0x3:
587       return S64;
588     case 0x4:
589       return U8;
590     case 0x5:
591       return U16;
592     case 0x6:
593       return U32;
594     case 0x7:
595       return U64;
596   }
597   return kDataTypeValueInvalid;
598 }
599 
Dt_size_1_Decode(uint32_t value)600 DataTypeValue Dt_size_1_Decode(uint32_t value) {
601   switch (value) {
602     case 0x0:
603       return Untyped8;
604   }
605   return kDataTypeValueInvalid;
606 }
607 
Dt_size_2_Decode(uint32_t value)608 DataTypeValue Dt_size_2_Decode(uint32_t value) {
609   switch (value) {
610     case 0x0:
611       return I8;
612     case 0x1:
613       return I16;
614     case 0x2:
615       return I32;
616     case 0x3:
617       return I64;
618   }
619   return kDataTypeValueInvalid;
620 }
621 
Dt_size_3_Decode(uint32_t value)622 DataTypeValue Dt_size_3_Decode(uint32_t value) {
623   switch (value) {
624     case 0x0:
625       return I16;
626     case 0x1:
627       return I32;
628     case 0x2:
629       return I64;
630   }
631   return kDataTypeValueInvalid;
632 }
633 
Dt_size_4_Decode(uint32_t value)634 DataTypeValue Dt_size_4_Decode(uint32_t value) {
635   switch (value) {
636     case 0x0:
637       return I8;
638     case 0x1:
639       return I16;
640     case 0x2:
641       return I32;
642   }
643   return kDataTypeValueInvalid;
644 }
645 
Dt_size_5_Decode(uint32_t value)646 DataTypeValue Dt_size_5_Decode(uint32_t value) {
647   switch (value) {
648     case 0x0:
649       return S8;
650     case 0x1:
651       return S16;
652     case 0x2:
653       return S32;
654   }
655   return kDataTypeValueInvalid;
656 }
657 
Dt_size_6_Decode(uint32_t value)658 DataTypeValue Dt_size_6_Decode(uint32_t value) {
659   switch (value) {
660     case 0x0:
661       return Untyped8;
662     case 0x1:
663       return Untyped16;
664     case 0x2:
665       return Untyped32;
666     case 0x3:
667       return Untyped64;
668   }
669   return kDataTypeValueInvalid;
670 }
671 
Dt_size_7_Decode(uint32_t value)672 DataTypeValue Dt_size_7_Decode(uint32_t value) {
673   switch (value) {
674     case 0x0:
675       return Untyped8;
676     case 0x1:
677       return Untyped16;
678     case 0x2:
679       return Untyped32;
680   }
681   return kDataTypeValueInvalid;
682 }
683 
Dt_size_8_Decode(uint32_t value)684 DataTypeValue Dt_size_8_Decode(uint32_t value) {
685   switch (value) {
686     case 0x0:
687       return Untyped8;
688     case 0x1:
689       return Untyped16;
690     case 0x2:
691       return Untyped32;
692     case 0x3:
693       return Untyped32;
694   }
695   return kDataTypeValueInvalid;
696 }
697 
Dt_size_9_Decode(uint32_t value,uint32_t type_value)698 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
699   switch (value) {
700     case 0x1:
701       switch (type_value) {
702         case 0x0:
703           return I16;
704       }
705       break;
706     case 0x2:
707       switch (type_value) {
708         case 0x0:
709           return I32;
710         case 0x1:
711           return F32;
712       }
713       break;
714   }
715   return kDataTypeValueInvalid;
716 }
717 
Dt_size_10_Decode(uint32_t value)718 DataTypeValue Dt_size_10_Decode(uint32_t value) {
719   switch (value) {
720     case 0x0:
721       return I8;
722     case 0x1:
723       return I16;
724     case 0x2:
725       return I32;
726   }
727   return kDataTypeValueInvalid;
728 }
729 
Dt_size_11_Decode(uint32_t value,uint32_t type_value)730 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
731   switch (value) {
732     case 0x1:
733       switch (type_value) {
734         case 0x0:
735           return S16;
736         case 0x1:
737           return U16;
738       }
739       break;
740     case 0x2:
741       switch (type_value) {
742         case 0x0:
743           return S32;
744         case 0x1:
745           return U32;
746       }
747       break;
748   }
749   return kDataTypeValueInvalid;
750 }
751 
Dt_size_12_Decode(uint32_t value,uint32_t type_value)752 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
753   switch (value) {
754     case 0x0:
755       switch (type_value) {
756         case 0x0:
757           return S8;
758         case 0x1:
759           return U8;
760       }
761       break;
762     case 0x1:
763       switch (type_value) {
764         case 0x0:
765           return S16;
766         case 0x1:
767           return U16;
768       }
769       break;
770     case 0x2:
771       switch (type_value) {
772         case 0x0:
773           return S32;
774         case 0x1:
775           return U32;
776       }
777       break;
778   }
779   return kDataTypeValueInvalid;
780 }
781 
Dt_size_13_Decode(uint32_t value)782 DataTypeValue Dt_size_13_Decode(uint32_t value) {
783   switch (value) {
784     case 0x1:
785       return S16;
786     case 0x2:
787       return S32;
788   }
789   return kDataTypeValueInvalid;
790 }
791 
Dt_size_14_Decode(uint32_t value)792 DataTypeValue Dt_size_14_Decode(uint32_t value) {
793   switch (value) {
794     case 0x0:
795       return S16;
796     case 0x1:
797       return S32;
798     case 0x2:
799       return S64;
800   }
801   return kDataTypeValueInvalid;
802 }
803 
Dt_size_15_Decode(uint32_t value)804 DataTypeValue Dt_size_15_Decode(uint32_t value) {
805   switch (value) {
806     case 0x0:
807       return Untyped8;
808     case 0x1:
809       return Untyped16;
810   }
811   return kDataTypeValueInvalid;
812 }
813 
Dt_size_16_Decode(uint32_t value)814 DataTypeValue Dt_size_16_Decode(uint32_t value) {
815   switch (value) {
816     case 0x0:
817       return I8;
818     case 0x1:
819       return I16;
820     case 0x2:
821       return I32;
822   }
823   return kDataTypeValueInvalid;
824 }
825 
Index_1_Decode(uint32_t value,DataType dt)826 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
827   switch (dt.GetValue()) {
828     case Untyped8: {
829       int lane = (value >> 1) & 0x7;
830       if ((value & 1) != 0) break;
831       SpacingType spacing = kSingle;
832       return DecodeNeon(lane, spacing);
833     }
834     case Untyped16: {
835       int lane = (value >> 2) & 0x3;
836       if ((value & 1) != 0) break;
837       SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
838       return DecodeNeon(lane, spacing);
839     }
840     case Untyped32: {
841       int lane = (value >> 3) & 0x1;
842       if ((value & 3) != 0) break;
843       SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
844       return DecodeNeon(lane, spacing);
845     }
846     default:
847       break;
848   }
849   return DecodeNeon();
850 }
851 
Align_index_align_1_Decode(uint32_t value,DataType dt)852 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
853   switch (dt.GetValue()) {
854     case Untyped8: {
855       AlignmentType align;
856       if ((value & 1) == 0) {
857         align = kNoAlignment;
858       } else {
859         break;
860       }
861       int lane = (value >> 1) & 0x7;
862       SpacingType spacing = kSingle;
863       return DecodeNeonAndAlign(lane, spacing, align);
864     }
865     case Untyped16: {
866       AlignmentType align;
867       if ((value & 3) == 1) {
868         align = k16BitAlign;
869       } else if ((value & 3) == 0) {
870         align = kNoAlignment;
871       } else {
872         break;
873       }
874       int lane = (value >> 2) & 0x3;
875       SpacingType spacing = kSingle;
876       return DecodeNeonAndAlign(lane, spacing, align);
877     }
878     case Untyped32: {
879       AlignmentType align;
880       if ((value & 7) == 3) {
881         align = k32BitAlign;
882       } else if ((value & 7) == 0) {
883         align = kNoAlignment;
884       } else {
885         break;
886       }
887       int lane = (value >> 3) & 0x1;
888       SpacingType spacing = kSingle;
889       return DecodeNeonAndAlign(lane, spacing, align);
890     }
891     default:
892       break;
893   }
894   return DecodeNeonAndAlign();
895 }
896 
Align_index_align_2_Decode(uint32_t value,DataType dt)897 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
898   switch (dt.GetValue()) {
899     case Untyped8: {
900       AlignmentType align;
901       if ((value & 1) == 1) {
902         align = k16BitAlign;
903       } else if ((value & 1) == 0) {
904         align = kNoAlignment;
905       } else {
906         break;
907       }
908       int lane = (value >> 1) & 0x7;
909       SpacingType spacing = kSingle;
910       return DecodeNeonAndAlign(lane, spacing, align);
911     }
912     case Untyped16: {
913       AlignmentType align;
914       if ((value & 1) == 1) {
915         align = k32BitAlign;
916       } else if ((value & 1) == 0) {
917         align = kNoAlignment;
918       } else {
919         break;
920       }
921       int lane = (value >> 2) & 0x3;
922       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
923       return DecodeNeonAndAlign(lane, spacing, align);
924     }
925     case Untyped32: {
926       AlignmentType align;
927       if ((value & 3) == 1) {
928         align = k64BitAlign;
929       } else if ((value & 3) == 0) {
930         align = kNoAlignment;
931       } else {
932         break;
933       }
934       int lane = (value >> 3) & 0x1;
935       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
936       return DecodeNeonAndAlign(lane, spacing, align);
937     }
938     default:
939       break;
940   }
941   return DecodeNeonAndAlign();
942 }
943 
Align_index_align_3_Decode(uint32_t value,DataType dt)944 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
945   switch (dt.GetValue()) {
946     case Untyped8: {
947       AlignmentType align;
948       if ((value & 1) == 1) {
949         align = k32BitAlign;
950       } else if ((value & 1) == 0) {
951         align = kNoAlignment;
952       } else {
953         break;
954       }
955       int lane = (value >> 1) & 0x7;
956       SpacingType spacing = kSingle;
957       return DecodeNeonAndAlign(lane, spacing, align);
958     }
959     case Untyped16: {
960       AlignmentType align;
961       if ((value & 1) == 1) {
962         align = k64BitAlign;
963       } else if ((value & 1) == 0) {
964         align = kNoAlignment;
965       } else {
966         break;
967       }
968       int lane = (value >> 2) & 0x3;
969       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
970       return DecodeNeonAndAlign(lane, spacing, align);
971     }
972     case Untyped32: {
973       AlignmentType align;
974       if ((value & 3) == 1) {
975         align = k64BitAlign;
976       } else if ((value & 3) == 2) {
977         align = k128BitAlign;
978       } else if ((value & 3) == 0) {
979         align = kNoAlignment;
980       } else {
981         break;
982       }
983       int lane = (value >> 3) & 0x1;
984       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
985       return DecodeNeonAndAlign(lane, spacing, align);
986     }
987     default:
988       break;
989   }
990   return DecodeNeonAndAlign();
991 }
992 
Align_a_1_Decode(uint32_t value,DataType dt)993 Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
994   switch (value) {
995     case 0:
996       return kNoAlignment;
997     case 1:
998       if (dt.Is(Untyped16)) return k16BitAlign;
999       if (dt.Is(Untyped32)) return k32BitAlign;
1000       break;
1001     default:
1002       break;
1003   }
1004   return kBadAlignment;
1005 }
1006 
Align_a_2_Decode(uint32_t value,DataType dt)1007 Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
1008   switch (value) {
1009     case 0:
1010       return kNoAlignment;
1011     case 1:
1012       if (dt.Is(Untyped8)) return k16BitAlign;
1013       if (dt.Is(Untyped16)) return k32BitAlign;
1014       if (dt.Is(Untyped32)) return k64BitAlign;
1015       break;
1016     default:
1017       break;
1018   }
1019   return kBadAlignment;
1020 }
1021 
Align_a_3_Decode(uint32_t value,DataType dt,uint32_t size)1022 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
1023   switch (value) {
1024     case 0:
1025       if (size != 3) return kNoAlignment;
1026       break;
1027     case 1:
1028       if (dt.Is(Untyped8)) return k32BitAlign;
1029       if (dt.Is(Untyped16)) return k64BitAlign;
1030       if (size == 2) return k64BitAlign;
1031       if (size == 3) return k128BitAlign;
1032       break;
1033     default:
1034       break;
1035   }
1036   return kBadAlignment;
1037 }
1038 
Align_align_1_Decode(uint32_t value)1039 Alignment Align_align_1_Decode(uint32_t value) {
1040   switch (value) {
1041     case 0:
1042       return kNoAlignment;
1043     case 1:
1044       return k64BitAlign;
1045     case 2:
1046       return k128BitAlign;
1047     case 3:
1048       return k256BitAlign;
1049     default:
1050       break;
1051   }
1052   return kBadAlignment;
1053 }
1054 
Align_align_2_Decode(uint32_t value)1055 Alignment Align_align_2_Decode(uint32_t value) {
1056   switch (value) {
1057     case 0:
1058       return kNoAlignment;
1059     case 1:
1060       return k64BitAlign;
1061     case 2:
1062       return k128BitAlign;
1063     case 3:
1064       return k256BitAlign;
1065     default:
1066       break;
1067   }
1068   return kBadAlignment;
1069 }
1070 
Align_align_3_Decode(uint32_t value)1071 Alignment Align_align_3_Decode(uint32_t value) {
1072   switch (value) {
1073     case 0:
1074       return kNoAlignment;
1075     case 1:
1076       return k64BitAlign;
1077     default:
1078       break;
1079   }
1080   return kBadAlignment;
1081 }
1082 
Align_align_4_Decode(uint32_t value)1083 Alignment Align_align_4_Decode(uint32_t value) {
1084   switch (value) {
1085     case 0:
1086       return kNoAlignment;
1087     case 1:
1088       return k64BitAlign;
1089     case 2:
1090       return k128BitAlign;
1091     case 3:
1092       return k256BitAlign;
1093     default:
1094       break;
1095   }
1096   return kBadAlignment;
1097 }
1098 
Align_align_5_Decode(uint32_t value)1099 Alignment Align_align_5_Decode(uint32_t value) {
1100   switch (value) {
1101     case 0:
1102       return kNoAlignment;
1103     case 1:
1104       return k64BitAlign;
1105     case 2:
1106       return k128BitAlign;
1107     case 3:
1108       return k256BitAlign;
1109     default:
1110       break;
1111   }
1112   return kBadAlignment;
1113 }
1114 
1115 
adc(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1116 void Disassembler::adc(Condition cond,
1117                        EncodingSize size,
1118                        Register rd,
1119                        Register rn,
1120                        const Operand& operand) {
1121   os().SetCurrentInstruction(kAdc, kArithmetic);
1122   os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
1123   os() << " ";
1124   if (!rd.Is(rn)) {
1125     os() << rd << ", ";
1126   }
1127   os() << rn << ", " << operand;
1128 }
1129 
adcs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1130 void Disassembler::adcs(Condition cond,
1131                         EncodingSize size,
1132                         Register rd,
1133                         Register rn,
1134                         const Operand& operand) {
1135   os().SetCurrentInstruction(kAdcs, kArithmetic);
1136   os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
1137   os() << " ";
1138   if (!rd.Is(rn)) {
1139     os() << rd << ", ";
1140   }
1141   os() << rn << ", " << operand;
1142 }
1143 
add(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1144 void Disassembler::add(Condition cond,
1145                        EncodingSize size,
1146                        Register rd,
1147                        Register rn,
1148                        const Operand& operand) {
1149   os().SetCurrentInstruction(kAdd, kArithmetic);
1150   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
1151   os() << " ";
1152   if (!rd.Is(rn)) {
1153     os() << rd << ", ";
1154   }
1155   os() << rn << ", " << operand;
1156 }
1157 
add(Condition cond,Register rd,const Operand & operand)1158 void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
1159   os().SetCurrentInstruction(kAdd, kArithmetic);
1160   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
1161        << ", " << operand;
1162 }
1163 
adds(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1164 void Disassembler::adds(Condition cond,
1165                         EncodingSize size,
1166                         Register rd,
1167                         Register rn,
1168                         const Operand& operand) {
1169   os().SetCurrentInstruction(kAdds, kArithmetic);
1170   os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
1171   os() << " ";
1172   if (!rd.Is(rn)) {
1173     os() << rd << ", ";
1174   }
1175   os() << rn << ", " << operand;
1176 }
1177 
adds(Register rd,const Operand & operand)1178 void Disassembler::adds(Register rd, const Operand& operand) {
1179   os().SetCurrentInstruction(kAdds, kArithmetic);
1180   os() << ToCString(kAdds) << " " << rd << ", " << operand;
1181 }
1182 
addw(Condition cond,Register rd,Register rn,const Operand & operand)1183 void Disassembler::addw(Condition cond,
1184                         Register rd,
1185                         Register rn,
1186                         const Operand& operand) {
1187   os().SetCurrentInstruction(kAddw, kArithmetic);
1188   os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
1189   os() << " ";
1190   if (!rd.Is(rn)) {
1191     os() << rd << ", ";
1192   }
1193   os() << rn << ", " << operand;
1194 }
1195 
adr(Condition cond,EncodingSize size,Register rd,Label * label)1196 void Disassembler::adr(Condition cond,
1197                        EncodingSize size,
1198                        Register rd,
1199                        Label* label) {
1200   os().SetCurrentInstruction(kAdr, kAddress);
1201   os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
1202        << rd << ", " << PrintLabel(kAnyLocation, label, GetCodeAddress() & ~3);
1203 }
1204 
and_(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1205 void Disassembler::and_(Condition cond,
1206                         EncodingSize size,
1207                         Register rd,
1208                         Register rn,
1209                         const Operand& operand) {
1210   os().SetCurrentInstruction(kAnd, kBitwise);
1211   os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
1212   os() << " ";
1213   if (!rd.Is(rn)) {
1214     os() << rd << ", ";
1215   }
1216   os() << rn << ", " << operand;
1217 }
1218 
ands(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1219 void Disassembler::ands(Condition cond,
1220                         EncodingSize size,
1221                         Register rd,
1222                         Register rn,
1223                         const Operand& operand) {
1224   os().SetCurrentInstruction(kAnds, kBitwise);
1225   os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
1226   os() << " ";
1227   if (!rd.Is(rn)) {
1228     os() << rd << ", ";
1229   }
1230   os() << rn << ", " << operand;
1231 }
1232 
asr(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1233 void Disassembler::asr(Condition cond,
1234                        EncodingSize size,
1235                        Register rd,
1236                        Register rm,
1237                        const Operand& operand) {
1238   os().SetCurrentInstruction(kAsr, kShift);
1239   os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
1240   os() << " ";
1241   if (!rd.Is(rm)) {
1242     os() << rd << ", ";
1243   }
1244   os() << rm << ", " << operand;
1245 }
1246 
asrs(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1247 void Disassembler::asrs(Condition cond,
1248                         EncodingSize size,
1249                         Register rd,
1250                         Register rm,
1251                         const Operand& operand) {
1252   os().SetCurrentInstruction(kAsrs, kShift);
1253   os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
1254   os() << " ";
1255   if (!rd.Is(rm)) {
1256     os() << rd << ", ";
1257   }
1258   os() << rm << ", " << operand;
1259 }
1260 
b(Condition cond,EncodingSize size,Label * label)1261 void Disassembler::b(Condition cond, EncodingSize size, Label* label) {
1262   os().SetCurrentInstruction(kB, kAddress | kBranch);
1263   os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
1264        << PrintLabel(kCodeLocation, label, GetCodeAddress());
1265 }
1266 
bfc(Condition cond,Register rd,uint32_t lsb,const Operand & operand)1267 void Disassembler::bfc(Condition cond,
1268                        Register rd,
1269                        uint32_t lsb,
1270                        const Operand& operand) {
1271   os().SetCurrentInstruction(kBfc, kShift);
1272   os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
1273        << ", "
1274        << "#" << lsb << ", " << operand;
1275 }
1276 
bfi(Condition cond,Register rd,Register rn,uint32_t lsb,const Operand & operand)1277 void Disassembler::bfi(Condition cond,
1278                        Register rd,
1279                        Register rn,
1280                        uint32_t lsb,
1281                        const Operand& operand) {
1282   os().SetCurrentInstruction(kBfi, kShift);
1283   os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
1284        << ", " << rn << ", "
1285        << "#" << lsb << ", " << operand;
1286 }
1287 
bic(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1288 void Disassembler::bic(Condition cond,
1289                        EncodingSize size,
1290                        Register rd,
1291                        Register rn,
1292                        const Operand& operand) {
1293   os().SetCurrentInstruction(kBic, kBitwise);
1294   os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
1295   os() << " ";
1296   if (!rd.Is(rn)) {
1297     os() << rd << ", ";
1298   }
1299   os() << rn << ", " << operand;
1300 }
1301 
bics(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1302 void Disassembler::bics(Condition cond,
1303                         EncodingSize size,
1304                         Register rd,
1305                         Register rn,
1306                         const Operand& operand) {
1307   os().SetCurrentInstruction(kBics, kBitwise);
1308   os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
1309   os() << " ";
1310   if (!rd.Is(rn)) {
1311     os() << rd << ", ";
1312   }
1313   os() << rn << ", " << operand;
1314 }
1315 
bkpt(Condition cond,uint32_t imm)1316 void Disassembler::bkpt(Condition cond, uint32_t imm) {
1317   os().SetCurrentInstruction(kBkpt, kSystem);
1318   os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " " << imm;
1319 }
1320 
bl(Condition cond,Label * label)1321 void Disassembler::bl(Condition cond, Label* label) {
1322   os().SetCurrentInstruction(kBl, kAddress | kBranch);
1323   os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
1324        << PrintLabel(kCodeLocation, label, GetCodeAddress());
1325 }
1326 
blx(Condition cond,Label * label)1327 void Disassembler::blx(Condition cond, Label* label) {
1328   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1329   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
1330        << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3);
1331 }
1332 
blx(Condition cond,Register rm)1333 void Disassembler::blx(Condition cond, Register rm) {
1334   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
1335   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
1336 }
1337 
bx(Condition cond,Register rm)1338 void Disassembler::bx(Condition cond, Register rm) {
1339   os().SetCurrentInstruction(kBx, kAddress | kBranch);
1340   os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
1341 }
1342 
bxj(Condition cond,Register rm)1343 void Disassembler::bxj(Condition cond, Register rm) {
1344   os().SetCurrentInstruction(kBxj, kAddress | kBranch);
1345   os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
1346 }
1347 
cbnz(Register rn,Label * label)1348 void Disassembler::cbnz(Register rn, Label* label) {
1349   os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
1350   os() << ToCString(kCbnz) << " " << rn << ", "
1351        << PrintLabel(kCodeLocation, label, GetCodeAddress());
1352 }
1353 
cbz(Register rn,Label * label)1354 void Disassembler::cbz(Register rn, Label* label) {
1355   os().SetCurrentInstruction(kCbz, kAddress | kBranch);
1356   os() << ToCString(kCbz) << " " << rn << ", "
1357        << PrintLabel(kCodeLocation, label, GetCodeAddress());
1358 }
1359 
clrex(Condition cond)1360 void Disassembler::clrex(Condition cond) {
1361   os().SetCurrentInstruction(kClrex, kNoAttribute);
1362   os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
1363 }
1364 
clz(Condition cond,Register rd,Register rm)1365 void Disassembler::clz(Condition cond, Register rd, Register rm) {
1366   os().SetCurrentInstruction(kClz, kNoAttribute);
1367   os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
1368        << ", " << rm;
1369 }
1370 
cmn(Condition cond,EncodingSize size,Register rn,const Operand & operand)1371 void Disassembler::cmn(Condition cond,
1372                        EncodingSize size,
1373                        Register rn,
1374                        const Operand& operand) {
1375   os().SetCurrentInstruction(kCmn, kArithmetic);
1376   os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
1377        << rn << ", " << operand;
1378 }
1379 
cmp(Condition cond,EncodingSize size,Register rn,const Operand & operand)1380 void Disassembler::cmp(Condition cond,
1381                        EncodingSize size,
1382                        Register rn,
1383                        const Operand& operand) {
1384   os().SetCurrentInstruction(kCmp, kArithmetic);
1385   os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
1386        << rn << ", " << operand;
1387 }
1388 
crc32b(Condition cond,Register rd,Register rn,Register rm)1389 void Disassembler::crc32b(Condition cond,
1390                           Register rd,
1391                           Register rn,
1392                           Register rm) {
1393   os().SetCurrentInstruction(kCrc32b, kNoAttribute);
1394   os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
1395        << ", " << rn << ", " << rm;
1396 }
1397 
crc32cb(Condition cond,Register rd,Register rn,Register rm)1398 void Disassembler::crc32cb(Condition cond,
1399                            Register rd,
1400                            Register rn,
1401                            Register rm) {
1402   os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
1403   os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
1404        << ", " << rn << ", " << rm;
1405 }
1406 
crc32ch(Condition cond,Register rd,Register rn,Register rm)1407 void Disassembler::crc32ch(Condition cond,
1408                            Register rd,
1409                            Register rn,
1410                            Register rm) {
1411   os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
1412   os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
1413        << ", " << rn << ", " << rm;
1414 }
1415 
crc32cw(Condition cond,Register rd,Register rn,Register rm)1416 void Disassembler::crc32cw(Condition cond,
1417                            Register rd,
1418                            Register rn,
1419                            Register rm) {
1420   os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
1421   os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
1422        << ", " << rn << ", " << rm;
1423 }
1424 
crc32h(Condition cond,Register rd,Register rn,Register rm)1425 void Disassembler::crc32h(Condition cond,
1426                           Register rd,
1427                           Register rn,
1428                           Register rm) {
1429   os().SetCurrentInstruction(kCrc32h, kNoAttribute);
1430   os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
1431        << ", " << rn << ", " << rm;
1432 }
1433 
crc32w(Condition cond,Register rd,Register rn,Register rm)1434 void Disassembler::crc32w(Condition cond,
1435                           Register rd,
1436                           Register rn,
1437                           Register rm) {
1438   os().SetCurrentInstruction(kCrc32w, kNoAttribute);
1439   os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
1440        << ", " << rn << ", " << rm;
1441 }
1442 
dmb(Condition cond,MemoryBarrier option)1443 void Disassembler::dmb(Condition cond, MemoryBarrier option) {
1444   os().SetCurrentInstruction(kDmb, kNoAttribute);
1445   os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
1446 }
1447 
dsb(Condition cond,MemoryBarrier option)1448 void Disassembler::dsb(Condition cond, MemoryBarrier option) {
1449   os().SetCurrentInstruction(kDsb, kNoAttribute);
1450   os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
1451 }
1452 
eor(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1453 void Disassembler::eor(Condition cond,
1454                        EncodingSize size,
1455                        Register rd,
1456                        Register rn,
1457                        const Operand& operand) {
1458   os().SetCurrentInstruction(kEor, kBitwise);
1459   os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
1460   os() << " ";
1461   if (!rd.Is(rn)) {
1462     os() << rd << ", ";
1463   }
1464   os() << rn << ", " << operand;
1465 }
1466 
eors(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)1467 void Disassembler::eors(Condition cond,
1468                         EncodingSize size,
1469                         Register rd,
1470                         Register rn,
1471                         const Operand& operand) {
1472   os().SetCurrentInstruction(kEors, kBitwise);
1473   os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
1474   os() << " ";
1475   if (!rd.Is(rn)) {
1476     os() << rd << ", ";
1477   }
1478   os() << rn << ", " << operand;
1479 }
1480 
fldmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1481 void Disassembler::fldmdbx(Condition cond,
1482                            Register rn,
1483                            WriteBack write_back,
1484                            DRegisterList dreglist) {
1485   os().SetCurrentInstruction(kFldmdbx,
1486                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1487   os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1488        << write_back << ", " << dreglist;
1489 }
1490 
fldmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1491 void Disassembler::fldmiax(Condition cond,
1492                            Register rn,
1493                            WriteBack write_back,
1494                            DRegisterList dreglist) {
1495   os().SetCurrentInstruction(kFldmiax,
1496                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1497   os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1498        << write_back << ", " << dreglist;
1499 }
1500 
fstmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1501 void Disassembler::fstmdbx(Condition cond,
1502                            Register rn,
1503                            WriteBack write_back,
1504                            DRegisterList dreglist) {
1505   os().SetCurrentInstruction(kFstmdbx,
1506                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1507   os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
1508        << write_back << ", " << dreglist;
1509 }
1510 
fstmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1511 void Disassembler::fstmiax(Condition cond,
1512                            Register rn,
1513                            WriteBack write_back,
1514                            DRegisterList dreglist) {
1515   os().SetCurrentInstruction(kFstmiax,
1516                              kLoadStore | kLoadStoreMultiple | kFpNeon);
1517   os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
1518        << write_back << ", " << dreglist;
1519 }
1520 
hlt(Condition cond,uint32_t imm)1521 void Disassembler::hlt(Condition cond, uint32_t imm) {
1522   os().SetCurrentInstruction(kHlt, kSystem);
1523   os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " " << imm;
1524 }
1525 
hvc(Condition cond,uint32_t imm)1526 void Disassembler::hvc(Condition cond, uint32_t imm) {
1527   os().SetCurrentInstruction(kHvc, kSystem);
1528   os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " " << imm;
1529 }
1530 
isb(Condition cond,MemoryBarrier option)1531 void Disassembler::isb(Condition cond, MemoryBarrier option) {
1532   os().SetCurrentInstruction(kIsb, kNoAttribute);
1533   os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
1534 }
1535 
it(Condition cond,uint16_t mask)1536 void Disassembler::it(Condition cond, uint16_t mask) {
1537   os().SetCurrentInstruction(kIt, kNoAttribute);
1538   os() << ToCString(kIt);
1539   int count;
1540   if ((mask & 0x1) != 0) {
1541     count = 3;
1542   } else if ((mask & 0x2) != 0) {
1543     count = 2;
1544   } else if ((mask & 0x4) != 0) {
1545     count = 1;
1546   } else {
1547     count = 0;
1548   }
1549   uint16_t tmp = 0x8;
1550   uint16_t ref = (cond.GetCondition() & 0x1) << 3;
1551   while (count-- > 0) {
1552     os() << (((mask & tmp) == ref) ? "t" : "e");
1553     tmp >>= 1;
1554     ref >>= 1;
1555   }
1556   if (cond.Is(al)) {
1557     os() << " al";
1558   } else {
1559     os() << " " << cond;
1560   }
1561 }
1562 
lda(Condition cond,Register rt,const MemOperand & operand)1563 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
1564   os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
1565   os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
1566        << ", " << PrintMemOperand(kLoadWordLocation, operand);
1567 }
1568 
ldab(Condition cond,Register rt,const MemOperand & operand)1569 void Disassembler::ldab(Condition cond,
1570                         Register rt,
1571                         const MemOperand& operand) {
1572   os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
1573   os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
1574        << ", " << PrintMemOperand(kLoadByteLocation, operand);
1575 }
1576 
ldaex(Condition cond,Register rt,const MemOperand & operand)1577 void Disassembler::ldaex(Condition cond,
1578                          Register rt,
1579                          const MemOperand& operand) {
1580   os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
1581   os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
1582        << ", " << PrintMemOperand(kLoadWordLocation, operand);
1583 }
1584 
ldaexb(Condition cond,Register rt,const MemOperand & operand)1585 void Disassembler::ldaexb(Condition cond,
1586                           Register rt,
1587                           const MemOperand& operand) {
1588   os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
1589   os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
1590        << ", " << PrintMemOperand(kLoadByteLocation, operand);
1591 }
1592 
ldaexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1593 void Disassembler::ldaexd(Condition cond,
1594                           Register rt,
1595                           Register rt2,
1596                           const MemOperand& operand) {
1597   os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
1598   os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
1599        << ", " << rt2 << ", "
1600        << PrintMemOperand(kLoadDoubleWordLocation, operand);
1601 }
1602 
ldaexh(Condition cond,Register rt,const MemOperand & operand)1603 void Disassembler::ldaexh(Condition cond,
1604                           Register rt,
1605                           const MemOperand& operand) {
1606   os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
1607   os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
1608        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1609 }
1610 
ldah(Condition cond,Register rt,const MemOperand & operand)1611 void Disassembler::ldah(Condition cond,
1612                         Register rt,
1613                         const MemOperand& operand) {
1614   os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
1615   os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
1616        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1617 }
1618 
ldm(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)1619 void Disassembler::ldm(Condition cond,
1620                        EncodingSize size,
1621                        Register rn,
1622                        WriteBack write_back,
1623                        RegisterList registers) {
1624   os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
1625   os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
1626        << rn << write_back << ", " << registers;
1627 }
1628 
ldmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1629 void Disassembler::ldmda(Condition cond,
1630                          Register rn,
1631                          WriteBack write_back,
1632                          RegisterList registers) {
1633   os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
1634   os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
1635        << write_back << ", " << registers;
1636 }
1637 
ldmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1638 void Disassembler::ldmdb(Condition cond,
1639                          Register rn,
1640                          WriteBack write_back,
1641                          RegisterList registers) {
1642   os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
1643   os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
1644        << write_back << ", " << registers;
1645 }
1646 
ldmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1647 void Disassembler::ldmea(Condition cond,
1648                          Register rn,
1649                          WriteBack write_back,
1650                          RegisterList registers) {
1651   os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
1652   os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
1653        << write_back << ", " << registers;
1654 }
1655 
ldmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1656 void Disassembler::ldmed(Condition cond,
1657                          Register rn,
1658                          WriteBack write_back,
1659                          RegisterList registers) {
1660   os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
1661   os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
1662        << write_back << ", " << registers;
1663 }
1664 
ldmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1665 void Disassembler::ldmfa(Condition cond,
1666                          Register rn,
1667                          WriteBack write_back,
1668                          RegisterList registers) {
1669   os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
1670   os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
1671        << write_back << ", " << registers;
1672 }
1673 
ldmfd(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)1674 void Disassembler::ldmfd(Condition cond,
1675                          EncodingSize size,
1676                          Register rn,
1677                          WriteBack write_back,
1678                          RegisterList registers) {
1679   os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
1680   os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
1681        << rn << write_back << ", " << registers;
1682 }
1683 
ldmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1684 void Disassembler::ldmib(Condition cond,
1685                          Register rn,
1686                          WriteBack write_back,
1687                          RegisterList registers) {
1688   os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
1689   os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
1690        << write_back << ", " << registers;
1691 }
1692 
ldr(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1693 void Disassembler::ldr(Condition cond,
1694                        EncodingSize size,
1695                        Register rt,
1696                        const MemOperand& operand) {
1697   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1698   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1699        << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
1700 }
1701 
ldr(Condition cond,EncodingSize size,Register rt,Label * label)1702 void Disassembler::ldr(Condition cond,
1703                        EncodingSize size,
1704                        Register rt,
1705                        Label* label) {
1706   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
1707   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
1708        << rt << ", "
1709        << PrintLabel(kLoadWordLocation, label, GetCodeAddress() & ~3);
1710 }
1711 
ldrb(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1712 void Disassembler::ldrb(Condition cond,
1713                         EncodingSize size,
1714                         Register rt,
1715                         const MemOperand& operand) {
1716   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1717   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
1718        << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
1719 }
1720 
ldrb(Condition cond,Register rt,Label * label)1721 void Disassembler::ldrb(Condition cond, Register rt, Label* label) {
1722   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
1723   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
1724        << ", " << PrintLabel(kLoadByteLocation, label, GetCodeAddress() & ~3);
1725 }
1726 
ldrd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1727 void Disassembler::ldrd(Condition cond,
1728                         Register rt,
1729                         Register rt2,
1730                         const MemOperand& operand) {
1731   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1732   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1733        << ", " << rt2 << ", "
1734        << PrintMemOperand(kLoadDoubleWordLocation, operand);
1735 }
1736 
ldrd(Condition cond,Register rt,Register rt2,Label * label)1737 void Disassembler::ldrd(Condition cond,
1738                         Register rt,
1739                         Register rt2,
1740                         Label* label) {
1741   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
1742   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
1743        << ", " << rt2 << ", "
1744        << PrintLabel(kLoadDoubleWordLocation, label, GetCodeAddress() & ~3);
1745 }
1746 
ldrex(Condition cond,Register rt,const MemOperand & operand)1747 void Disassembler::ldrex(Condition cond,
1748                          Register rt,
1749                          const MemOperand& operand) {
1750   os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
1751   os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
1752        << ", " << PrintMemOperand(kLoadWordLocation, operand);
1753 }
1754 
ldrexb(Condition cond,Register rt,const MemOperand & operand)1755 void Disassembler::ldrexb(Condition cond,
1756                           Register rt,
1757                           const MemOperand& operand) {
1758   os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
1759   os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
1760        << ", " << PrintMemOperand(kLoadByteLocation, operand);
1761 }
1762 
ldrexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1763 void Disassembler::ldrexd(Condition cond,
1764                           Register rt,
1765                           Register rt2,
1766                           const MemOperand& operand) {
1767   os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
1768   os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
1769        << ", " << rt2 << ", "
1770        << PrintMemOperand(kLoadDoubleWordLocation, operand);
1771 }
1772 
ldrexh(Condition cond,Register rt,const MemOperand & operand)1773 void Disassembler::ldrexh(Condition cond,
1774                           Register rt,
1775                           const MemOperand& operand) {
1776   os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
1777   os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
1778        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1779 }
1780 
ldrh(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1781 void Disassembler::ldrh(Condition cond,
1782                         EncodingSize size,
1783                         Register rt,
1784                         const MemOperand& operand) {
1785   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1786   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
1787        << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
1788 }
1789 
ldrh(Condition cond,Register rt,Label * label)1790 void Disassembler::ldrh(Condition cond, Register rt, Label* label) {
1791   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
1792   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
1793        << ", "
1794        << PrintLabel(kLoadHalfWordLocation, label, GetCodeAddress() & ~3);
1795 }
1796 
ldrsb(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1797 void Disassembler::ldrsb(Condition cond,
1798                          EncodingSize size,
1799                          Register rt,
1800                          const MemOperand& operand) {
1801   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1802   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
1803        << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
1804 }
1805 
ldrsb(Condition cond,Register rt,Label * label)1806 void Disassembler::ldrsb(Condition cond, Register rt, Label* label) {
1807   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
1808   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
1809        << ", "
1810        << PrintLabel(kLoadSignedByteLocation, label, GetCodeAddress() & ~3);
1811 }
1812 
ldrsh(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)1813 void Disassembler::ldrsh(Condition cond,
1814                          EncodingSize size,
1815                          Register rt,
1816                          const MemOperand& operand) {
1817   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1818   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
1819        << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
1820 }
1821 
ldrsh(Condition cond,Register rt,Label * label)1822 void Disassembler::ldrsh(Condition cond, Register rt, Label* label) {
1823   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
1824   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
1825        << ", "
1826        << PrintLabel(kLoadSignedHalfWordLocation, label, GetCodeAddress() & ~3);
1827 }
1828 
lsl(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1829 void Disassembler::lsl(Condition cond,
1830                        EncodingSize size,
1831                        Register rd,
1832                        Register rm,
1833                        const Operand& operand) {
1834   os().SetCurrentInstruction(kLsl, kShift);
1835   os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
1836   os() << " ";
1837   if (!rd.Is(rm)) {
1838     os() << rd << ", ";
1839   }
1840   os() << rm << ", " << operand;
1841 }
1842 
lsls(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1843 void Disassembler::lsls(Condition cond,
1844                         EncodingSize size,
1845                         Register rd,
1846                         Register rm,
1847                         const Operand& operand) {
1848   os().SetCurrentInstruction(kLsls, kShift);
1849   os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
1850   os() << " ";
1851   if (!rd.Is(rm)) {
1852     os() << rd << ", ";
1853   }
1854   os() << rm << ", " << operand;
1855 }
1856 
lsr(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1857 void Disassembler::lsr(Condition cond,
1858                        EncodingSize size,
1859                        Register rd,
1860                        Register rm,
1861                        const Operand& operand) {
1862   os().SetCurrentInstruction(kLsr, kShift);
1863   os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
1864   os() << " ";
1865   if (!rd.Is(rm)) {
1866     os() << rd << ", ";
1867   }
1868   os() << rm << ", " << operand;
1869 }
1870 
lsrs(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)1871 void Disassembler::lsrs(Condition cond,
1872                         EncodingSize size,
1873                         Register rd,
1874                         Register rm,
1875                         const Operand& operand) {
1876   os().SetCurrentInstruction(kLsrs, kShift);
1877   os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
1878   os() << " ";
1879   if (!rd.Is(rm)) {
1880     os() << rd << ", ";
1881   }
1882   os() << rm << ", " << operand;
1883 }
1884 
mla(Condition cond,Register rd,Register rn,Register rm,Register ra)1885 void Disassembler::mla(
1886     Condition cond, Register rd, Register rn, Register rm, Register ra) {
1887   os().SetCurrentInstruction(kMla, kArithmetic);
1888   os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
1889        << ", " << rn << ", " << rm << ", " << ra;
1890 }
1891 
mlas(Condition cond,Register rd,Register rn,Register rm,Register ra)1892 void Disassembler::mlas(
1893     Condition cond, Register rd, Register rn, Register rm, Register ra) {
1894   os().SetCurrentInstruction(kMlas, kArithmetic);
1895   os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
1896        << ", " << rn << ", " << rm << ", " << ra;
1897 }
1898 
mls(Condition cond,Register rd,Register rn,Register rm,Register ra)1899 void Disassembler::mls(
1900     Condition cond, Register rd, Register rn, Register rm, Register ra) {
1901   os().SetCurrentInstruction(kMls, kArithmetic);
1902   os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
1903        << ", " << rn << ", " << rm << ", " << ra;
1904 }
1905 
mov(Condition cond,EncodingSize size,Register rd,const Operand & operand)1906 void Disassembler::mov(Condition cond,
1907                        EncodingSize size,
1908                        Register rd,
1909                        const Operand& operand) {
1910   os().SetCurrentInstruction(kMov, kNoAttribute);
1911   os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
1912        << rd << ", " << operand;
1913 }
1914 
movs(Condition cond,EncodingSize size,Register rd,const Operand & operand)1915 void Disassembler::movs(Condition cond,
1916                         EncodingSize size,
1917                         Register rd,
1918                         const Operand& operand) {
1919   os().SetCurrentInstruction(kMovs, kNoAttribute);
1920   os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
1921        << rd << ", " << operand;
1922 }
1923 
movt(Condition cond,Register rd,const Operand & operand)1924 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
1925   os().SetCurrentInstruction(kMovt, kNoAttribute);
1926   os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
1927        << ", " << operand;
1928 }
1929 
movw(Condition cond,Register rd,const Operand & operand)1930 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
1931   os().SetCurrentInstruction(kMovw, kNoAttribute);
1932   os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
1933        << ", " << operand;
1934 }
1935 
mrs(Condition cond,Register rd,SpecialRegister spec_reg)1936 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
1937   os().SetCurrentInstruction(kMrs, kNoAttribute);
1938   os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
1939        << ", " << spec_reg;
1940 }
1941 
msr(Condition cond,MaskedSpecialRegister spec_reg,const Operand & operand)1942 void Disassembler::msr(Condition cond,
1943                        MaskedSpecialRegister spec_reg,
1944                        const Operand& operand) {
1945   os().SetCurrentInstruction(kMsr, kNoAttribute);
1946   os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
1947        << spec_reg << ", " << operand;
1948 }
1949 
mul(Condition cond,EncodingSize size,Register rd,Register rn,Register rm)1950 void Disassembler::mul(
1951     Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
1952   os().SetCurrentInstruction(kMul, kArithmetic);
1953   os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
1954        << rd << ", " << rn << ", " << rm;
1955 }
1956 
muls(Condition cond,Register rd,Register rn,Register rm)1957 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
1958   os().SetCurrentInstruction(kMuls, kArithmetic);
1959   os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
1960        << ", " << rn << ", " << rm;
1961 }
1962 
mvn(Condition cond,EncodingSize size,Register rd,const Operand & operand)1963 void Disassembler::mvn(Condition cond,
1964                        EncodingSize size,
1965                        Register rd,
1966                        const Operand& operand) {
1967   os().SetCurrentInstruction(kMvn, kNoAttribute);
1968   os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
1969        << rd << ", " << operand;
1970 }
1971 
mvns(Condition cond,EncodingSize size,Register rd,const Operand & operand)1972 void Disassembler::mvns(Condition cond,
1973                         EncodingSize size,
1974                         Register rd,
1975                         const Operand& operand) {
1976   os().SetCurrentInstruction(kMvns, kNoAttribute);
1977   os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
1978        << rd << ", " << operand;
1979 }
1980 
nop(Condition cond,EncodingSize size)1981 void Disassembler::nop(Condition cond, EncodingSize size) {
1982   os().SetCurrentInstruction(kNop, kNoAttribute);
1983   os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
1984 }
1985 
orn(Condition cond,Register rd,Register rn,const Operand & operand)1986 void Disassembler::orn(Condition cond,
1987                        Register rd,
1988                        Register rn,
1989                        const Operand& operand) {
1990   os().SetCurrentInstruction(kOrn, kBitwise);
1991   os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
1992   os() << " ";
1993   if (!rd.Is(rn)) {
1994     os() << rd << ", ";
1995   }
1996   os() << rn << ", " << operand;
1997 }
1998 
orns(Condition cond,Register rd,Register rn,const Operand & operand)1999 void Disassembler::orns(Condition cond,
2000                         Register rd,
2001                         Register rn,
2002                         const Operand& operand) {
2003   os().SetCurrentInstruction(kOrns, kBitwise);
2004   os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
2005   os() << " ";
2006   if (!rd.Is(rn)) {
2007     os() << rd << ", ";
2008   }
2009   os() << rn << ", " << operand;
2010 }
2011 
orr(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2012 void Disassembler::orr(Condition cond,
2013                        EncodingSize size,
2014                        Register rd,
2015                        Register rn,
2016                        const Operand& operand) {
2017   os().SetCurrentInstruction(kOrr, kBitwise);
2018   os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
2019   os() << " ";
2020   if (!rd.Is(rn)) {
2021     os() << rd << ", ";
2022   }
2023   os() << rn << ", " << operand;
2024 }
2025 
orrs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2026 void Disassembler::orrs(Condition cond,
2027                         EncodingSize size,
2028                         Register rd,
2029                         Register rn,
2030                         const Operand& operand) {
2031   os().SetCurrentInstruction(kOrrs, kBitwise);
2032   os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
2033   os() << " ";
2034   if (!rd.Is(rn)) {
2035     os() << rd << ", ";
2036   }
2037   os() << rn << ", " << operand;
2038 }
2039 
pkhbt(Condition cond,Register rd,Register rn,const Operand & operand)2040 void Disassembler::pkhbt(Condition cond,
2041                          Register rd,
2042                          Register rn,
2043                          const Operand& operand) {
2044   os().SetCurrentInstruction(kPkhbt, kNoAttribute);
2045   os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
2046   os() << " ";
2047   if (!rd.Is(rn)) {
2048     os() << rd << ", ";
2049   }
2050   os() << rn << ", " << operand;
2051 }
2052 
pkhtb(Condition cond,Register rd,Register rn,const Operand & operand)2053 void Disassembler::pkhtb(Condition cond,
2054                          Register rd,
2055                          Register rn,
2056                          const Operand& operand) {
2057   os().SetCurrentInstruction(kPkhtb, kNoAttribute);
2058   os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
2059   os() << " ";
2060   if (!rd.Is(rn)) {
2061     os() << rd << ", ";
2062   }
2063   os() << rn << ", " << operand;
2064 }
2065 
pld(Condition cond,Label * label)2066 void Disassembler::pld(Condition cond, Label* label) {
2067   os().SetCurrentInstruction(kPld, kAddress);
2068   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2069        << PrintLabel(kDataLocation, label, GetCodeAddress() & ~3);
2070 }
2071 
pld(Condition cond,const MemOperand & operand)2072 void Disassembler::pld(Condition cond, const MemOperand& operand) {
2073   os().SetCurrentInstruction(kPld, kAddress);
2074   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
2075        << PrintMemOperand(kDataLocation, operand);
2076 }
2077 
pldw(Condition cond,const MemOperand & operand)2078 void Disassembler::pldw(Condition cond, const MemOperand& operand) {
2079   os().SetCurrentInstruction(kPldw, kAddress);
2080   os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
2081        << PrintMemOperand(kDataLocation, operand);
2082 }
2083 
pli(Condition cond,const MemOperand & operand)2084 void Disassembler::pli(Condition cond, const MemOperand& operand) {
2085   os().SetCurrentInstruction(kPli, kAddress);
2086   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2087        << PrintMemOperand(kCodeLocation, operand);
2088 }
2089 
pli(Condition cond,Label * label)2090 void Disassembler::pli(Condition cond, Label* label) {
2091   os().SetCurrentInstruction(kPli, kAddress);
2092   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
2093        << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3);
2094 }
2095 
pop(Condition cond,EncodingSize size,RegisterList registers)2096 void Disassembler::pop(Condition cond,
2097                        EncodingSize size,
2098                        RegisterList registers) {
2099   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2100   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2101        << registers;
2102 }
2103 
pop(Condition cond,EncodingSize size,Register rt)2104 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
2105   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
2106   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
2107        << "{" << rt << "}";
2108 }
2109 
push(Condition cond,EncodingSize size,RegisterList registers)2110 void Disassembler::push(Condition cond,
2111                         EncodingSize size,
2112                         RegisterList registers) {
2113   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2114   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2115        << registers;
2116 }
2117 
push(Condition cond,EncodingSize size,Register rt)2118 void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
2119   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
2120   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
2121        << "{" << rt << "}";
2122 }
2123 
qadd(Condition cond,Register rd,Register rm,Register rn)2124 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
2125   os().SetCurrentInstruction(kQadd, kArithmetic);
2126   os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
2127   os() << " ";
2128   if (!rd.Is(rm)) {
2129     os() << rd << ", ";
2130   }
2131   os() << rm << ", " << rn;
2132 }
2133 
qadd16(Condition cond,Register rd,Register rn,Register rm)2134 void Disassembler::qadd16(Condition cond,
2135                           Register rd,
2136                           Register rn,
2137                           Register rm) {
2138   os().SetCurrentInstruction(kQadd16, kArithmetic);
2139   os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
2140   os() << " ";
2141   if (!rd.Is(rn)) {
2142     os() << rd << ", ";
2143   }
2144   os() << rn << ", " << rm;
2145 }
2146 
qadd8(Condition cond,Register rd,Register rn,Register rm)2147 void Disassembler::qadd8(Condition cond,
2148                          Register rd,
2149                          Register rn,
2150                          Register rm) {
2151   os().SetCurrentInstruction(kQadd8, kArithmetic);
2152   os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
2153   os() << " ";
2154   if (!rd.Is(rn)) {
2155     os() << rd << ", ";
2156   }
2157   os() << rn << ", " << rm;
2158 }
2159 
qasx(Condition cond,Register rd,Register rn,Register rm)2160 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
2161   os().SetCurrentInstruction(kQasx, kArithmetic);
2162   os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
2163   os() << " ";
2164   if (!rd.Is(rn)) {
2165     os() << rd << ", ";
2166   }
2167   os() << rn << ", " << rm;
2168 }
2169 
qdadd(Condition cond,Register rd,Register rm,Register rn)2170 void Disassembler::qdadd(Condition cond,
2171                          Register rd,
2172                          Register rm,
2173                          Register rn) {
2174   os().SetCurrentInstruction(kQdadd, kArithmetic);
2175   os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
2176   os() << " ";
2177   if (!rd.Is(rm)) {
2178     os() << rd << ", ";
2179   }
2180   os() << rm << ", " << rn;
2181 }
2182 
qdsub(Condition cond,Register rd,Register rm,Register rn)2183 void Disassembler::qdsub(Condition cond,
2184                          Register rd,
2185                          Register rm,
2186                          Register rn) {
2187   os().SetCurrentInstruction(kQdsub, kArithmetic);
2188   os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
2189   os() << " ";
2190   if (!rd.Is(rm)) {
2191     os() << rd << ", ";
2192   }
2193   os() << rm << ", " << rn;
2194 }
2195 
qsax(Condition cond,Register rd,Register rn,Register rm)2196 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
2197   os().SetCurrentInstruction(kQsax, kArithmetic);
2198   os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
2199   os() << " ";
2200   if (!rd.Is(rn)) {
2201     os() << rd << ", ";
2202   }
2203   os() << rn << ", " << rm;
2204 }
2205 
qsub(Condition cond,Register rd,Register rm,Register rn)2206 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
2207   os().SetCurrentInstruction(kQsub, kArithmetic);
2208   os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
2209   os() << " ";
2210   if (!rd.Is(rm)) {
2211     os() << rd << ", ";
2212   }
2213   os() << rm << ", " << rn;
2214 }
2215 
qsub16(Condition cond,Register rd,Register rn,Register rm)2216 void Disassembler::qsub16(Condition cond,
2217                           Register rd,
2218                           Register rn,
2219                           Register rm) {
2220   os().SetCurrentInstruction(kQsub16, kArithmetic);
2221   os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
2222   os() << " ";
2223   if (!rd.Is(rn)) {
2224     os() << rd << ", ";
2225   }
2226   os() << rn << ", " << rm;
2227 }
2228 
qsub8(Condition cond,Register rd,Register rn,Register rm)2229 void Disassembler::qsub8(Condition cond,
2230                          Register rd,
2231                          Register rn,
2232                          Register rm) {
2233   os().SetCurrentInstruction(kQsub8, kArithmetic);
2234   os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
2235   os() << " ";
2236   if (!rd.Is(rn)) {
2237     os() << rd << ", ";
2238   }
2239   os() << rn << ", " << rm;
2240 }
2241 
rbit(Condition cond,Register rd,Register rm)2242 void Disassembler::rbit(Condition cond, Register rd, Register rm) {
2243   os().SetCurrentInstruction(kRbit, kNoAttribute);
2244   os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
2245        << ", " << rm;
2246 }
2247 
rev(Condition cond,EncodingSize size,Register rd,Register rm)2248 void Disassembler::rev(Condition cond,
2249                        EncodingSize size,
2250                        Register rd,
2251                        Register rm) {
2252   os().SetCurrentInstruction(kRev, kNoAttribute);
2253   os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
2254        << rd << ", " << rm;
2255 }
2256 
rev16(Condition cond,EncodingSize size,Register rd,Register rm)2257 void Disassembler::rev16(Condition cond,
2258                          EncodingSize size,
2259                          Register rd,
2260                          Register rm) {
2261   os().SetCurrentInstruction(kRev16, kNoAttribute);
2262   os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
2263        << rd << ", " << rm;
2264 }
2265 
revsh(Condition cond,EncodingSize size,Register rd,Register rm)2266 void Disassembler::revsh(Condition cond,
2267                          EncodingSize size,
2268                          Register rd,
2269                          Register rm) {
2270   os().SetCurrentInstruction(kRevsh, kNoAttribute);
2271   os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
2272        << rd << ", " << rm;
2273 }
2274 
ror(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)2275 void Disassembler::ror(Condition cond,
2276                        EncodingSize size,
2277                        Register rd,
2278                        Register rm,
2279                        const Operand& operand) {
2280   os().SetCurrentInstruction(kRor, kShift);
2281   os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
2282   os() << " ";
2283   if (!rd.Is(rm)) {
2284     os() << rd << ", ";
2285   }
2286   os() << rm << ", " << operand;
2287 }
2288 
rors(Condition cond,EncodingSize size,Register rd,Register rm,const Operand & operand)2289 void Disassembler::rors(Condition cond,
2290                         EncodingSize size,
2291                         Register rd,
2292                         Register rm,
2293                         const Operand& operand) {
2294   os().SetCurrentInstruction(kRors, kShift);
2295   os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
2296   os() << " ";
2297   if (!rd.Is(rm)) {
2298     os() << rd << ", ";
2299   }
2300   os() << rm << ", " << operand;
2301 }
2302 
rrx(Condition cond,Register rd,Register rm)2303 void Disassembler::rrx(Condition cond, Register rd, Register rm) {
2304   os().SetCurrentInstruction(kRrx, kShift);
2305   os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
2306   os() << " ";
2307   if (!rd.Is(rm)) {
2308     os() << rd << ", ";
2309   }
2310   os() << rm;
2311 }
2312 
rrxs(Condition cond,Register rd,Register rm)2313 void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
2314   os().SetCurrentInstruction(kRrxs, kShift);
2315   os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
2316   os() << " ";
2317   if (!rd.Is(rm)) {
2318     os() << rd << ", ";
2319   }
2320   os() << rm;
2321 }
2322 
rsb(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2323 void Disassembler::rsb(Condition cond,
2324                        EncodingSize size,
2325                        Register rd,
2326                        Register rn,
2327                        const Operand& operand) {
2328   os().SetCurrentInstruction(kRsb, kArithmetic);
2329   os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
2330   os() << " ";
2331   if (!rd.Is(rn)) {
2332     os() << rd << ", ";
2333   }
2334   os() << rn << ", " << operand;
2335 }
2336 
rsbs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2337 void Disassembler::rsbs(Condition cond,
2338                         EncodingSize size,
2339                         Register rd,
2340                         Register rn,
2341                         const Operand& operand) {
2342   os().SetCurrentInstruction(kRsbs, kArithmetic);
2343   os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
2344   os() << " ";
2345   if (!rd.Is(rn)) {
2346     os() << rd << ", ";
2347   }
2348   os() << rn << ", " << operand;
2349 }
2350 
rsc(Condition cond,Register rd,Register rn,const Operand & operand)2351 void Disassembler::rsc(Condition cond,
2352                        Register rd,
2353                        Register rn,
2354                        const Operand& operand) {
2355   os().SetCurrentInstruction(kRsc, kArithmetic);
2356   os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
2357   os() << " ";
2358   if (!rd.Is(rn)) {
2359     os() << rd << ", ";
2360   }
2361   os() << rn << ", " << operand;
2362 }
2363 
rscs(Condition cond,Register rd,Register rn,const Operand & operand)2364 void Disassembler::rscs(Condition cond,
2365                         Register rd,
2366                         Register rn,
2367                         const Operand& operand) {
2368   os().SetCurrentInstruction(kRscs, kArithmetic);
2369   os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
2370   os() << " ";
2371   if (!rd.Is(rn)) {
2372     os() << rd << ", ";
2373   }
2374   os() << rn << ", " << operand;
2375 }
2376 
sadd16(Condition cond,Register rd,Register rn,Register rm)2377 void Disassembler::sadd16(Condition cond,
2378                           Register rd,
2379                           Register rn,
2380                           Register rm) {
2381   os().SetCurrentInstruction(kSadd16, kArithmetic);
2382   os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
2383   os() << " ";
2384   if (!rd.Is(rn)) {
2385     os() << rd << ", ";
2386   }
2387   os() << rn << ", " << rm;
2388 }
2389 
sadd8(Condition cond,Register rd,Register rn,Register rm)2390 void Disassembler::sadd8(Condition cond,
2391                          Register rd,
2392                          Register rn,
2393                          Register rm) {
2394   os().SetCurrentInstruction(kSadd8, kArithmetic);
2395   os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
2396   os() << " ";
2397   if (!rd.Is(rn)) {
2398     os() << rd << ", ";
2399   }
2400   os() << rn << ", " << rm;
2401 }
2402 
sasx(Condition cond,Register rd,Register rn,Register rm)2403 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
2404   os().SetCurrentInstruction(kSasx, kArithmetic);
2405   os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
2406   os() << " ";
2407   if (!rd.Is(rn)) {
2408     os() << rd << ", ";
2409   }
2410   os() << rn << ", " << rm;
2411 }
2412 
sbc(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2413 void Disassembler::sbc(Condition cond,
2414                        EncodingSize size,
2415                        Register rd,
2416                        Register rn,
2417                        const Operand& operand) {
2418   os().SetCurrentInstruction(kSbc, kArithmetic);
2419   os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
2420   os() << " ";
2421   if (!rd.Is(rn)) {
2422     os() << rd << ", ";
2423   }
2424   os() << rn << ", " << operand;
2425 }
2426 
sbcs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)2427 void Disassembler::sbcs(Condition cond,
2428                         EncodingSize size,
2429                         Register rd,
2430                         Register rn,
2431                         const Operand& operand) {
2432   os().SetCurrentInstruction(kSbcs, kArithmetic);
2433   os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
2434   os() << " ";
2435   if (!rd.Is(rn)) {
2436     os() << rd << ", ";
2437   }
2438   os() << rn << ", " << operand;
2439 }
2440 
sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,const Operand & operand)2441 void Disassembler::sbfx(Condition cond,
2442                         Register rd,
2443                         Register rn,
2444                         uint32_t lsb,
2445                         const Operand& operand) {
2446   os().SetCurrentInstruction(kSbfx, kShift);
2447   os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
2448        << ", " << rn << ", "
2449        << "#" << lsb << ", " << operand;
2450 }
2451 
sdiv(Condition cond,Register rd,Register rn,Register rm)2452 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
2453   os().SetCurrentInstruction(kSdiv, kArithmetic);
2454   os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
2455   os() << " ";
2456   if (!rd.Is(rn)) {
2457     os() << rd << ", ";
2458   }
2459   os() << rn << ", " << rm;
2460 }
2461 
sel(Condition cond,Register rd,Register rn,Register rm)2462 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
2463   os().SetCurrentInstruction(kSel, kNoAttribute);
2464   os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
2465   os() << " ";
2466   if (!rd.Is(rn)) {
2467     os() << rd << ", ";
2468   }
2469   os() << rn << ", " << rm;
2470 }
2471 
shadd16(Condition cond,Register rd,Register rn,Register rm)2472 void Disassembler::shadd16(Condition cond,
2473                            Register rd,
2474                            Register rn,
2475                            Register rm) {
2476   os().SetCurrentInstruction(kShadd16, kArithmetic);
2477   os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
2478   os() << " ";
2479   if (!rd.Is(rn)) {
2480     os() << rd << ", ";
2481   }
2482   os() << rn << ", " << rm;
2483 }
2484 
shadd8(Condition cond,Register rd,Register rn,Register rm)2485 void Disassembler::shadd8(Condition cond,
2486                           Register rd,
2487                           Register rn,
2488                           Register rm) {
2489   os().SetCurrentInstruction(kShadd8, kArithmetic);
2490   os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
2491   os() << " ";
2492   if (!rd.Is(rn)) {
2493     os() << rd << ", ";
2494   }
2495   os() << rn << ", " << rm;
2496 }
2497 
shasx(Condition cond,Register rd,Register rn,Register rm)2498 void Disassembler::shasx(Condition cond,
2499                          Register rd,
2500                          Register rn,
2501                          Register rm) {
2502   os().SetCurrentInstruction(kShasx, kArithmetic);
2503   os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
2504   os() << " ";
2505   if (!rd.Is(rn)) {
2506     os() << rd << ", ";
2507   }
2508   os() << rn << ", " << rm;
2509 }
2510 
shsax(Condition cond,Register rd,Register rn,Register rm)2511 void Disassembler::shsax(Condition cond,
2512                          Register rd,
2513                          Register rn,
2514                          Register rm) {
2515   os().SetCurrentInstruction(kShsax, kArithmetic);
2516   os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
2517   os() << " ";
2518   if (!rd.Is(rn)) {
2519     os() << rd << ", ";
2520   }
2521   os() << rn << ", " << rm;
2522 }
2523 
shsub16(Condition cond,Register rd,Register rn,Register rm)2524 void Disassembler::shsub16(Condition cond,
2525                            Register rd,
2526                            Register rn,
2527                            Register rm) {
2528   os().SetCurrentInstruction(kShsub16, kArithmetic);
2529   os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
2530   os() << " ";
2531   if (!rd.Is(rn)) {
2532     os() << rd << ", ";
2533   }
2534   os() << rn << ", " << rm;
2535 }
2536 
shsub8(Condition cond,Register rd,Register rn,Register rm)2537 void Disassembler::shsub8(Condition cond,
2538                           Register rd,
2539                           Register rn,
2540                           Register rm) {
2541   os().SetCurrentInstruction(kShsub8, kArithmetic);
2542   os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
2543   os() << " ";
2544   if (!rd.Is(rn)) {
2545     os() << rd << ", ";
2546   }
2547   os() << rn << ", " << rm;
2548 }
2549 
smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)2550 void Disassembler::smlabb(
2551     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2552   os().SetCurrentInstruction(kSmlabb, kArithmetic);
2553   os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
2554        << ", " << rn << ", " << rm << ", " << ra;
2555 }
2556 
smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)2557 void Disassembler::smlabt(
2558     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2559   os().SetCurrentInstruction(kSmlabt, kArithmetic);
2560   os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
2561        << ", " << rn << ", " << rm << ", " << ra;
2562 }
2563 
smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)2564 void Disassembler::smlad(
2565     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2566   os().SetCurrentInstruction(kSmlad, kArithmetic);
2567   os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
2568        << ", " << rn << ", " << rm << ", " << ra;
2569 }
2570 
smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)2571 void Disassembler::smladx(
2572     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2573   os().SetCurrentInstruction(kSmladx, kArithmetic);
2574   os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
2575        << ", " << rn << ", " << rm << ", " << ra;
2576 }
2577 
smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2578 void Disassembler::smlal(
2579     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2580   os().SetCurrentInstruction(kSmlal, kArithmetic);
2581   os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
2582        << ", " << rdhi << ", " << rn << ", " << rm;
2583 }
2584 
smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2585 void Disassembler::smlalbb(
2586     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2587   os().SetCurrentInstruction(kSmlalbb, kArithmetic);
2588   os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
2589        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2590 }
2591 
smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2592 void Disassembler::smlalbt(
2593     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2594   os().SetCurrentInstruction(kSmlalbt, kArithmetic);
2595   os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
2596        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2597 }
2598 
smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2599 void Disassembler::smlald(
2600     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2601   os().SetCurrentInstruction(kSmlald, kArithmetic);
2602   os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
2603        << ", " << rdhi << ", " << rn << ", " << rm;
2604 }
2605 
smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2606 void Disassembler::smlaldx(
2607     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2608   os().SetCurrentInstruction(kSmlaldx, kArithmetic);
2609   os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
2610        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2611 }
2612 
smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2613 void Disassembler::smlals(
2614     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2615   os().SetCurrentInstruction(kSmlals, kArithmetic);
2616   os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
2617        << ", " << rdhi << ", " << rn << ", " << rm;
2618 }
2619 
smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2620 void Disassembler::smlaltb(
2621     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2622   os().SetCurrentInstruction(kSmlaltb, kArithmetic);
2623   os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
2624        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2625 }
2626 
smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2627 void Disassembler::smlaltt(
2628     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2629   os().SetCurrentInstruction(kSmlaltt, kArithmetic);
2630   os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
2631        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2632 }
2633 
smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)2634 void Disassembler::smlatb(
2635     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2636   os().SetCurrentInstruction(kSmlatb, kArithmetic);
2637   os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
2638        << ", " << rn << ", " << rm << ", " << ra;
2639 }
2640 
smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)2641 void Disassembler::smlatt(
2642     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2643   os().SetCurrentInstruction(kSmlatt, kArithmetic);
2644   os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
2645        << ", " << rn << ", " << rm << ", " << ra;
2646 }
2647 
smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)2648 void Disassembler::smlawb(
2649     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2650   os().SetCurrentInstruction(kSmlawb, kArithmetic);
2651   os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
2652        << ", " << rn << ", " << rm << ", " << ra;
2653 }
2654 
smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)2655 void Disassembler::smlawt(
2656     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2657   os().SetCurrentInstruction(kSmlawt, kArithmetic);
2658   os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
2659        << ", " << rn << ", " << rm << ", " << ra;
2660 }
2661 
smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)2662 void Disassembler::smlsd(
2663     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2664   os().SetCurrentInstruction(kSmlsd, kArithmetic);
2665   os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
2666        << ", " << rn << ", " << rm << ", " << ra;
2667 }
2668 
smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)2669 void Disassembler::smlsdx(
2670     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2671   os().SetCurrentInstruction(kSmlsdx, kArithmetic);
2672   os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
2673        << ", " << rn << ", " << rm << ", " << ra;
2674 }
2675 
smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2676 void Disassembler::smlsld(
2677     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2678   os().SetCurrentInstruction(kSmlsld, kArithmetic);
2679   os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
2680        << ", " << rdhi << ", " << rn << ", " << rm;
2681 }
2682 
smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2683 void Disassembler::smlsldx(
2684     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2685   os().SetCurrentInstruction(kSmlsldx, kArithmetic);
2686   os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
2687        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
2688 }
2689 
smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)2690 void Disassembler::smmla(
2691     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2692   os().SetCurrentInstruction(kSmmla, kArithmetic);
2693   os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
2694        << ", " << rn << ", " << rm << ", " << ra;
2695 }
2696 
smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)2697 void Disassembler::smmlar(
2698     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2699   os().SetCurrentInstruction(kSmmlar, kArithmetic);
2700   os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
2701        << ", " << rn << ", " << rm << ", " << ra;
2702 }
2703 
smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)2704 void Disassembler::smmls(
2705     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2706   os().SetCurrentInstruction(kSmmls, kArithmetic);
2707   os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
2708        << ", " << rn << ", " << rm << ", " << ra;
2709 }
2710 
smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)2711 void Disassembler::smmlsr(
2712     Condition cond, Register rd, Register rn, Register rm, Register ra) {
2713   os().SetCurrentInstruction(kSmmlsr, kArithmetic);
2714   os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
2715        << ", " << rn << ", " << rm << ", " << ra;
2716 }
2717 
smmul(Condition cond,Register rd,Register rn,Register rm)2718 void Disassembler::smmul(Condition cond,
2719                          Register rd,
2720                          Register rn,
2721                          Register rm) {
2722   os().SetCurrentInstruction(kSmmul, kArithmetic);
2723   os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
2724   os() << " ";
2725   if (!rd.Is(rn)) {
2726     os() << rd << ", ";
2727   }
2728   os() << rn << ", " << rm;
2729 }
2730 
smmulr(Condition cond,Register rd,Register rn,Register rm)2731 void Disassembler::smmulr(Condition cond,
2732                           Register rd,
2733                           Register rn,
2734                           Register rm) {
2735   os().SetCurrentInstruction(kSmmulr, kArithmetic);
2736   os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
2737   os() << " ";
2738   if (!rd.Is(rn)) {
2739     os() << rd << ", ";
2740   }
2741   os() << rn << ", " << rm;
2742 }
2743 
smuad(Condition cond,Register rd,Register rn,Register rm)2744 void Disassembler::smuad(Condition cond,
2745                          Register rd,
2746                          Register rn,
2747                          Register rm) {
2748   os().SetCurrentInstruction(kSmuad, kArithmetic);
2749   os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
2750   os() << " ";
2751   if (!rd.Is(rn)) {
2752     os() << rd << ", ";
2753   }
2754   os() << rn << ", " << rm;
2755 }
2756 
smuadx(Condition cond,Register rd,Register rn,Register rm)2757 void Disassembler::smuadx(Condition cond,
2758                           Register rd,
2759                           Register rn,
2760                           Register rm) {
2761   os().SetCurrentInstruction(kSmuadx, kArithmetic);
2762   os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
2763   os() << " ";
2764   if (!rd.Is(rn)) {
2765     os() << rd << ", ";
2766   }
2767   os() << rn << ", " << rm;
2768 }
2769 
smulbb(Condition cond,Register rd,Register rn,Register rm)2770 void Disassembler::smulbb(Condition cond,
2771                           Register rd,
2772                           Register rn,
2773                           Register rm) {
2774   os().SetCurrentInstruction(kSmulbb, kArithmetic);
2775   os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
2776   os() << " ";
2777   if (!rd.Is(rn)) {
2778     os() << rd << ", ";
2779   }
2780   os() << rn << ", " << rm;
2781 }
2782 
smulbt(Condition cond,Register rd,Register rn,Register rm)2783 void Disassembler::smulbt(Condition cond,
2784                           Register rd,
2785                           Register rn,
2786                           Register rm) {
2787   os().SetCurrentInstruction(kSmulbt, kArithmetic);
2788   os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
2789   os() << " ";
2790   if (!rd.Is(rn)) {
2791     os() << rd << ", ";
2792   }
2793   os() << rn << ", " << rm;
2794 }
2795 
smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2796 void Disassembler::smull(
2797     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2798   os().SetCurrentInstruction(kSmull, kArithmetic);
2799   os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
2800        << ", " << rdhi << ", " << rn << ", " << rm;
2801 }
2802 
smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)2803 void Disassembler::smulls(
2804     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
2805   os().SetCurrentInstruction(kSmulls, kArithmetic);
2806   os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
2807        << ", " << rdhi << ", " << rn << ", " << rm;
2808 }
2809 
smultb(Condition cond,Register rd,Register rn,Register rm)2810 void Disassembler::smultb(Condition cond,
2811                           Register rd,
2812                           Register rn,
2813                           Register rm) {
2814   os().SetCurrentInstruction(kSmultb, kArithmetic);
2815   os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
2816   os() << " ";
2817   if (!rd.Is(rn)) {
2818     os() << rd << ", ";
2819   }
2820   os() << rn << ", " << rm;
2821 }
2822 
smultt(Condition cond,Register rd,Register rn,Register rm)2823 void Disassembler::smultt(Condition cond,
2824                           Register rd,
2825                           Register rn,
2826                           Register rm) {
2827   os().SetCurrentInstruction(kSmultt, kArithmetic);
2828   os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
2829   os() << " ";
2830   if (!rd.Is(rn)) {
2831     os() << rd << ", ";
2832   }
2833   os() << rn << ", " << rm;
2834 }
2835 
smulwb(Condition cond,Register rd,Register rn,Register rm)2836 void Disassembler::smulwb(Condition cond,
2837                           Register rd,
2838                           Register rn,
2839                           Register rm) {
2840   os().SetCurrentInstruction(kSmulwb, kArithmetic);
2841   os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
2842   os() << " ";
2843   if (!rd.Is(rn)) {
2844     os() << rd << ", ";
2845   }
2846   os() << rn << ", " << rm;
2847 }
2848 
smulwt(Condition cond,Register rd,Register rn,Register rm)2849 void Disassembler::smulwt(Condition cond,
2850                           Register rd,
2851                           Register rn,
2852                           Register rm) {
2853   os().SetCurrentInstruction(kSmulwt, kArithmetic);
2854   os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
2855   os() << " ";
2856   if (!rd.Is(rn)) {
2857     os() << rd << ", ";
2858   }
2859   os() << rn << ", " << rm;
2860 }
2861 
smusd(Condition cond,Register rd,Register rn,Register rm)2862 void Disassembler::smusd(Condition cond,
2863                          Register rd,
2864                          Register rn,
2865                          Register rm) {
2866   os().SetCurrentInstruction(kSmusd, kArithmetic);
2867   os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
2868   os() << " ";
2869   if (!rd.Is(rn)) {
2870     os() << rd << ", ";
2871   }
2872   os() << rn << ", " << rm;
2873 }
2874 
smusdx(Condition cond,Register rd,Register rn,Register rm)2875 void Disassembler::smusdx(Condition cond,
2876                           Register rd,
2877                           Register rn,
2878                           Register rm) {
2879   os().SetCurrentInstruction(kSmusdx, kArithmetic);
2880   os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
2881   os() << " ";
2882   if (!rd.Is(rn)) {
2883     os() << rd << ", ";
2884   }
2885   os() << rn << ", " << rm;
2886 }
2887 
ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)2888 void Disassembler::ssat(Condition cond,
2889                         Register rd,
2890                         uint32_t imm,
2891                         const Operand& operand) {
2892   os().SetCurrentInstruction(kSsat, kArithmetic);
2893   os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
2894        << ", "
2895        << "#" << imm << ", " << operand;
2896 }
2897 
ssat16(Condition cond,Register rd,uint32_t imm,Register rn)2898 void Disassembler::ssat16(Condition cond,
2899                           Register rd,
2900                           uint32_t imm,
2901                           Register rn) {
2902   os().SetCurrentInstruction(kSsat16, kArithmetic);
2903   os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
2904        << ", "
2905        << "#" << imm << ", " << rn;
2906 }
2907 
ssax(Condition cond,Register rd,Register rn,Register rm)2908 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
2909   os().SetCurrentInstruction(kSsax, kArithmetic);
2910   os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
2911   os() << " ";
2912   if (!rd.Is(rn)) {
2913     os() << rd << ", ";
2914   }
2915   os() << rn << ", " << rm;
2916 }
2917 
ssub16(Condition cond,Register rd,Register rn,Register rm)2918 void Disassembler::ssub16(Condition cond,
2919                           Register rd,
2920                           Register rn,
2921                           Register rm) {
2922   os().SetCurrentInstruction(kSsub16, kArithmetic);
2923   os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
2924   os() << " ";
2925   if (!rd.Is(rn)) {
2926     os() << rd << ", ";
2927   }
2928   os() << rn << ", " << rm;
2929 }
2930 
ssub8(Condition cond,Register rd,Register rn,Register rm)2931 void Disassembler::ssub8(Condition cond,
2932                          Register rd,
2933                          Register rn,
2934                          Register rm) {
2935   os().SetCurrentInstruction(kSsub8, kArithmetic);
2936   os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
2937   os() << " ";
2938   if (!rd.Is(rn)) {
2939     os() << rd << ", ";
2940   }
2941   os() << rn << ", " << rm;
2942 }
2943 
stl(Condition cond,Register rt,const MemOperand & operand)2944 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
2945   os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
2946   os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
2947        << ", " << PrintMemOperand(kStoreWordLocation, operand);
2948 }
2949 
stlb(Condition cond,Register rt,const MemOperand & operand)2950 void Disassembler::stlb(Condition cond,
2951                         Register rt,
2952                         const MemOperand& operand) {
2953   os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
2954   os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
2955        << ", " << PrintMemOperand(kStoreByteLocation, operand);
2956 }
2957 
stlex(Condition cond,Register rd,Register rt,const MemOperand & operand)2958 void Disassembler::stlex(Condition cond,
2959                          Register rd,
2960                          Register rt,
2961                          const MemOperand& operand) {
2962   os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
2963   os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
2964        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
2965 }
2966 
stlexb(Condition cond,Register rd,Register rt,const MemOperand & operand)2967 void Disassembler::stlexb(Condition cond,
2968                           Register rd,
2969                           Register rt,
2970                           const MemOperand& operand) {
2971   os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
2972   os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
2973        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
2974 }
2975 
stlexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)2976 void Disassembler::stlexd(Condition cond,
2977                           Register rd,
2978                           Register rt,
2979                           Register rt2,
2980                           const MemOperand& operand) {
2981   os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
2982   os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
2983        << ", " << rt << ", " << rt2 << ", "
2984        << PrintMemOperand(kStoreDoubleWordLocation, operand);
2985 }
2986 
stlexh(Condition cond,Register rd,Register rt,const MemOperand & operand)2987 void Disassembler::stlexh(Condition cond,
2988                           Register rd,
2989                           Register rt,
2990                           const MemOperand& operand) {
2991   os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
2992   os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
2993        << ", " << rt << ", "
2994        << PrintMemOperand(kStoreHalfWordLocation, operand);
2995 }
2996 
stlh(Condition cond,Register rt,const MemOperand & operand)2997 void Disassembler::stlh(Condition cond,
2998                         Register rt,
2999                         const MemOperand& operand) {
3000   os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
3001   os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
3002        << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3003 }
3004 
stm(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)3005 void Disassembler::stm(Condition cond,
3006                        EncodingSize size,
3007                        Register rn,
3008                        WriteBack write_back,
3009                        RegisterList registers) {
3010   os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
3011   os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
3012        << rn << write_back << ", " << registers;
3013 }
3014 
stmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3015 void Disassembler::stmda(Condition cond,
3016                          Register rn,
3017                          WriteBack write_back,
3018                          RegisterList registers) {
3019   os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
3020   os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
3021        << write_back << ", " << registers;
3022 }
3023 
stmdb(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)3024 void Disassembler::stmdb(Condition cond,
3025                          EncodingSize size,
3026                          Register rn,
3027                          WriteBack write_back,
3028                          RegisterList registers) {
3029   os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
3030   os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
3031        << rn << write_back << ", " << registers;
3032 }
3033 
stmea(Condition cond,EncodingSize size,Register rn,WriteBack write_back,RegisterList registers)3034 void Disassembler::stmea(Condition cond,
3035                          EncodingSize size,
3036                          Register rn,
3037                          WriteBack write_back,
3038                          RegisterList registers) {
3039   os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
3040   os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
3041        << rn << write_back << ", " << registers;
3042 }
3043 
stmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3044 void Disassembler::stmed(Condition cond,
3045                          Register rn,
3046                          WriteBack write_back,
3047                          RegisterList registers) {
3048   os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
3049   os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
3050        << write_back << ", " << registers;
3051 }
3052 
stmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3053 void Disassembler::stmfa(Condition cond,
3054                          Register rn,
3055                          WriteBack write_back,
3056                          RegisterList registers) {
3057   os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
3058   os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
3059        << write_back << ", " << registers;
3060 }
3061 
stmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3062 void Disassembler::stmfd(Condition cond,
3063                          Register rn,
3064                          WriteBack write_back,
3065                          RegisterList registers) {
3066   os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
3067   os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
3068        << write_back << ", " << registers;
3069 }
3070 
stmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)3071 void Disassembler::stmib(Condition cond,
3072                          Register rn,
3073                          WriteBack write_back,
3074                          RegisterList registers) {
3075   os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
3076   os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
3077        << write_back << ", " << registers;
3078 }
3079 
str(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)3080 void Disassembler::str(Condition cond,
3081                        EncodingSize size,
3082                        Register rt,
3083                        const MemOperand& operand) {
3084   os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
3085   os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
3086        << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3087 }
3088 
strb(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)3089 void Disassembler::strb(Condition cond,
3090                         EncodingSize size,
3091                         Register rt,
3092                         const MemOperand& operand) {
3093   os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
3094   os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
3095        << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3096 }
3097 
strd(Condition cond,Register rt,Register rt2,const MemOperand & operand)3098 void Disassembler::strd(Condition cond,
3099                         Register rt,
3100                         Register rt2,
3101                         const MemOperand& operand) {
3102   os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
3103   os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
3104        << ", " << rt2 << ", "
3105        << PrintMemOperand(kStoreDoubleWordLocation, operand);
3106 }
3107 
strex(Condition cond,Register rd,Register rt,const MemOperand & operand)3108 void Disassembler::strex(Condition cond,
3109                          Register rd,
3110                          Register rt,
3111                          const MemOperand& operand) {
3112   os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
3113   os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
3114        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
3115 }
3116 
strexb(Condition cond,Register rd,Register rt,const MemOperand & operand)3117 void Disassembler::strexb(Condition cond,
3118                           Register rd,
3119                           Register rt,
3120                           const MemOperand& operand) {
3121   os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
3122   os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
3123        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
3124 }
3125 
strexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)3126 void Disassembler::strexd(Condition cond,
3127                           Register rd,
3128                           Register rt,
3129                           Register rt2,
3130                           const MemOperand& operand) {
3131   os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
3132   os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
3133        << ", " << rt << ", " << rt2 << ", "
3134        << PrintMemOperand(kStoreDoubleWordLocation, operand);
3135 }
3136 
strexh(Condition cond,Register rd,Register rt,const MemOperand & operand)3137 void Disassembler::strexh(Condition cond,
3138                           Register rd,
3139                           Register rt,
3140                           const MemOperand& operand) {
3141   os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
3142   os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
3143        << ", " << rt << ", "
3144        << PrintMemOperand(kStoreHalfWordLocation, operand);
3145 }
3146 
strh(Condition cond,EncodingSize size,Register rt,const MemOperand & operand)3147 void Disassembler::strh(Condition cond,
3148                         EncodingSize size,
3149                         Register rt,
3150                         const MemOperand& operand) {
3151   os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
3152   os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
3153        << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
3154 }
3155 
sub(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)3156 void Disassembler::sub(Condition cond,
3157                        EncodingSize size,
3158                        Register rd,
3159                        Register rn,
3160                        const Operand& operand) {
3161   os().SetCurrentInstruction(kSub, kArithmetic);
3162   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
3163   os() << " ";
3164   if (!rd.Is(rn)) {
3165     os() << rd << ", ";
3166   }
3167   os() << rn << ", " << operand;
3168 }
3169 
sub(Condition cond,Register rd,const Operand & operand)3170 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
3171   os().SetCurrentInstruction(kSub, kArithmetic);
3172   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
3173        << ", " << operand;
3174 }
3175 
subs(Condition cond,EncodingSize size,Register rd,Register rn,const Operand & operand)3176 void Disassembler::subs(Condition cond,
3177                         EncodingSize size,
3178                         Register rd,
3179                         Register rn,
3180                         const Operand& operand) {
3181   os().SetCurrentInstruction(kSubs, kArithmetic);
3182   os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
3183   os() << " ";
3184   if (!rd.Is(rn)) {
3185     os() << rd << ", ";
3186   }
3187   os() << rn << ", " << operand;
3188 }
3189 
subs(Register rd,const Operand & operand)3190 void Disassembler::subs(Register rd, const Operand& operand) {
3191   os().SetCurrentInstruction(kSubs, kArithmetic);
3192   os() << ToCString(kSubs) << " " << rd << ", " << operand;
3193 }
3194 
subw(Condition cond,Register rd,Register rn,const Operand & operand)3195 void Disassembler::subw(Condition cond,
3196                         Register rd,
3197                         Register rn,
3198                         const Operand& operand) {
3199   os().SetCurrentInstruction(kSubw, kArithmetic);
3200   os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
3201   os() << " ";
3202   if (!rd.Is(rn)) {
3203     os() << rd << ", ";
3204   }
3205   os() << rn << ", " << operand;
3206 }
3207 
svc(Condition cond,uint32_t imm)3208 void Disassembler::svc(Condition cond, uint32_t imm) {
3209   os().SetCurrentInstruction(kSvc, kSystem);
3210   os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " " << imm;
3211 }
3212 
sxtab(Condition cond,Register rd,Register rn,const Operand & operand)3213 void Disassembler::sxtab(Condition cond,
3214                          Register rd,
3215                          Register rn,
3216                          const Operand& operand) {
3217   os().SetCurrentInstruction(kSxtab, kArithmetic);
3218   os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
3219   os() << " ";
3220   if (!rd.Is(rn)) {
3221     os() << rd << ", ";
3222   }
3223   os() << rn << ", " << operand;
3224 }
3225 
sxtab16(Condition cond,Register rd,Register rn,const Operand & operand)3226 void Disassembler::sxtab16(Condition cond,
3227                            Register rd,
3228                            Register rn,
3229                            const Operand& operand) {
3230   os().SetCurrentInstruction(kSxtab16, kArithmetic);
3231   os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
3232   os() << " ";
3233   if (!rd.Is(rn)) {
3234     os() << rd << ", ";
3235   }
3236   os() << rn << ", " << operand;
3237 }
3238 
sxtah(Condition cond,Register rd,Register rn,const Operand & operand)3239 void Disassembler::sxtah(Condition cond,
3240                          Register rd,
3241                          Register rn,
3242                          const Operand& operand) {
3243   os().SetCurrentInstruction(kSxtah, kArithmetic);
3244   os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
3245   os() << " ";
3246   if (!rd.Is(rn)) {
3247     os() << rd << ", ";
3248   }
3249   os() << rn << ", " << operand;
3250 }
3251 
sxtb(Condition cond,EncodingSize size,Register rd,const Operand & operand)3252 void Disassembler::sxtb(Condition cond,
3253                         EncodingSize size,
3254                         Register rd,
3255                         const Operand& operand) {
3256   os().SetCurrentInstruction(kSxtb, kArithmetic);
3257   os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
3258   os() << " ";
3259   if (!rd.Is(operand.GetBaseRegister())) {
3260     os() << rd << ", ";
3261   }
3262   os() << operand;
3263 }
3264 
sxtb16(Condition cond,Register rd,const Operand & operand)3265 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
3266   os().SetCurrentInstruction(kSxtb16, kArithmetic);
3267   os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
3268   os() << " ";
3269   if (!rd.Is(operand.GetBaseRegister())) {
3270     os() << rd << ", ";
3271   }
3272   os() << operand;
3273 }
3274 
sxth(Condition cond,EncodingSize size,Register rd,const Operand & operand)3275 void Disassembler::sxth(Condition cond,
3276                         EncodingSize size,
3277                         Register rd,
3278                         const Operand& operand) {
3279   os().SetCurrentInstruction(kSxth, kArithmetic);
3280   os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
3281   os() << " ";
3282   if (!rd.Is(operand.GetBaseRegister())) {
3283     os() << rd << ", ";
3284   }
3285   os() << operand;
3286 }
3287 
tbb(Condition cond,Register rn,Register rm)3288 void Disassembler::tbb(Condition cond, Register rn, Register rm) {
3289   os().SetCurrentInstruction(kTbb, kBranch);
3290   os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
3291        << MemOperand(rn, rm);
3292 }
3293 
tbh(Condition cond,Register rn,Register rm)3294 void Disassembler::tbh(Condition cond, Register rn, Register rm) {
3295   os().SetCurrentInstruction(kTbh, kBranch);
3296   os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
3297        << MemOperand(rn, plus, rm, LSL, 1);
3298 }
3299 
teq(Condition cond,Register rn,const Operand & operand)3300 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
3301   os().SetCurrentInstruction(kTeq, kBitwise);
3302   os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
3303        << ", " << operand;
3304 }
3305 
tst(Condition cond,EncodingSize size,Register rn,const Operand & operand)3306 void Disassembler::tst(Condition cond,
3307                        EncodingSize size,
3308                        Register rn,
3309                        const Operand& operand) {
3310   os().SetCurrentInstruction(kTst, kBitwise);
3311   os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
3312        << rn << ", " << operand;
3313 }
3314 
uadd16(Condition cond,Register rd,Register rn,Register rm)3315 void Disassembler::uadd16(Condition cond,
3316                           Register rd,
3317                           Register rn,
3318                           Register rm) {
3319   os().SetCurrentInstruction(kUadd16, kArithmetic);
3320   os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
3321   os() << " ";
3322   if (!rd.Is(rn)) {
3323     os() << rd << ", ";
3324   }
3325   os() << rn << ", " << rm;
3326 }
3327 
uadd8(Condition cond,Register rd,Register rn,Register rm)3328 void Disassembler::uadd8(Condition cond,
3329                          Register rd,
3330                          Register rn,
3331                          Register rm) {
3332   os().SetCurrentInstruction(kUadd8, kArithmetic);
3333   os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
3334   os() << " ";
3335   if (!rd.Is(rn)) {
3336     os() << rd << ", ";
3337   }
3338   os() << rn << ", " << rm;
3339 }
3340 
uasx(Condition cond,Register rd,Register rn,Register rm)3341 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
3342   os().SetCurrentInstruction(kUasx, kArithmetic);
3343   os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
3344   os() << " ";
3345   if (!rd.Is(rn)) {
3346     os() << rd << ", ";
3347   }
3348   os() << rn << ", " << rm;
3349 }
3350 
ubfx(Condition cond,Register rd,Register rn,uint32_t lsb,const Operand & operand)3351 void Disassembler::ubfx(Condition cond,
3352                         Register rd,
3353                         Register rn,
3354                         uint32_t lsb,
3355                         const Operand& operand) {
3356   os().SetCurrentInstruction(kUbfx, kShift);
3357   os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
3358        << ", " << rn << ", "
3359        << "#" << lsb << ", " << operand;
3360 }
3361 
udf(Condition cond,EncodingSize size,uint32_t imm)3362 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
3363   os().SetCurrentInstruction(kUdf, kNoAttribute);
3364   os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
3365        << imm;
3366 }
3367 
udiv(Condition cond,Register rd,Register rn,Register rm)3368 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
3369   os().SetCurrentInstruction(kUdiv, kArithmetic);
3370   os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
3371   os() << " ";
3372   if (!rd.Is(rn)) {
3373     os() << rd << ", ";
3374   }
3375   os() << rn << ", " << rm;
3376 }
3377 
uhadd16(Condition cond,Register rd,Register rn,Register rm)3378 void Disassembler::uhadd16(Condition cond,
3379                            Register rd,
3380                            Register rn,
3381                            Register rm) {
3382   os().SetCurrentInstruction(kUhadd16, kArithmetic);
3383   os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
3384   os() << " ";
3385   if (!rd.Is(rn)) {
3386     os() << rd << ", ";
3387   }
3388   os() << rn << ", " << rm;
3389 }
3390 
uhadd8(Condition cond,Register rd,Register rn,Register rm)3391 void Disassembler::uhadd8(Condition cond,
3392                           Register rd,
3393                           Register rn,
3394                           Register rm) {
3395   os().SetCurrentInstruction(kUhadd8, kArithmetic);
3396   os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
3397   os() << " ";
3398   if (!rd.Is(rn)) {
3399     os() << rd << ", ";
3400   }
3401   os() << rn << ", " << rm;
3402 }
3403 
uhasx(Condition cond,Register rd,Register rn,Register rm)3404 void Disassembler::uhasx(Condition cond,
3405                          Register rd,
3406                          Register rn,
3407                          Register rm) {
3408   os().SetCurrentInstruction(kUhasx, kArithmetic);
3409   os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
3410   os() << " ";
3411   if (!rd.Is(rn)) {
3412     os() << rd << ", ";
3413   }
3414   os() << rn << ", " << rm;
3415 }
3416 
uhsax(Condition cond,Register rd,Register rn,Register rm)3417 void Disassembler::uhsax(Condition cond,
3418                          Register rd,
3419                          Register rn,
3420                          Register rm) {
3421   os().SetCurrentInstruction(kUhsax, kArithmetic);
3422   os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
3423   os() << " ";
3424   if (!rd.Is(rn)) {
3425     os() << rd << ", ";
3426   }
3427   os() << rn << ", " << rm;
3428 }
3429 
uhsub16(Condition cond,Register rd,Register rn,Register rm)3430 void Disassembler::uhsub16(Condition cond,
3431                            Register rd,
3432                            Register rn,
3433                            Register rm) {
3434   os().SetCurrentInstruction(kUhsub16, kArithmetic);
3435   os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
3436   os() << " ";
3437   if (!rd.Is(rn)) {
3438     os() << rd << ", ";
3439   }
3440   os() << rn << ", " << rm;
3441 }
3442 
uhsub8(Condition cond,Register rd,Register rn,Register rm)3443 void Disassembler::uhsub8(Condition cond,
3444                           Register rd,
3445                           Register rn,
3446                           Register rm) {
3447   os().SetCurrentInstruction(kUhsub8, kArithmetic);
3448   os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
3449   os() << " ";
3450   if (!rd.Is(rn)) {
3451     os() << rd << ", ";
3452   }
3453   os() << rn << ", " << rm;
3454 }
3455 
umaal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3456 void Disassembler::umaal(
3457     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3458   os().SetCurrentInstruction(kUmaal, kArithmetic);
3459   os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3460        << ", " << rdhi << ", " << rn << ", " << rm;
3461 }
3462 
umlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3463 void Disassembler::umlal(
3464     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3465   os().SetCurrentInstruction(kUmlal, kArithmetic);
3466   os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
3467        << ", " << rdhi << ", " << rn << ", " << rm;
3468 }
3469 
umlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3470 void Disassembler::umlals(
3471     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3472   os().SetCurrentInstruction(kUmlals, kArithmetic);
3473   os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
3474        << ", " << rdhi << ", " << rn << ", " << rm;
3475 }
3476 
umull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3477 void Disassembler::umull(
3478     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3479   os().SetCurrentInstruction(kUmull, kArithmetic);
3480   os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
3481        << ", " << rdhi << ", " << rn << ", " << rm;
3482 }
3483 
umulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3484 void Disassembler::umulls(
3485     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3486   os().SetCurrentInstruction(kUmulls, kArithmetic);
3487   os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
3488        << ", " << rdhi << ", " << rn << ", " << rm;
3489 }
3490 
uqadd16(Condition cond,Register rd,Register rn,Register rm)3491 void Disassembler::uqadd16(Condition cond,
3492                            Register rd,
3493                            Register rn,
3494                            Register rm) {
3495   os().SetCurrentInstruction(kUqadd16, kArithmetic);
3496   os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
3497   os() << " ";
3498   if (!rd.Is(rn)) {
3499     os() << rd << ", ";
3500   }
3501   os() << rn << ", " << rm;
3502 }
3503 
uqadd8(Condition cond,Register rd,Register rn,Register rm)3504 void Disassembler::uqadd8(Condition cond,
3505                           Register rd,
3506                           Register rn,
3507                           Register rm) {
3508   os().SetCurrentInstruction(kUqadd8, kArithmetic);
3509   os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
3510   os() << " ";
3511   if (!rd.Is(rn)) {
3512     os() << rd << ", ";
3513   }
3514   os() << rn << ", " << rm;
3515 }
3516 
uqasx(Condition cond,Register rd,Register rn,Register rm)3517 void Disassembler::uqasx(Condition cond,
3518                          Register rd,
3519                          Register rn,
3520                          Register rm) {
3521   os().SetCurrentInstruction(kUqasx, kArithmetic);
3522   os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
3523   os() << " ";
3524   if (!rd.Is(rn)) {
3525     os() << rd << ", ";
3526   }
3527   os() << rn << ", " << rm;
3528 }
3529 
uqsax(Condition cond,Register rd,Register rn,Register rm)3530 void Disassembler::uqsax(Condition cond,
3531                          Register rd,
3532                          Register rn,
3533                          Register rm) {
3534   os().SetCurrentInstruction(kUqsax, kArithmetic);
3535   os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
3536   os() << " ";
3537   if (!rd.Is(rn)) {
3538     os() << rd << ", ";
3539   }
3540   os() << rn << ", " << rm;
3541 }
3542 
uqsub16(Condition cond,Register rd,Register rn,Register rm)3543 void Disassembler::uqsub16(Condition cond,
3544                            Register rd,
3545                            Register rn,
3546                            Register rm) {
3547   os().SetCurrentInstruction(kUqsub16, kArithmetic);
3548   os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
3549   os() << " ";
3550   if (!rd.Is(rn)) {
3551     os() << rd << ", ";
3552   }
3553   os() << rn << ", " << rm;
3554 }
3555 
uqsub8(Condition cond,Register rd,Register rn,Register rm)3556 void Disassembler::uqsub8(Condition cond,
3557                           Register rd,
3558                           Register rn,
3559                           Register rm) {
3560   os().SetCurrentInstruction(kUqsub8, kArithmetic);
3561   os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
3562   os() << " ";
3563   if (!rd.Is(rn)) {
3564     os() << rd << ", ";
3565   }
3566   os() << rn << ", " << rm;
3567 }
3568 
usad8(Condition cond,Register rd,Register rn,Register rm)3569 void Disassembler::usad8(Condition cond,
3570                          Register rd,
3571                          Register rn,
3572                          Register rm) {
3573   os().SetCurrentInstruction(kUsad8, kArithmetic);
3574   os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
3575   os() << " ";
3576   if (!rd.Is(rn)) {
3577     os() << rd << ", ";
3578   }
3579   os() << rn << ", " << rm;
3580 }
3581 
usada8(Condition cond,Register rd,Register rn,Register rm,Register ra)3582 void Disassembler::usada8(
3583     Condition cond, Register rd, Register rn, Register rm, Register ra) {
3584   os().SetCurrentInstruction(kUsada8, kArithmetic);
3585   os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
3586        << ", " << rn << ", " << rm << ", " << ra;
3587 }
3588 
usat(Condition cond,Register rd,uint32_t imm,const Operand & operand)3589 void Disassembler::usat(Condition cond,
3590                         Register rd,
3591                         uint32_t imm,
3592                         const Operand& operand) {
3593   os().SetCurrentInstruction(kUsat, kArithmetic);
3594   os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
3595        << ", "
3596        << "#" << imm << ", " << operand;
3597 }
3598 
usat16(Condition cond,Register rd,uint32_t imm,Register rn)3599 void Disassembler::usat16(Condition cond,
3600                           Register rd,
3601                           uint32_t imm,
3602                           Register rn) {
3603   os().SetCurrentInstruction(kUsat16, kArithmetic);
3604   os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
3605        << ", "
3606        << "#" << imm << ", " << rn;
3607 }
3608 
usax(Condition cond,Register rd,Register rn,Register rm)3609 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
3610   os().SetCurrentInstruction(kUsax, kArithmetic);
3611   os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
3612   os() << " ";
3613   if (!rd.Is(rn)) {
3614     os() << rd << ", ";
3615   }
3616   os() << rn << ", " << rm;
3617 }
3618 
usub16(Condition cond,Register rd,Register rn,Register rm)3619 void Disassembler::usub16(Condition cond,
3620                           Register rd,
3621                           Register rn,
3622                           Register rm) {
3623   os().SetCurrentInstruction(kUsub16, kArithmetic);
3624   os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
3625   os() << " ";
3626   if (!rd.Is(rn)) {
3627     os() << rd << ", ";
3628   }
3629   os() << rn << ", " << rm;
3630 }
3631 
usub8(Condition cond,Register rd,Register rn,Register rm)3632 void Disassembler::usub8(Condition cond,
3633                          Register rd,
3634                          Register rn,
3635                          Register rm) {
3636   os().SetCurrentInstruction(kUsub8, kArithmetic);
3637   os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
3638   os() << " ";
3639   if (!rd.Is(rn)) {
3640     os() << rd << ", ";
3641   }
3642   os() << rn << ", " << rm;
3643 }
3644 
uxtab(Condition cond,Register rd,Register rn,const Operand & operand)3645 void Disassembler::uxtab(Condition cond,
3646                          Register rd,
3647                          Register rn,
3648                          const Operand& operand) {
3649   os().SetCurrentInstruction(kUxtab, kArithmetic);
3650   os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
3651   os() << " ";
3652   if (!rd.Is(rn)) {
3653     os() << rd << ", ";
3654   }
3655   os() << rn << ", " << operand;
3656 }
3657 
uxtab16(Condition cond,Register rd,Register rn,const Operand & operand)3658 void Disassembler::uxtab16(Condition cond,
3659                            Register rd,
3660                            Register rn,
3661                            const Operand& operand) {
3662   os().SetCurrentInstruction(kUxtab16, kArithmetic);
3663   os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
3664   os() << " ";
3665   if (!rd.Is(rn)) {
3666     os() << rd << ", ";
3667   }
3668   os() << rn << ", " << operand;
3669 }
3670 
uxtah(Condition cond,Register rd,Register rn,const Operand & operand)3671 void Disassembler::uxtah(Condition cond,
3672                          Register rd,
3673                          Register rn,
3674                          const Operand& operand) {
3675   os().SetCurrentInstruction(kUxtah, kArithmetic);
3676   os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
3677   os() << " ";
3678   if (!rd.Is(rn)) {
3679     os() << rd << ", ";
3680   }
3681   os() << rn << ", " << operand;
3682 }
3683 
uxtb(Condition cond,EncodingSize size,Register rd,const Operand & operand)3684 void Disassembler::uxtb(Condition cond,
3685                         EncodingSize size,
3686                         Register rd,
3687                         const Operand& operand) {
3688   os().SetCurrentInstruction(kUxtb, kArithmetic);
3689   os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
3690   os() << " ";
3691   if (!rd.Is(operand.GetBaseRegister())) {
3692     os() << rd << ", ";
3693   }
3694   os() << operand;
3695 }
3696 
uxtb16(Condition cond,Register rd,const Operand & operand)3697 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
3698   os().SetCurrentInstruction(kUxtb16, kArithmetic);
3699   os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
3700   os() << " ";
3701   if (!rd.Is(operand.GetBaseRegister())) {
3702     os() << rd << ", ";
3703   }
3704   os() << operand;
3705 }
3706 
uxth(Condition cond,EncodingSize size,Register rd,const Operand & operand)3707 void Disassembler::uxth(Condition cond,
3708                         EncodingSize size,
3709                         Register rd,
3710                         const Operand& operand) {
3711   os().SetCurrentInstruction(kUxth, kArithmetic);
3712   os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
3713   os() << " ";
3714   if (!rd.Is(operand.GetBaseRegister())) {
3715     os() << rd << ", ";
3716   }
3717   os() << operand;
3718 }
3719 
vaba(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3720 void Disassembler::vaba(
3721     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3722   os().SetCurrentInstruction(kVaba, kFpNeon);
3723   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3724        << rd << ", " << rn << ", " << rm;
3725 }
3726 
vaba(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3727 void Disassembler::vaba(
3728     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3729   os().SetCurrentInstruction(kVaba, kFpNeon);
3730   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
3731        << rd << ", " << rn << ", " << rm;
3732 }
3733 
vabal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)3734 void Disassembler::vabal(
3735     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3736   os().SetCurrentInstruction(kVabal, kFpNeon);
3737   os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
3738        << rd << ", " << rn << ", " << rm;
3739 }
3740 
vabd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3741 void Disassembler::vabd(
3742     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3743   os().SetCurrentInstruction(kVabd, kFpNeon);
3744   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3745   os() << " ";
3746   if (!rd.Is(rn)) {
3747     os() << rd << ", ";
3748   }
3749   os() << rn << ", " << rm;
3750 }
3751 
vabd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3752 void Disassembler::vabd(
3753     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3754   os().SetCurrentInstruction(kVabd, kFpNeon);
3755   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
3756   os() << " ";
3757   if (!rd.Is(rn)) {
3758     os() << rd << ", ";
3759   }
3760   os() << rn << ", " << rm;
3761 }
3762 
vabdl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)3763 void Disassembler::vabdl(
3764     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3765   os().SetCurrentInstruction(kVabdl, kFpNeon);
3766   os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
3767        << rd << ", " << rn << ", " << rm;
3768 }
3769 
vabs(Condition cond,DataType dt,DRegister rd,DRegister rm)3770 void Disassembler::vabs(Condition cond,
3771                         DataType dt,
3772                         DRegister rd,
3773                         DRegister rm) {
3774   os().SetCurrentInstruction(kVabs, kFpNeon);
3775   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3776        << rd << ", " << rm;
3777 }
3778 
vabs(Condition cond,DataType dt,QRegister rd,QRegister rm)3779 void Disassembler::vabs(Condition cond,
3780                         DataType dt,
3781                         QRegister rd,
3782                         QRegister rm) {
3783   os().SetCurrentInstruction(kVabs, kFpNeon);
3784   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3785        << rd << ", " << rm;
3786 }
3787 
vabs(Condition cond,DataType dt,SRegister rd,SRegister rm)3788 void Disassembler::vabs(Condition cond,
3789                         DataType dt,
3790                         SRegister rd,
3791                         SRegister rm) {
3792   os().SetCurrentInstruction(kVabs, kFpNeon);
3793   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
3794        << rd << ", " << rm;
3795 }
3796 
vacge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3797 void Disassembler::vacge(
3798     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3799   os().SetCurrentInstruction(kVacge, kFpNeon);
3800   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3801   os() << " ";
3802   if (!rd.Is(rn)) {
3803     os() << rd << ", ";
3804   }
3805   os() << rn << ", " << rm;
3806 }
3807 
vacge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3808 void Disassembler::vacge(
3809     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3810   os().SetCurrentInstruction(kVacge, kFpNeon);
3811   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
3812   os() << " ";
3813   if (!rd.Is(rn)) {
3814     os() << rd << ", ";
3815   }
3816   os() << rn << ", " << rm;
3817 }
3818 
vacgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3819 void Disassembler::vacgt(
3820     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3821   os().SetCurrentInstruction(kVacgt, kFpNeon);
3822   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
3823   os() << " ";
3824   if (!rd.Is(rn)) {
3825     os() << rd << ", ";
3826   }
3827   os() << rn << ", " << rm;
3828 }
3829 
vacgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3830 void Disassembler::vacgt(
3831     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3832   os().SetCurrentInstruction(kVacgt, kFpNeon);
3833   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
3834   os() << " ";
3835   if (!rd.Is(rn)) {
3836     os() << rd << ", ";
3837   }
3838   os() << rn << ", " << rm;
3839 }
3840 
vacle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3841 void Disassembler::vacle(
3842     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3843   os().SetCurrentInstruction(kVacle, kFpNeon);
3844   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
3845   os() << " ";
3846   if (!rd.Is(rn)) {
3847     os() << rd << ", ";
3848   }
3849   os() << rn << ", " << rm;
3850 }
3851 
vacle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3852 void Disassembler::vacle(
3853     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3854   os().SetCurrentInstruction(kVacle, kFpNeon);
3855   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
3856   os() << " ";
3857   if (!rd.Is(rn)) {
3858     os() << rd << ", ";
3859   }
3860   os() << rn << ", " << rm;
3861 }
3862 
vaclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3863 void Disassembler::vaclt(
3864     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3865   os().SetCurrentInstruction(kVaclt, kFpNeon);
3866   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
3867   os() << " ";
3868   if (!rd.Is(rn)) {
3869     os() << rd << ", ";
3870   }
3871   os() << rn << ", " << rm;
3872 }
3873 
vaclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3874 void Disassembler::vaclt(
3875     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3876   os().SetCurrentInstruction(kVaclt, kFpNeon);
3877   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
3878   os() << " ";
3879   if (!rd.Is(rn)) {
3880     os() << rd << ", ";
3881   }
3882   os() << rn << ", " << rm;
3883 }
3884 
vadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3885 void Disassembler::vadd(
3886     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
3887   os().SetCurrentInstruction(kVadd, kFpNeon);
3888   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3889   os() << " ";
3890   if (!rd.Is(rn)) {
3891     os() << rd << ", ";
3892   }
3893   os() << rn << ", " << rm;
3894 }
3895 
vadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)3896 void Disassembler::vadd(
3897     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
3898   os().SetCurrentInstruction(kVadd, kFpNeon);
3899   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3900   os() << " ";
3901   if (!rd.Is(rn)) {
3902     os() << rd << ", ";
3903   }
3904   os() << rn << ", " << rm;
3905 }
3906 
vadd(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)3907 void Disassembler::vadd(
3908     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
3909   os().SetCurrentInstruction(kVadd, kFpNeon);
3910   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
3911   os() << " ";
3912   if (!rd.Is(rn)) {
3913     os() << rd << ", ";
3914   }
3915   os() << rn << ", " << rm;
3916 }
3917 
vaddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)3918 void Disassembler::vaddhn(
3919     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
3920   os().SetCurrentInstruction(kVaddhn, kFpNeon);
3921   os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
3922        << rd << ", " << rn << ", " << rm;
3923 }
3924 
vaddl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)3925 void Disassembler::vaddl(
3926     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
3927   os().SetCurrentInstruction(kVaddl, kFpNeon);
3928   os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
3929        << rd << ", " << rn << ", " << rm;
3930 }
3931 
vaddw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)3932 void Disassembler::vaddw(
3933     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
3934   os().SetCurrentInstruction(kVaddw, kFpNeon);
3935   os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
3936   os() << " ";
3937   if (!rd.Is(rn)) {
3938     os() << rd << ", ";
3939   }
3940   os() << rn << ", " << rm;
3941 }
3942 
vand(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)3943 void Disassembler::vand(Condition cond,
3944                         DataType dt,
3945                         DRegister rd,
3946                         DRegister rn,
3947                         const DOperand& operand) {
3948   os().SetCurrentInstruction(kVand, kFpNeon);
3949   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3950   os() << " ";
3951   if (!rd.Is(rn)) {
3952     os() << rd << ", ";
3953   }
3954   os() << rn << ", " << operand;
3955 }
3956 
vand(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)3957 void Disassembler::vand(Condition cond,
3958                         DataType dt,
3959                         QRegister rd,
3960                         QRegister rn,
3961                         const QOperand& operand) {
3962   os().SetCurrentInstruction(kVand, kFpNeon);
3963   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
3964   os() << " ";
3965   if (!rd.Is(rn)) {
3966     os() << rd << ", ";
3967   }
3968   os() << rn << ", " << operand;
3969 }
3970 
vbic(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)3971 void Disassembler::vbic(Condition cond,
3972                         DataType dt,
3973                         DRegister rd,
3974                         DRegister rn,
3975                         const DOperand& operand) {
3976   os().SetCurrentInstruction(kVbic, kFpNeon);
3977   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3978   os() << " ";
3979   if (!rd.Is(rn)) {
3980     os() << rd << ", ";
3981   }
3982   os() << rn << ", " << operand;
3983 }
3984 
vbic(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)3985 void Disassembler::vbic(Condition cond,
3986                         DataType dt,
3987                         QRegister rd,
3988                         QRegister rn,
3989                         const QOperand& operand) {
3990   os().SetCurrentInstruction(kVbic, kFpNeon);
3991   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
3992   os() << " ";
3993   if (!rd.Is(rn)) {
3994     os() << rd << ", ";
3995   }
3996   os() << rn << ", " << operand;
3997 }
3998 
vbif(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)3999 void Disassembler::vbif(
4000     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4001   os().SetCurrentInstruction(kVbif, kFpNeon);
4002   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
4003   os() << " ";
4004   if (!rd.Is(rn)) {
4005     os() << rd << ", ";
4006   }
4007   os() << rn << ", " << rm;
4008 }
4009 
vbif(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4010 void Disassembler::vbif(
4011     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4012   os().SetCurrentInstruction(kVbif, kFpNeon);
4013   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
4014   os() << " ";
4015   if (!rd.Is(rn)) {
4016     os() << rd << ", ";
4017   }
4018   os() << rn << ", " << rm;
4019 }
4020 
vbit(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4021 void Disassembler::vbit(
4022     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4023   os().SetCurrentInstruction(kVbit, kFpNeon);
4024   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
4025   os() << " ";
4026   if (!rd.Is(rn)) {
4027     os() << rd << ", ";
4028   }
4029   os() << rn << ", " << rm;
4030 }
4031 
vbit(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4032 void Disassembler::vbit(
4033     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4034   os().SetCurrentInstruction(kVbit, kFpNeon);
4035   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
4036   os() << " ";
4037   if (!rd.Is(rn)) {
4038     os() << rd << ", ";
4039   }
4040   os() << rn << ", " << rm;
4041 }
4042 
vbsl(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4043 void Disassembler::vbsl(
4044     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4045   os().SetCurrentInstruction(kVbsl, kFpNeon);
4046   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
4047   os() << " ";
4048   if (!rd.Is(rn)) {
4049     os() << rd << ", ";
4050   }
4051   os() << rn << ", " << rm;
4052 }
4053 
vbsl(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4054 void Disassembler::vbsl(
4055     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4056   os().SetCurrentInstruction(kVbsl, kFpNeon);
4057   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
4058   os() << " ";
4059   if (!rd.Is(rn)) {
4060     os() << rd << ", ";
4061   }
4062   os() << rn << ", " << rm;
4063 }
4064 
vceq(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4065 void Disassembler::vceq(Condition cond,
4066                         DataType dt,
4067                         DRegister rd,
4068                         DRegister rm,
4069                         const DOperand& operand) {
4070   os().SetCurrentInstruction(kVceq, kFpNeon);
4071   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4072   os() << " ";
4073   if (!rd.Is(rm)) {
4074     os() << rd << ", ";
4075   }
4076   os() << rm << ", " << operand;
4077 }
4078 
vceq(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4079 void Disassembler::vceq(Condition cond,
4080                         DataType dt,
4081                         QRegister rd,
4082                         QRegister rm,
4083                         const QOperand& operand) {
4084   os().SetCurrentInstruction(kVceq, kFpNeon);
4085   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4086   os() << " ";
4087   if (!rd.Is(rm)) {
4088     os() << rd << ", ";
4089   }
4090   os() << rm << ", " << operand;
4091 }
4092 
vceq(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4093 void Disassembler::vceq(
4094     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4095   os().SetCurrentInstruction(kVceq, kFpNeon);
4096   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4097   os() << " ";
4098   if (!rd.Is(rn)) {
4099     os() << rd << ", ";
4100   }
4101   os() << rn << ", " << rm;
4102 }
4103 
vceq(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4104 void Disassembler::vceq(
4105     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4106   os().SetCurrentInstruction(kVceq, kFpNeon);
4107   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
4108   os() << " ";
4109   if (!rd.Is(rn)) {
4110     os() << rd << ", ";
4111   }
4112   os() << rn << ", " << rm;
4113 }
4114 
vcge(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4115 void Disassembler::vcge(Condition cond,
4116                         DataType dt,
4117                         DRegister rd,
4118                         DRegister rm,
4119                         const DOperand& operand) {
4120   os().SetCurrentInstruction(kVcge, kFpNeon);
4121   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4122   os() << " ";
4123   if (!rd.Is(rm)) {
4124     os() << rd << ", ";
4125   }
4126   os() << rm << ", " << operand;
4127 }
4128 
vcge(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4129 void Disassembler::vcge(Condition cond,
4130                         DataType dt,
4131                         QRegister rd,
4132                         QRegister rm,
4133                         const QOperand& operand) {
4134   os().SetCurrentInstruction(kVcge, kFpNeon);
4135   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4136   os() << " ";
4137   if (!rd.Is(rm)) {
4138     os() << rd << ", ";
4139   }
4140   os() << rm << ", " << operand;
4141 }
4142 
vcge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4143 void Disassembler::vcge(
4144     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4145   os().SetCurrentInstruction(kVcge, kFpNeon);
4146   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4147   os() << " ";
4148   if (!rd.Is(rn)) {
4149     os() << rd << ", ";
4150   }
4151   os() << rn << ", " << rm;
4152 }
4153 
vcge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4154 void Disassembler::vcge(
4155     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4156   os().SetCurrentInstruction(kVcge, kFpNeon);
4157   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
4158   os() << " ";
4159   if (!rd.Is(rn)) {
4160     os() << rd << ", ";
4161   }
4162   os() << rn << ", " << rm;
4163 }
4164 
vcgt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4165 void Disassembler::vcgt(Condition cond,
4166                         DataType dt,
4167                         DRegister rd,
4168                         DRegister rm,
4169                         const DOperand& operand) {
4170   os().SetCurrentInstruction(kVcgt, kFpNeon);
4171   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4172   os() << " ";
4173   if (!rd.Is(rm)) {
4174     os() << rd << ", ";
4175   }
4176   os() << rm << ", " << operand;
4177 }
4178 
vcgt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4179 void Disassembler::vcgt(Condition cond,
4180                         DataType dt,
4181                         QRegister rd,
4182                         QRegister rm,
4183                         const QOperand& operand) {
4184   os().SetCurrentInstruction(kVcgt, kFpNeon);
4185   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4186   os() << " ";
4187   if (!rd.Is(rm)) {
4188     os() << rd << ", ";
4189   }
4190   os() << rm << ", " << operand;
4191 }
4192 
vcgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4193 void Disassembler::vcgt(
4194     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4195   os().SetCurrentInstruction(kVcgt, kFpNeon);
4196   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4197   os() << " ";
4198   if (!rd.Is(rn)) {
4199     os() << rd << ", ";
4200   }
4201   os() << rn << ", " << rm;
4202 }
4203 
vcgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4204 void Disassembler::vcgt(
4205     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4206   os().SetCurrentInstruction(kVcgt, kFpNeon);
4207   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
4208   os() << " ";
4209   if (!rd.Is(rn)) {
4210     os() << rd << ", ";
4211   }
4212   os() << rn << ", " << rm;
4213 }
4214 
vcle(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4215 void Disassembler::vcle(Condition cond,
4216                         DataType dt,
4217                         DRegister rd,
4218                         DRegister rm,
4219                         const DOperand& operand) {
4220   os().SetCurrentInstruction(kVcle, kFpNeon);
4221   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4222   os() << " ";
4223   if (!rd.Is(rm)) {
4224     os() << rd << ", ";
4225   }
4226   os() << rm << ", " << operand;
4227 }
4228 
vcle(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4229 void Disassembler::vcle(Condition cond,
4230                         DataType dt,
4231                         QRegister rd,
4232                         QRegister rm,
4233                         const QOperand& operand) {
4234   os().SetCurrentInstruction(kVcle, kFpNeon);
4235   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4236   os() << " ";
4237   if (!rd.Is(rm)) {
4238     os() << rd << ", ";
4239   }
4240   os() << rm << ", " << operand;
4241 }
4242 
vcle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4243 void Disassembler::vcle(
4244     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4245   os().SetCurrentInstruction(kVcle, kFpNeon);
4246   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4247   os() << " ";
4248   if (!rd.Is(rn)) {
4249     os() << rd << ", ";
4250   }
4251   os() << rn << ", " << rm;
4252 }
4253 
vcle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4254 void Disassembler::vcle(
4255     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4256   os().SetCurrentInstruction(kVcle, kFpNeon);
4257   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
4258   os() << " ";
4259   if (!rd.Is(rn)) {
4260     os() << rd << ", ";
4261   }
4262   os() << rn << ", " << rm;
4263 }
4264 
vcls(Condition cond,DataType dt,DRegister rd,DRegister rm)4265 void Disassembler::vcls(Condition cond,
4266                         DataType dt,
4267                         DRegister rd,
4268                         DRegister rm) {
4269   os().SetCurrentInstruction(kVcls, kFpNeon);
4270   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4271        << rd << ", " << rm;
4272 }
4273 
vcls(Condition cond,DataType dt,QRegister rd,QRegister rm)4274 void Disassembler::vcls(Condition cond,
4275                         DataType dt,
4276                         QRegister rd,
4277                         QRegister rm) {
4278   os().SetCurrentInstruction(kVcls, kFpNeon);
4279   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
4280        << rd << ", " << rm;
4281 }
4282 
vclt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)4283 void Disassembler::vclt(Condition cond,
4284                         DataType dt,
4285                         DRegister rd,
4286                         DRegister rm,
4287                         const DOperand& operand) {
4288   os().SetCurrentInstruction(kVclt, kFpNeon);
4289   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4290   os() << " ";
4291   if (!rd.Is(rm)) {
4292     os() << rd << ", ";
4293   }
4294   os() << rm << ", " << operand;
4295 }
4296 
vclt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)4297 void Disassembler::vclt(Condition cond,
4298                         DataType dt,
4299                         QRegister rd,
4300                         QRegister rm,
4301                         const QOperand& operand) {
4302   os().SetCurrentInstruction(kVclt, kFpNeon);
4303   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4304   os() << " ";
4305   if (!rd.Is(rm)) {
4306     os() << rd << ", ";
4307   }
4308   os() << rm << ", " << operand;
4309 }
4310 
vclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4311 void Disassembler::vclt(
4312     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4313   os().SetCurrentInstruction(kVclt, kFpNeon);
4314   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4315   os() << " ";
4316   if (!rd.Is(rn)) {
4317     os() << rd << ", ";
4318   }
4319   os() << rn << ", " << rm;
4320 }
4321 
vclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4322 void Disassembler::vclt(
4323     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4324   os().SetCurrentInstruction(kVclt, kFpNeon);
4325   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
4326   os() << " ";
4327   if (!rd.Is(rn)) {
4328     os() << rd << ", ";
4329   }
4330   os() << rn << ", " << rm;
4331 }
4332 
vclz(Condition cond,DataType dt,DRegister rd,DRegister rm)4333 void Disassembler::vclz(Condition cond,
4334                         DataType dt,
4335                         DRegister rd,
4336                         DRegister rm) {
4337   os().SetCurrentInstruction(kVclz, kFpNeon);
4338   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4339        << rd << ", " << rm;
4340 }
4341 
vclz(Condition cond,DataType dt,QRegister rd,QRegister rm)4342 void Disassembler::vclz(Condition cond,
4343                         DataType dt,
4344                         QRegister rd,
4345                         QRegister rm) {
4346   os().SetCurrentInstruction(kVclz, kFpNeon);
4347   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
4348        << rd << ", " << rm;
4349 }
4350 
vcmp(Condition cond,DataType dt,SRegister rd,SRegister rm)4351 void Disassembler::vcmp(Condition cond,
4352                         DataType dt,
4353                         SRegister rd,
4354                         SRegister rm) {
4355   os().SetCurrentInstruction(kVcmp, kFpNeon);
4356   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4357        << rd << ", " << rm;
4358 }
4359 
vcmp(Condition cond,DataType dt,DRegister rd,DRegister rm)4360 void Disassembler::vcmp(Condition cond,
4361                         DataType dt,
4362                         DRegister rd,
4363                         DRegister rm) {
4364   os().SetCurrentInstruction(kVcmp, kFpNeon);
4365   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4366        << rd << ", " << rm;
4367 }
4368 
vcmp(Condition cond,DataType dt,SRegister rd,double imm)4369 void Disassembler::vcmp(Condition cond, DataType dt, SRegister rd, double imm) {
4370   os().SetCurrentInstruction(kVcmp, kFpNeon);
4371   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4372        << rd << ", "
4373        << "#" << std::fixed << std::setprecision(1) << imm
4374        << std::resetiosflags(std::ios_base::floatfield);
4375 }
4376 
vcmp(Condition cond,DataType dt,DRegister rd,double imm)4377 void Disassembler::vcmp(Condition cond, DataType dt, DRegister rd, double imm) {
4378   os().SetCurrentInstruction(kVcmp, kFpNeon);
4379   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
4380        << rd << ", "
4381        << "#" << std::fixed << std::setprecision(1) << imm
4382        << std::resetiosflags(std::ios_base::floatfield);
4383 }
4384 
vcmpe(Condition cond,DataType dt,SRegister rd,SRegister rm)4385 void Disassembler::vcmpe(Condition cond,
4386                          DataType dt,
4387                          SRegister rd,
4388                          SRegister rm) {
4389   os().SetCurrentInstruction(kVcmpe, kFpNeon);
4390   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4391        << rd << ", " << rm;
4392 }
4393 
vcmpe(Condition cond,DataType dt,DRegister rd,DRegister rm)4394 void Disassembler::vcmpe(Condition cond,
4395                          DataType dt,
4396                          DRegister rd,
4397                          DRegister rm) {
4398   os().SetCurrentInstruction(kVcmpe, kFpNeon);
4399   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4400        << rd << ", " << rm;
4401 }
4402 
vcmpe(Condition cond,DataType dt,SRegister rd,double imm)4403 void Disassembler::vcmpe(Condition cond,
4404                          DataType dt,
4405                          SRegister rd,
4406                          double imm) {
4407   os().SetCurrentInstruction(kVcmpe, kFpNeon);
4408   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4409        << rd << ", "
4410        << "#" << std::fixed << std::setprecision(1) << imm
4411        << std::resetiosflags(std::ios_base::floatfield);
4412 }
4413 
vcmpe(Condition cond,DataType dt,DRegister rd,double imm)4414 void Disassembler::vcmpe(Condition cond,
4415                          DataType dt,
4416                          DRegister rd,
4417                          double imm) {
4418   os().SetCurrentInstruction(kVcmpe, kFpNeon);
4419   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
4420        << rd << ", "
4421        << "#" << std::fixed << std::setprecision(1) << imm
4422        << std::resetiosflags(std::ios_base::floatfield);
4423 }
4424 
vcnt(Condition cond,DataType dt,DRegister rd,DRegister rm)4425 void Disassembler::vcnt(Condition cond,
4426                         DataType dt,
4427                         DRegister rd,
4428                         DRegister rm) {
4429   os().SetCurrentInstruction(kVcnt, kFpNeon);
4430   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4431        << rd << ", " << rm;
4432 }
4433 
vcnt(Condition cond,DataType dt,QRegister rd,QRegister rm)4434 void Disassembler::vcnt(Condition cond,
4435                         DataType dt,
4436                         QRegister rd,
4437                         QRegister rm) {
4438   os().SetCurrentInstruction(kVcnt, kFpNeon);
4439   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
4440        << rd << ", " << rm;
4441 }
4442 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)4443 void Disassembler::vcvt(
4444     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4445   os().SetCurrentInstruction(kVcvt, kFpNeon);
4446   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4447        << " " << rd << ", " << rm;
4448 }
4449 
vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4450 void Disassembler::vcvt(
4451     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4452   os().SetCurrentInstruction(kVcvt, kFpNeon);
4453   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4454        << " " << rd << ", " << rm;
4455 }
4456 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)4457 void Disassembler::vcvt(Condition cond,
4458                         DataType dt1,
4459                         DataType dt2,
4460                         DRegister rd,
4461                         DRegister rm,
4462                         int32_t fbits) {
4463   os().SetCurrentInstruction(kVcvt, kFpNeon);
4464   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4465        << " " << rd << ", " << rm << ", "
4466        << "#" << fbits;
4467 }
4468 
vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)4469 void Disassembler::vcvt(Condition cond,
4470                         DataType dt1,
4471                         DataType dt2,
4472                         QRegister rd,
4473                         QRegister rm,
4474                         int32_t fbits) {
4475   os().SetCurrentInstruction(kVcvt, kFpNeon);
4476   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4477        << " " << rd << ", " << rm << ", "
4478        << "#" << fbits;
4479 }
4480 
vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)4481 void Disassembler::vcvt(Condition cond,
4482                         DataType dt1,
4483                         DataType dt2,
4484                         SRegister rd,
4485                         SRegister rm,
4486                         int32_t fbits) {
4487   os().SetCurrentInstruction(kVcvt, kFpNeon);
4488   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4489        << " " << rd << ", " << rm << ", "
4490        << "#" << fbits;
4491 }
4492 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)4493 void Disassembler::vcvt(
4494     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
4495   os().SetCurrentInstruction(kVcvt, kFpNeon);
4496   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4497        << " " << rd << ", " << rm;
4498 }
4499 
vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm)4500 void Disassembler::vcvt(
4501     Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
4502   os().SetCurrentInstruction(kVcvt, kFpNeon);
4503   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4504        << " " << rd << ", " << rm;
4505 }
4506 
vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,QRegister rm)4507 void Disassembler::vcvt(
4508     Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
4509   os().SetCurrentInstruction(kVcvt, kFpNeon);
4510   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4511        << " " << rd << ", " << rm;
4512 }
4513 
vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,DRegister rm)4514 void Disassembler::vcvt(
4515     Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
4516   os().SetCurrentInstruction(kVcvt, kFpNeon);
4517   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4518        << " " << rd << ", " << rm;
4519 }
4520 
vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4521 void Disassembler::vcvt(
4522     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4523   os().SetCurrentInstruction(kVcvt, kFpNeon);
4524   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4525        << " " << rd << ", " << rm;
4526 }
4527 
vcvta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4528 void Disassembler::vcvta(DataType dt1,
4529                          DataType dt2,
4530                          DRegister rd,
4531                          DRegister rm) {
4532   os().SetCurrentInstruction(kVcvta, kFpNeon);
4533   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4534 }
4535 
vcvta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4536 void Disassembler::vcvta(DataType dt1,
4537                          DataType dt2,
4538                          QRegister rd,
4539                          QRegister rm) {
4540   os().SetCurrentInstruction(kVcvta, kFpNeon);
4541   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4542 }
4543 
vcvta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4544 void Disassembler::vcvta(DataType dt1,
4545                          DataType dt2,
4546                          SRegister rd,
4547                          SRegister rm) {
4548   os().SetCurrentInstruction(kVcvta, kFpNeon);
4549   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4550 }
4551 
vcvta(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4552 void Disassembler::vcvta(DataType dt1,
4553                          DataType dt2,
4554                          SRegister rd,
4555                          DRegister rm) {
4556   os().SetCurrentInstruction(kVcvta, kFpNeon);
4557   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
4558 }
4559 
vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4560 void Disassembler::vcvtb(
4561     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4562   os().SetCurrentInstruction(kVcvtb, kFpNeon);
4563   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4564        << " " << rd << ", " << rm;
4565 }
4566 
vcvtb(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)4567 void Disassembler::vcvtb(
4568     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4569   os().SetCurrentInstruction(kVcvtb, kFpNeon);
4570   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4571        << " " << rd << ", " << rm;
4572 }
4573 
vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4574 void Disassembler::vcvtb(
4575     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4576   os().SetCurrentInstruction(kVcvtb, kFpNeon);
4577   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4578        << " " << rd << ", " << rm;
4579 }
4580 
vcvtm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4581 void Disassembler::vcvtm(DataType dt1,
4582                          DataType dt2,
4583                          DRegister rd,
4584                          DRegister rm) {
4585   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4586   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4587 }
4588 
vcvtm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4589 void Disassembler::vcvtm(DataType dt1,
4590                          DataType dt2,
4591                          QRegister rd,
4592                          QRegister rm) {
4593   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4594   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4595 }
4596 
vcvtm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4597 void Disassembler::vcvtm(DataType dt1,
4598                          DataType dt2,
4599                          SRegister rd,
4600                          SRegister rm) {
4601   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4602   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4603 }
4604 
vcvtm(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4605 void Disassembler::vcvtm(DataType dt1,
4606                          DataType dt2,
4607                          SRegister rd,
4608                          DRegister rm) {
4609   os().SetCurrentInstruction(kVcvtm, kFpNeon);
4610   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
4611 }
4612 
vcvtn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4613 void Disassembler::vcvtn(DataType dt1,
4614                          DataType dt2,
4615                          DRegister rd,
4616                          DRegister rm) {
4617   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4618   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4619 }
4620 
vcvtn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4621 void Disassembler::vcvtn(DataType dt1,
4622                          DataType dt2,
4623                          QRegister rd,
4624                          QRegister rm) {
4625   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4626   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4627 }
4628 
vcvtn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4629 void Disassembler::vcvtn(DataType dt1,
4630                          DataType dt2,
4631                          SRegister rd,
4632                          SRegister rm) {
4633   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4634   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4635 }
4636 
vcvtn(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4637 void Disassembler::vcvtn(DataType dt1,
4638                          DataType dt2,
4639                          SRegister rd,
4640                          DRegister rm) {
4641   os().SetCurrentInstruction(kVcvtn, kFpNeon);
4642   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
4643 }
4644 
vcvtp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)4645 void Disassembler::vcvtp(DataType dt1,
4646                          DataType dt2,
4647                          DRegister rd,
4648                          DRegister rm) {
4649   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4650   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4651 }
4652 
vcvtp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)4653 void Disassembler::vcvtp(DataType dt1,
4654                          DataType dt2,
4655                          QRegister rd,
4656                          QRegister rm) {
4657   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4658   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4659 }
4660 
vcvtp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)4661 void Disassembler::vcvtp(DataType dt1,
4662                          DataType dt2,
4663                          SRegister rd,
4664                          SRegister rm) {
4665   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4666   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4667 }
4668 
vcvtp(DataType dt1,DataType dt2,SRegister rd,DRegister rm)4669 void Disassembler::vcvtp(DataType dt1,
4670                          DataType dt2,
4671                          SRegister rd,
4672                          DRegister rm) {
4673   os().SetCurrentInstruction(kVcvtp, kFpNeon);
4674   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
4675 }
4676 
vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4677 void Disassembler::vcvtr(
4678     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4679   os().SetCurrentInstruction(kVcvtr, kFpNeon);
4680   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4681        << " " << rd << ", " << rm;
4682 }
4683 
vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4684 void Disassembler::vcvtr(
4685     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4686   os().SetCurrentInstruction(kVcvtr, kFpNeon);
4687   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4688        << " " << rd << ", " << rm;
4689 }
4690 
vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)4691 void Disassembler::vcvtt(
4692     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
4693   os().SetCurrentInstruction(kVcvtt, kFpNeon);
4694   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4695        << " " << rd << ", " << rm;
4696 }
4697 
vcvtt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)4698 void Disassembler::vcvtt(
4699     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
4700   os().SetCurrentInstruction(kVcvtt, kFpNeon);
4701   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4702        << " " << rd << ", " << rm;
4703 }
4704 
vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)4705 void Disassembler::vcvtt(
4706     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
4707   os().SetCurrentInstruction(kVcvtt, kFpNeon);
4708   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
4709        << " " << rd << ", " << rm;
4710 }
4711 
vdiv(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4712 void Disassembler::vdiv(
4713     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4714   os().SetCurrentInstruction(kVdiv, kFpNeon);
4715   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4716   os() << " ";
4717   if (!rd.Is(rn)) {
4718     os() << rd << ", ";
4719   }
4720   os() << rn << ", " << rm;
4721 }
4722 
vdiv(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4723 void Disassembler::vdiv(
4724     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4725   os().SetCurrentInstruction(kVdiv, kFpNeon);
4726   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
4727   os() << " ";
4728   if (!rd.Is(rn)) {
4729     os() << rd << ", ";
4730   }
4731   os() << rn << ", " << rm;
4732 }
4733 
vdup(Condition cond,DataType dt,QRegister rd,Register rt)4734 void Disassembler::vdup(Condition cond,
4735                         DataType dt,
4736                         QRegister rd,
4737                         Register rt) {
4738   os().SetCurrentInstruction(kVdup, kFpNeon);
4739   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4740        << rd << ", " << rt;
4741 }
4742 
vdup(Condition cond,DataType dt,DRegister rd,Register rt)4743 void Disassembler::vdup(Condition cond,
4744                         DataType dt,
4745                         DRegister rd,
4746                         Register rt) {
4747   os().SetCurrentInstruction(kVdup, kFpNeon);
4748   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4749        << rd << ", " << rt;
4750 }
4751 
vdup(Condition cond,DataType dt,DRegister rd,DRegisterLane rm)4752 void Disassembler::vdup(Condition cond,
4753                         DataType dt,
4754                         DRegister rd,
4755                         DRegisterLane rm) {
4756   os().SetCurrentInstruction(kVdup, kFpNeon);
4757   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4758        << rd << ", " << rm;
4759 }
4760 
vdup(Condition cond,DataType dt,QRegister rd,DRegisterLane rm)4761 void Disassembler::vdup(Condition cond,
4762                         DataType dt,
4763                         QRegister rd,
4764                         DRegisterLane rm) {
4765   os().SetCurrentInstruction(kVdup, kFpNeon);
4766   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
4767        << rd << ", " << rm;
4768 }
4769 
veor(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4770 void Disassembler::veor(
4771     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4772   os().SetCurrentInstruction(kVeor, kFpNeon);
4773   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4774   os() << " ";
4775   if (!rd.Is(rn)) {
4776     os() << rd << ", ";
4777   }
4778   os() << rn << ", " << rm;
4779 }
4780 
veor(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4781 void Disassembler::veor(
4782     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4783   os().SetCurrentInstruction(kVeor, kFpNeon);
4784   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
4785   os() << " ";
4786   if (!rd.Is(rn)) {
4787     os() << rd << ", ";
4788   }
4789   os() << rn << ", " << rm;
4790 }
4791 
vext(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)4792 void Disassembler::vext(Condition cond,
4793                         DataType dt,
4794                         DRegister rd,
4795                         DRegister rn,
4796                         DRegister rm,
4797                         const DOperand& operand) {
4798   os().SetCurrentInstruction(kVext, kFpNeon);
4799   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4800   os() << " ";
4801   if (!rd.Is(rn)) {
4802     os() << rd << ", ";
4803   }
4804   os() << rn << ", " << rm << ", " << operand;
4805 }
4806 
vext(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)4807 void Disassembler::vext(Condition cond,
4808                         DataType dt,
4809                         QRegister rd,
4810                         QRegister rn,
4811                         QRegister rm,
4812                         const QOperand& operand) {
4813   os().SetCurrentInstruction(kVext, kFpNeon);
4814   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
4815   os() << " ";
4816   if (!rd.Is(rn)) {
4817     os() << rd << ", ";
4818   }
4819   os() << rn << ", " << rm << ", " << operand;
4820 }
4821 
vfma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4822 void Disassembler::vfma(
4823     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4824   os().SetCurrentInstruction(kVfma, kFpNeon);
4825   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4826        << rd << ", " << rn << ", " << rm;
4827 }
4828 
vfma(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4829 void Disassembler::vfma(
4830     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4831   os().SetCurrentInstruction(kVfma, kFpNeon);
4832   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4833        << rd << ", " << rn << ", " << rm;
4834 }
4835 
vfma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4836 void Disassembler::vfma(
4837     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4838   os().SetCurrentInstruction(kVfma, kFpNeon);
4839   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
4840        << rd << ", " << rn << ", " << rm;
4841 }
4842 
vfms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4843 void Disassembler::vfms(
4844     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4845   os().SetCurrentInstruction(kVfms, kFpNeon);
4846   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4847        << rd << ", " << rn << ", " << rm;
4848 }
4849 
vfms(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4850 void Disassembler::vfms(
4851     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4852   os().SetCurrentInstruction(kVfms, kFpNeon);
4853   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4854        << rd << ", " << rn << ", " << rm;
4855 }
4856 
vfms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4857 void Disassembler::vfms(
4858     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4859   os().SetCurrentInstruction(kVfms, kFpNeon);
4860   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
4861        << rd << ", " << rn << ", " << rm;
4862 }
4863 
vfnma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4864 void Disassembler::vfnma(
4865     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4866   os().SetCurrentInstruction(kVfnma, kFpNeon);
4867   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4868        << rd << ", " << rn << ", " << rm;
4869 }
4870 
vfnma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4871 void Disassembler::vfnma(
4872     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4873   os().SetCurrentInstruction(kVfnma, kFpNeon);
4874   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
4875        << rd << ", " << rn << ", " << rm;
4876 }
4877 
vfnms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)4878 void Disassembler::vfnms(
4879     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
4880   os().SetCurrentInstruction(kVfnms, kFpNeon);
4881   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4882        << rd << ", " << rn << ", " << rm;
4883 }
4884 
vfnms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4885 void Disassembler::vfnms(
4886     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4887   os().SetCurrentInstruction(kVfnms, kFpNeon);
4888   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
4889        << rd << ", " << rn << ", " << rm;
4890 }
4891 
vhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4892 void Disassembler::vhadd(
4893     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4894   os().SetCurrentInstruction(kVhadd, kFpNeon);
4895   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4896   os() << " ";
4897   if (!rd.Is(rn)) {
4898     os() << rd << ", ";
4899   }
4900   os() << rn << ", " << rm;
4901 }
4902 
vhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4903 void Disassembler::vhadd(
4904     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4905   os().SetCurrentInstruction(kVhadd, kFpNeon);
4906   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
4907   os() << " ";
4908   if (!rd.Is(rn)) {
4909     os() << rd << ", ";
4910   }
4911   os() << rn << ", " << rm;
4912 }
4913 
vhsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)4914 void Disassembler::vhsub(
4915     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
4916   os().SetCurrentInstruction(kVhsub, kFpNeon);
4917   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
4918   os() << " ";
4919   if (!rd.Is(rn)) {
4920     os() << rd << ", ";
4921   }
4922   os() << rn << ", " << rm;
4923 }
4924 
vhsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)4925 void Disassembler::vhsub(
4926     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
4927   os().SetCurrentInstruction(kVhsub, kFpNeon);
4928   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
4929   os() << " ";
4930   if (!rd.Is(rn)) {
4931     os() << rd << ", ";
4932   }
4933   os() << rn << ", " << rm;
4934 }
4935 
vld1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4936 void Disassembler::vld1(Condition cond,
4937                         DataType dt,
4938                         const NeonRegisterList& nreglist,
4939                         const AlignedMemOperand& operand) {
4940   os().SetCurrentInstruction(kVld1, kFpNeon);
4941   os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
4942        << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
4943 }
4944 
vld2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4945 void Disassembler::vld2(Condition cond,
4946                         DataType dt,
4947                         const NeonRegisterList& nreglist,
4948                         const AlignedMemOperand& operand) {
4949   os().SetCurrentInstruction(kVld2, kFpNeon);
4950   os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
4951        << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
4952 }
4953 
vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4954 void Disassembler::vld3(Condition cond,
4955                         DataType dt,
4956                         const NeonRegisterList& nreglist,
4957                         const AlignedMemOperand& operand) {
4958   os().SetCurrentInstruction(kVld3, kFpNeon);
4959   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4960        << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
4961 }
4962 
vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)4963 void Disassembler::vld3(Condition cond,
4964                         DataType dt,
4965                         const NeonRegisterList& nreglist,
4966                         const MemOperand& operand) {
4967   os().SetCurrentInstruction(kVld3, kFpNeon);
4968   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
4969        << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
4970 }
4971 
vld4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)4972 void Disassembler::vld4(Condition cond,
4973                         DataType dt,
4974                         const NeonRegisterList& nreglist,
4975                         const AlignedMemOperand& operand) {
4976   os().SetCurrentInstruction(kVld4, kFpNeon);
4977   os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
4978        << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
4979 }
4980 
vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)4981 void Disassembler::vldm(Condition cond,
4982                         DataType dt,
4983                         Register rn,
4984                         WriteBack write_back,
4985                         DRegisterList dreglist) {
4986   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4987   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4988        << rn << write_back << ", " << dreglist;
4989 }
4990 
vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)4991 void Disassembler::vldm(Condition cond,
4992                         DataType dt,
4993                         Register rn,
4994                         WriteBack write_back,
4995                         SRegisterList sreglist) {
4996   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
4997   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
4998        << rn << write_back << ", " << sreglist;
4999 }
5000 
vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)5001 void Disassembler::vldmdb(Condition cond,
5002                           DataType dt,
5003                           Register rn,
5004                           WriteBack write_back,
5005                           DRegisterList dreglist) {
5006   os().SetCurrentInstruction(kVldmdb,
5007                              kLoadStore | kLoadStoreMultiple | kFpNeon);
5008   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
5009        << rn << write_back << ", " << dreglist;
5010 }
5011 
vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)5012 void Disassembler::vldmdb(Condition cond,
5013                           DataType dt,
5014                           Register rn,
5015                           WriteBack write_back,
5016                           SRegisterList sreglist) {
5017   os().SetCurrentInstruction(kVldmdb,
5018                              kLoadStore | kLoadStoreMultiple | kFpNeon);
5019   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
5020        << rn << write_back << ", " << sreglist;
5021 }
5022 
vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)5023 void Disassembler::vldmia(Condition cond,
5024                           DataType dt,
5025                           Register rn,
5026                           WriteBack write_back,
5027                           DRegisterList dreglist) {
5028   os().SetCurrentInstruction(kVldmia,
5029                              kLoadStore | kLoadStoreMultiple | kFpNeon);
5030   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
5031        << rn << write_back << ", " << dreglist;
5032 }
5033 
vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)5034 void Disassembler::vldmia(Condition cond,
5035                           DataType dt,
5036                           Register rn,
5037                           WriteBack write_back,
5038                           SRegisterList sreglist) {
5039   os().SetCurrentInstruction(kVldmia,
5040                              kLoadStore | kLoadStoreMultiple | kFpNeon);
5041   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
5042        << rn << write_back << ", " << sreglist;
5043 }
5044 
vldr(Condition cond,DataType dt,DRegister rd,Label * label)5045 void Disassembler::vldr(Condition cond,
5046                         DataType dt,
5047                         DRegister rd,
5048                         Label* label) {
5049   os().SetCurrentInstruction(kVldr, kFpNeon);
5050   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
5051        << rd << ", " << PrintLabel(kLoadDoublePrecisionLocation,
5052                                    label,
5053                                    GetCodeAddress() & ~3);
5054 }
5055 
vldr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)5056 void Disassembler::vldr(Condition cond,
5057                         DataType dt,
5058                         DRegister rd,
5059                         const MemOperand& operand) {
5060   os().SetCurrentInstruction(kVldr, kFpNeon);
5061   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
5062        << rd << ", " << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
5063 }
5064 
vldr(Condition cond,DataType dt,SRegister rd,Label * label)5065 void Disassembler::vldr(Condition cond,
5066                         DataType dt,
5067                         SRegister rd,
5068                         Label* label) {
5069   os().SetCurrentInstruction(kVldr, kFpNeon);
5070   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
5071        << rd << ", " << PrintLabel(kLoadSinglePrecisionLocation,
5072                                    label,
5073                                    GetCodeAddress() & ~3);
5074 }
5075 
vldr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)5076 void Disassembler::vldr(Condition cond,
5077                         DataType dt,
5078                         SRegister rd,
5079                         const MemOperand& operand) {
5080   os().SetCurrentInstruction(kVldr, kFpNeon);
5081   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
5082        << rd << ", " << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
5083 }
5084 
vmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5085 void Disassembler::vmax(
5086     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5087   os().SetCurrentInstruction(kVmax, kFpNeon);
5088   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5089   os() << " ";
5090   if (!rd.Is(rn)) {
5091     os() << rd << ", ";
5092   }
5093   os() << rn << ", " << rm;
5094 }
5095 
vmax(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5096 void Disassembler::vmax(
5097     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5098   os().SetCurrentInstruction(kVmax, kFpNeon);
5099   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
5100   os() << " ";
5101   if (!rd.Is(rn)) {
5102     os() << rd << ", ";
5103   }
5104   os() << rn << ", " << rm;
5105 }
5106 
vmaxnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)5107 void Disassembler::vmaxnm(DataType dt,
5108                           DRegister rd,
5109                           DRegister rn,
5110                           DRegister rm) {
5111   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5112   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5113 }
5114 
vmaxnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)5115 void Disassembler::vmaxnm(DataType dt,
5116                           QRegister rd,
5117                           QRegister rn,
5118                           QRegister rm) {
5119   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5120   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5121 }
5122 
vmaxnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)5123 void Disassembler::vmaxnm(DataType dt,
5124                           SRegister rd,
5125                           SRegister rn,
5126                           SRegister rm) {
5127   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
5128   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
5129 }
5130 
vmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5131 void Disassembler::vmin(
5132     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5133   os().SetCurrentInstruction(kVmin, kFpNeon);
5134   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5135   os() << " ";
5136   if (!rd.Is(rn)) {
5137     os() << rd << ", ";
5138   }
5139   os() << rn << ", " << rm;
5140 }
5141 
vmin(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5142 void Disassembler::vmin(
5143     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5144   os().SetCurrentInstruction(kVmin, kFpNeon);
5145   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
5146   os() << " ";
5147   if (!rd.Is(rn)) {
5148     os() << rd << ", ";
5149   }
5150   os() << rn << ", " << rm;
5151 }
5152 
vminnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)5153 void Disassembler::vminnm(DataType dt,
5154                           DRegister rd,
5155                           DRegister rn,
5156                           DRegister rm) {
5157   os().SetCurrentInstruction(kVminnm, kFpNeon);
5158   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5159 }
5160 
vminnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)5161 void Disassembler::vminnm(DataType dt,
5162                           QRegister rd,
5163                           QRegister rn,
5164                           QRegister rm) {
5165   os().SetCurrentInstruction(kVminnm, kFpNeon);
5166   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5167 }
5168 
vminnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)5169 void Disassembler::vminnm(DataType dt,
5170                           SRegister rd,
5171                           SRegister rn,
5172                           SRegister rm) {
5173   os().SetCurrentInstruction(kVminnm, kFpNeon);
5174   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
5175 }
5176 
vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5177 void Disassembler::vmla(
5178     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5179   os().SetCurrentInstruction(kVmla, kFpNeon);
5180   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5181        << rd << ", " << rn << ", " << rm;
5182 }
5183 
vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5184 void Disassembler::vmla(
5185     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5186   os().SetCurrentInstruction(kVmla, kFpNeon);
5187   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5188        << rd << ", " << rn << ", " << rm;
5189 }
5190 
vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5191 void Disassembler::vmla(
5192     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5193   os().SetCurrentInstruction(kVmla, kFpNeon);
5194   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5195        << rd << ", " << rn << ", " << rm;
5196 }
5197 
vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5198 void Disassembler::vmla(
5199     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5200   os().SetCurrentInstruction(kVmla, kFpNeon);
5201   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5202        << rd << ", " << rn << ", " << rm;
5203 }
5204 
vmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5205 void Disassembler::vmla(
5206     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5207   os().SetCurrentInstruction(kVmla, kFpNeon);
5208   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
5209        << rd << ", " << rn << ", " << rm;
5210 }
5211 
vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)5212 void Disassembler::vmlal(
5213     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5214   os().SetCurrentInstruction(kVmlal, kFpNeon);
5215   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5216        << rd << ", " << rn << ", " << rm;
5217 }
5218 
vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5219 void Disassembler::vmlal(
5220     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5221   os().SetCurrentInstruction(kVmlal, kFpNeon);
5222   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5223        << rd << ", " << rn << ", " << rm;
5224 }
5225 
vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5226 void Disassembler::vmls(
5227     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5228   os().SetCurrentInstruction(kVmls, kFpNeon);
5229   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5230        << rd << ", " << rn << ", " << rm;
5231 }
5232 
vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5233 void Disassembler::vmls(
5234     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5235   os().SetCurrentInstruction(kVmls, kFpNeon);
5236   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5237        << rd << ", " << rn << ", " << rm;
5238 }
5239 
vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5240 void Disassembler::vmls(
5241     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5242   os().SetCurrentInstruction(kVmls, kFpNeon);
5243   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5244        << rd << ", " << rn << ", " << rm;
5245 }
5246 
vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5247 void Disassembler::vmls(
5248     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5249   os().SetCurrentInstruction(kVmls, kFpNeon);
5250   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5251        << rd << ", " << rn << ", " << rm;
5252 }
5253 
vmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5254 void Disassembler::vmls(
5255     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5256   os().SetCurrentInstruction(kVmls, kFpNeon);
5257   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
5258        << rd << ", " << rn << ", " << rm;
5259 }
5260 
vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)5261 void Disassembler::vmlsl(
5262     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5263   os().SetCurrentInstruction(kVmlsl, kFpNeon);
5264   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5265        << rd << ", " << rn << ", " << rm;
5266 }
5267 
vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5268 void Disassembler::vmlsl(
5269     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5270   os().SetCurrentInstruction(kVmlsl, kFpNeon);
5271   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5272        << rd << ", " << rn << ", " << rm;
5273 }
5274 
vmov(Condition cond,Register rt,SRegister rn)5275 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
5276   os().SetCurrentInstruction(kVmov, kFpNeon);
5277   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5278        << ", " << rn;
5279 }
5280 
vmov(Condition cond,SRegister rn,Register rt)5281 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
5282   os().SetCurrentInstruction(kVmov, kFpNeon);
5283   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
5284        << ", " << rt;
5285 }
5286 
vmov(Condition cond,Register rt,Register rt2,DRegister rm)5287 void Disassembler::vmov(Condition cond,
5288                         Register rt,
5289                         Register rt2,
5290                         DRegister rm) {
5291   os().SetCurrentInstruction(kVmov, kFpNeon);
5292   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5293        << ", " << rt2 << ", " << rm;
5294 }
5295 
vmov(Condition cond,DRegister rm,Register rt,Register rt2)5296 void Disassembler::vmov(Condition cond,
5297                         DRegister rm,
5298                         Register rt,
5299                         Register rt2) {
5300   os().SetCurrentInstruction(kVmov, kFpNeon);
5301   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5302        << ", " << rt << ", " << rt2;
5303 }
5304 
vmov(Condition cond,Register rt,Register rt2,SRegister rm,SRegister rm1)5305 void Disassembler::vmov(
5306     Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
5307   os().SetCurrentInstruction(kVmov, kFpNeon);
5308   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
5309        << ", " << rt2 << ", " << rm << ", " << rm1;
5310 }
5311 
vmov(Condition cond,SRegister rm,SRegister rm1,Register rt,Register rt2)5312 void Disassembler::vmov(
5313     Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
5314   os().SetCurrentInstruction(kVmov, kFpNeon);
5315   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
5316        << ", " << rm1 << ", " << rt << ", " << rt2;
5317 }
5318 
vmov(Condition cond,DataType dt,DRegisterLane rd,Register rt)5319 void Disassembler::vmov(Condition cond,
5320                         DataType dt,
5321                         DRegisterLane rd,
5322                         Register rt) {
5323   os().SetCurrentInstruction(kVmov, kFpNeon);
5324   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5325        << rd << ", " << rt;
5326 }
5327 
vmov(Condition cond,DataType dt,DRegister rd,const DOperand & operand)5328 void Disassembler::vmov(Condition cond,
5329                         DataType dt,
5330                         DRegister rd,
5331                         const DOperand& operand) {
5332   os().SetCurrentInstruction(kVmov, kFpNeon);
5333   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5334        << rd << ", " << operand;
5335 }
5336 
vmov(Condition cond,DataType dt,QRegister rd,const QOperand & operand)5337 void Disassembler::vmov(Condition cond,
5338                         DataType dt,
5339                         QRegister rd,
5340                         const QOperand& operand) {
5341   os().SetCurrentInstruction(kVmov, kFpNeon);
5342   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5343        << rd << ", " << operand;
5344 }
5345 
vmov(Condition cond,DataType dt,SRegister rd,const SOperand & operand)5346 void Disassembler::vmov(Condition cond,
5347                         DataType dt,
5348                         SRegister rd,
5349                         const SOperand& operand) {
5350   os().SetCurrentInstruction(kVmov, kFpNeon);
5351   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5352        << rd << ", " << operand;
5353 }
5354 
vmov(Condition cond,DataType dt,Register rt,DRegisterLane rn)5355 void Disassembler::vmov(Condition cond,
5356                         DataType dt,
5357                         Register rt,
5358                         DRegisterLane rn) {
5359   os().SetCurrentInstruction(kVmov, kFpNeon);
5360   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
5361        << rt << ", " << rn;
5362 }
5363 
vmovl(Condition cond,DataType dt,QRegister rd,DRegister rm)5364 void Disassembler::vmovl(Condition cond,
5365                          DataType dt,
5366                          QRegister rd,
5367                          DRegister rm) {
5368   os().SetCurrentInstruction(kVmovl, kFpNeon);
5369   os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
5370        << rd << ", " << rm;
5371 }
5372 
vmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)5373 void Disassembler::vmovn(Condition cond,
5374                          DataType dt,
5375                          DRegister rd,
5376                          QRegister rm) {
5377   os().SetCurrentInstruction(kVmovn, kFpNeon);
5378   os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5379        << rd << ", " << rm;
5380 }
5381 
vmrs(Condition cond,RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)5382 void Disassembler::vmrs(Condition cond,
5383                         RegisterOrAPSR_nzcv rt,
5384                         SpecialFPRegister spec_reg) {
5385   os().SetCurrentInstruction(kVmrs, kFpNeon);
5386   os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
5387        << ", " << spec_reg;
5388 }
5389 
vmsr(Condition cond,SpecialFPRegister spec_reg,Register rt)5390 void Disassembler::vmsr(Condition cond,
5391                         SpecialFPRegister spec_reg,
5392                         Register rt) {
5393   os().SetCurrentInstruction(kVmsr, kFpNeon);
5394   os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
5395        << spec_reg << ", " << rt;
5396 }
5397 
vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)5398 void Disassembler::vmul(Condition cond,
5399                         DataType dt,
5400                         DRegister rd,
5401                         DRegister rn,
5402                         DRegister dm,
5403                         unsigned index) {
5404   os().SetCurrentInstruction(kVmul, kFpNeon);
5405   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5406   os() << " ";
5407   if (!rd.Is(rn)) {
5408     os() << rd << ", ";
5409   }
5410   os() << rn << ", " << dm << "[" << index << "]";
5411 }
5412 
vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)5413 void Disassembler::vmul(Condition cond,
5414                         DataType dt,
5415                         QRegister rd,
5416                         QRegister rn,
5417                         DRegister dm,
5418                         unsigned index) {
5419   os().SetCurrentInstruction(kVmul, kFpNeon);
5420   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5421   os() << " ";
5422   if (!rd.Is(rn)) {
5423     os() << rd << ", ";
5424   }
5425   os() << rn << ", " << dm << "[" << index << "]";
5426 }
5427 
vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5428 void Disassembler::vmul(
5429     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5430   os().SetCurrentInstruction(kVmul, kFpNeon);
5431   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5432   os() << " ";
5433   if (!rd.Is(rn)) {
5434     os() << rd << ", ";
5435   }
5436   os() << rn << ", " << rm;
5437 }
5438 
vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5439 void Disassembler::vmul(
5440     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5441   os().SetCurrentInstruction(kVmul, kFpNeon);
5442   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5443   os() << " ";
5444   if (!rd.Is(rn)) {
5445     os() << rd << ", ";
5446   }
5447   os() << rn << ", " << rm;
5448 }
5449 
vmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5450 void Disassembler::vmul(
5451     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5452   os().SetCurrentInstruction(kVmul, kFpNeon);
5453   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
5454   os() << " ";
5455   if (!rd.Is(rn)) {
5456     os() << rd << ", ";
5457   }
5458   os() << rn << ", " << rm;
5459 }
5460 
vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)5461 void Disassembler::vmull(Condition cond,
5462                          DataType dt,
5463                          QRegister rd,
5464                          DRegister rn,
5465                          DRegister dm,
5466                          unsigned index) {
5467   os().SetCurrentInstruction(kVmull, kFpNeon);
5468   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5469        << rd << ", " << rn << ", " << dm << "[" << index << "]";
5470 }
5471 
vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5472 void Disassembler::vmull(
5473     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5474   os().SetCurrentInstruction(kVmull, kFpNeon);
5475   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
5476        << rd << ", " << rn << ", " << rm;
5477 }
5478 
vmvn(Condition cond,DataType dt,DRegister rd,const DOperand & operand)5479 void Disassembler::vmvn(Condition cond,
5480                         DataType dt,
5481                         DRegister rd,
5482                         const DOperand& operand) {
5483   os().SetCurrentInstruction(kVmvn, kFpNeon);
5484   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5485        << rd << ", " << operand;
5486 }
5487 
vmvn(Condition cond,DataType dt,QRegister rd,const QOperand & operand)5488 void Disassembler::vmvn(Condition cond,
5489                         DataType dt,
5490                         QRegister rd,
5491                         const QOperand& operand) {
5492   os().SetCurrentInstruction(kVmvn, kFpNeon);
5493   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
5494        << rd << ", " << operand;
5495 }
5496 
vneg(Condition cond,DataType dt,DRegister rd,DRegister rm)5497 void Disassembler::vneg(Condition cond,
5498                         DataType dt,
5499                         DRegister rd,
5500                         DRegister rm) {
5501   os().SetCurrentInstruction(kVneg, kFpNeon);
5502   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5503        << rd << ", " << rm;
5504 }
5505 
vneg(Condition cond,DataType dt,QRegister rd,QRegister rm)5506 void Disassembler::vneg(Condition cond,
5507                         DataType dt,
5508                         QRegister rd,
5509                         QRegister rm) {
5510   os().SetCurrentInstruction(kVneg, kFpNeon);
5511   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5512        << rd << ", " << rm;
5513 }
5514 
vneg(Condition cond,DataType dt,SRegister rd,SRegister rm)5515 void Disassembler::vneg(Condition cond,
5516                         DataType dt,
5517                         SRegister rd,
5518                         SRegister rm) {
5519   os().SetCurrentInstruction(kVneg, kFpNeon);
5520   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
5521        << rd << ", " << rm;
5522 }
5523 
vnmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5524 void Disassembler::vnmla(
5525     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5526   os().SetCurrentInstruction(kVnmla, kFpNeon);
5527   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5528        << rd << ", " << rn << ", " << rm;
5529 }
5530 
vnmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5531 void Disassembler::vnmla(
5532     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5533   os().SetCurrentInstruction(kVnmla, kFpNeon);
5534   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
5535        << rd << ", " << rn << ", " << rm;
5536 }
5537 
vnmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5538 void Disassembler::vnmls(
5539     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5540   os().SetCurrentInstruction(kVnmls, kFpNeon);
5541   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5542        << rd << ", " << rn << ", " << rm;
5543 }
5544 
vnmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5545 void Disassembler::vnmls(
5546     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5547   os().SetCurrentInstruction(kVnmls, kFpNeon);
5548   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
5549        << rd << ", " << rn << ", " << rm;
5550 }
5551 
vnmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5552 void Disassembler::vnmul(
5553     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5554   os().SetCurrentInstruction(kVnmul, kFpNeon);
5555   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5556   os() << " ";
5557   if (!rd.Is(rn)) {
5558     os() << rd << ", ";
5559   }
5560   os() << rn << ", " << rm;
5561 }
5562 
vnmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5563 void Disassembler::vnmul(
5564     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5565   os().SetCurrentInstruction(kVnmul, kFpNeon);
5566   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
5567   os() << " ";
5568   if (!rd.Is(rn)) {
5569     os() << rd << ", ";
5570   }
5571   os() << rn << ", " << rm;
5572 }
5573 
vorn(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5574 void Disassembler::vorn(Condition cond,
5575                         DataType dt,
5576                         DRegister rd,
5577                         DRegister rn,
5578                         const DOperand& operand) {
5579   os().SetCurrentInstruction(kVorn, kFpNeon);
5580   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5581   os() << " ";
5582   if (!rd.Is(rn)) {
5583     os() << rd << ", ";
5584   }
5585   os() << rn << ", " << operand;
5586 }
5587 
vorn(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5588 void Disassembler::vorn(Condition cond,
5589                         DataType dt,
5590                         QRegister rd,
5591                         QRegister rn,
5592                         const QOperand& operand) {
5593   os().SetCurrentInstruction(kVorn, kFpNeon);
5594   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
5595   os() << " ";
5596   if (!rd.Is(rn)) {
5597     os() << rd << ", ";
5598   }
5599   os() << rn << ", " << operand;
5600 }
5601 
vorr(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5602 void Disassembler::vorr(Condition cond,
5603                         DataType dt,
5604                         DRegister rd,
5605                         DRegister rn,
5606                         const DOperand& operand) {
5607   os().SetCurrentInstruction(kVorr, kFpNeon);
5608   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5609   os() << " ";
5610   if (!rd.Is(rn)) {
5611     os() << rd << ", ";
5612   }
5613   os() << rn << ", " << operand;
5614 }
5615 
vorr(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5616 void Disassembler::vorr(Condition cond,
5617                         DataType dt,
5618                         QRegister rd,
5619                         QRegister rn,
5620                         const QOperand& operand) {
5621   os().SetCurrentInstruction(kVorr, kFpNeon);
5622   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
5623   os() << " ";
5624   if (!rd.Is(rn)) {
5625     os() << rd << ", ";
5626   }
5627   os() << rn << ", " << operand;
5628 }
5629 
vpadal(Condition cond,DataType dt,DRegister rd,DRegister rm)5630 void Disassembler::vpadal(Condition cond,
5631                           DataType dt,
5632                           DRegister rd,
5633                           DRegister rm) {
5634   os().SetCurrentInstruction(kVpadal, kFpNeon);
5635   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5636        << rd << ", " << rm;
5637 }
5638 
vpadal(Condition cond,DataType dt,QRegister rd,QRegister rm)5639 void Disassembler::vpadal(Condition cond,
5640                           DataType dt,
5641                           QRegister rd,
5642                           QRegister rm) {
5643   os().SetCurrentInstruction(kVpadal, kFpNeon);
5644   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
5645        << rd << ", " << rm;
5646 }
5647 
vpadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5648 void Disassembler::vpadd(
5649     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5650   os().SetCurrentInstruction(kVpadd, kFpNeon);
5651   os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
5652   os() << " ";
5653   if (!rd.Is(rn)) {
5654     os() << rd << ", ";
5655   }
5656   os() << rn << ", " << rm;
5657 }
5658 
vpaddl(Condition cond,DataType dt,DRegister rd,DRegister rm)5659 void Disassembler::vpaddl(Condition cond,
5660                           DataType dt,
5661                           DRegister rd,
5662                           DRegister rm) {
5663   os().SetCurrentInstruction(kVpaddl, kFpNeon);
5664   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5665        << rd << ", " << rm;
5666 }
5667 
vpaddl(Condition cond,DataType dt,QRegister rd,QRegister rm)5668 void Disassembler::vpaddl(Condition cond,
5669                           DataType dt,
5670                           QRegister rd,
5671                           QRegister rm) {
5672   os().SetCurrentInstruction(kVpaddl, kFpNeon);
5673   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
5674        << rd << ", " << rm;
5675 }
5676 
vpmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5677 void Disassembler::vpmax(
5678     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5679   os().SetCurrentInstruction(kVpmax, kFpNeon);
5680   os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
5681   os() << " ";
5682   if (!rd.Is(rn)) {
5683     os() << rd << ", ";
5684   }
5685   os() << rn << ", " << rm;
5686 }
5687 
vpmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5688 void Disassembler::vpmin(
5689     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5690   os().SetCurrentInstruction(kVpmin, kFpNeon);
5691   os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
5692   os() << " ";
5693   if (!rd.Is(rn)) {
5694     os() << rd << ", ";
5695   }
5696   os() << rn << ", " << rm;
5697 }
5698 
vpop(Condition cond,DataType dt,DRegisterList dreglist)5699 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
5700   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5701   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5702        << dreglist;
5703 }
5704 
vpop(Condition cond,DataType dt,SRegisterList sreglist)5705 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
5706   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
5707   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
5708        << sreglist;
5709 }
5710 
vpush(Condition cond,DataType dt,DRegisterList dreglist)5711 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
5712   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5713   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5714        << dreglist;
5715 }
5716 
vpush(Condition cond,DataType dt,SRegisterList sreglist)5717 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
5718   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
5719   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
5720        << sreglist;
5721 }
5722 
vqabs(Condition cond,DataType dt,DRegister rd,DRegister rm)5723 void Disassembler::vqabs(Condition cond,
5724                          DataType dt,
5725                          DRegister rd,
5726                          DRegister rm) {
5727   os().SetCurrentInstruction(kVqabs, kFpNeon);
5728   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5729        << rd << ", " << rm;
5730 }
5731 
vqabs(Condition cond,DataType dt,QRegister rd,QRegister rm)5732 void Disassembler::vqabs(Condition cond,
5733                          DataType dt,
5734                          QRegister rd,
5735                          QRegister rm) {
5736   os().SetCurrentInstruction(kVqabs, kFpNeon);
5737   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
5738        << rd << ", " << rm;
5739 }
5740 
vqadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5741 void Disassembler::vqadd(
5742     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5743   os().SetCurrentInstruction(kVqadd, kFpNeon);
5744   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5745   os() << " ";
5746   if (!rd.Is(rn)) {
5747     os() << rd << ", ";
5748   }
5749   os() << rn << ", " << rm;
5750 }
5751 
vqadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5752 void Disassembler::vqadd(
5753     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5754   os().SetCurrentInstruction(kVqadd, kFpNeon);
5755   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
5756   os() << " ";
5757   if (!rd.Is(rn)) {
5758     os() << rd << ", ";
5759   }
5760   os() << rn << ", " << rm;
5761 }
5762 
vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5763 void Disassembler::vqdmlal(
5764     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5765   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5766   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5767        << rd << ", " << rn << ", " << rm;
5768 }
5769 
vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)5770 void Disassembler::vqdmlal(Condition cond,
5771                            DataType dt,
5772                            QRegister rd,
5773                            DRegister rn,
5774                            DRegister dm,
5775                            unsigned index) {
5776   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
5777   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
5778        << rd << ", " << rn << ", " << dm << "[" << index << "]";
5779 }
5780 
vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5781 void Disassembler::vqdmlsl(
5782     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5783   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5784   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5785        << rd << ", " << rn << ", " << rm;
5786 }
5787 
vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)5788 void Disassembler::vqdmlsl(Condition cond,
5789                            DataType dt,
5790                            QRegister rd,
5791                            DRegister rn,
5792                            DRegister dm,
5793                            unsigned index) {
5794   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
5795   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
5796        << rd << ", " << rn << ", " << dm << "[" << index << "]";
5797 }
5798 
vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5799 void Disassembler::vqdmulh(
5800     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5801   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5802   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5803   os() << " ";
5804   if (!rd.Is(rn)) {
5805     os() << rd << ", ";
5806   }
5807   os() << rn << ", " << rm;
5808 }
5809 
vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5810 void Disassembler::vqdmulh(
5811     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5812   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5813   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5814   os() << " ";
5815   if (!rd.Is(rn)) {
5816     os() << rd << ", ";
5817   }
5818   os() << rn << ", " << rm;
5819 }
5820 
vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5821 void Disassembler::vqdmulh(
5822     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5823   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5824   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5825   os() << " ";
5826   if (!rd.Is(rn)) {
5827     os() << rd << ", ";
5828   }
5829   os() << rn << ", " << rm;
5830 }
5831 
vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5832 void Disassembler::vqdmulh(
5833     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5834   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
5835   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
5836   os() << " ";
5837   if (!rd.Is(rn)) {
5838     os() << rd << ", ";
5839   }
5840   os() << rn << ", " << rm;
5841 }
5842 
vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5843 void Disassembler::vqdmull(
5844     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5845   os().SetCurrentInstruction(kVqdmull, kFpNeon);
5846   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5847        << rd << ", " << rn << ", " << rm;
5848 }
5849 
vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)5850 void Disassembler::vqdmull(
5851     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
5852   os().SetCurrentInstruction(kVqdmull, kFpNeon);
5853   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
5854        << rd << ", " << rn << ", " << rm;
5855 }
5856 
vqmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)5857 void Disassembler::vqmovn(Condition cond,
5858                           DataType dt,
5859                           DRegister rd,
5860                           QRegister rm) {
5861   os().SetCurrentInstruction(kVqmovn, kFpNeon);
5862   os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
5863        << rd << ", " << rm;
5864 }
5865 
vqmovun(Condition cond,DataType dt,DRegister rd,QRegister rm)5866 void Disassembler::vqmovun(Condition cond,
5867                            DataType dt,
5868                            DRegister rd,
5869                            QRegister rm) {
5870   os().SetCurrentInstruction(kVqmovun, kFpNeon);
5871   os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
5872        << rd << ", " << rm;
5873 }
5874 
vqneg(Condition cond,DataType dt,DRegister rd,DRegister rm)5875 void Disassembler::vqneg(Condition cond,
5876                          DataType dt,
5877                          DRegister rd,
5878                          DRegister rm) {
5879   os().SetCurrentInstruction(kVqneg, kFpNeon);
5880   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5881        << rd << ", " << rm;
5882 }
5883 
vqneg(Condition cond,DataType dt,QRegister rd,QRegister rm)5884 void Disassembler::vqneg(Condition cond,
5885                          DataType dt,
5886                          QRegister rd,
5887                          QRegister rm) {
5888   os().SetCurrentInstruction(kVqneg, kFpNeon);
5889   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
5890        << rd << ", " << rm;
5891 }
5892 
vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5893 void Disassembler::vqrdmulh(
5894     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5895   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5896   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5897   os() << " ";
5898   if (!rd.Is(rn)) {
5899     os() << rd << ", ";
5900   }
5901   os() << rn << ", " << rm;
5902 }
5903 
vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5904 void Disassembler::vqrdmulh(
5905     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5906   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5907   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5908   os() << " ";
5909   if (!rd.Is(rn)) {
5910     os() << rd << ", ";
5911   }
5912   os() << rn << ", " << rm;
5913 }
5914 
vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)5915 void Disassembler::vqrdmulh(
5916     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
5917   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5918   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5919   os() << " ";
5920   if (!rd.Is(rn)) {
5921     os() << rd << ", ";
5922   }
5923   os() << rn << ", " << rm;
5924 }
5925 
vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)5926 void Disassembler::vqrdmulh(
5927     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
5928   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
5929   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
5930   os() << " ";
5931   if (!rd.Is(rn)) {
5932     os() << rd << ", ";
5933   }
5934   os() << rn << ", " << rm;
5935 }
5936 
vqrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)5937 void Disassembler::vqrshl(
5938     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
5939   os().SetCurrentInstruction(kVqrshl, kFpNeon);
5940   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5941   os() << " ";
5942   if (!rd.Is(rm)) {
5943     os() << rd << ", ";
5944   }
5945   os() << rm << ", " << rn;
5946 }
5947 
vqrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)5948 void Disassembler::vqrshl(
5949     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
5950   os().SetCurrentInstruction(kVqrshl, kFpNeon);
5951   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
5952   os() << " ";
5953   if (!rd.Is(rm)) {
5954     os() << rd << ", ";
5955   }
5956   os() << rm << ", " << rn;
5957 }
5958 
vqrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)5959 void Disassembler::vqrshrn(Condition cond,
5960                            DataType dt,
5961                            DRegister rd,
5962                            QRegister rm,
5963                            const QOperand& operand) {
5964   os().SetCurrentInstruction(kVqrshrn, kFpNeon);
5965   os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
5966        << rd << ", " << rm << ", " << operand;
5967 }
5968 
vqrshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)5969 void Disassembler::vqrshrun(Condition cond,
5970                             DataType dt,
5971                             DRegister rd,
5972                             QRegister rm,
5973                             const QOperand& operand) {
5974   os().SetCurrentInstruction(kVqrshrun, kFpNeon);
5975   os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
5976        << rd << ", " << rm << ", " << operand;
5977 }
5978 
vqshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5979 void Disassembler::vqshl(Condition cond,
5980                          DataType dt,
5981                          DRegister rd,
5982                          DRegister rm,
5983                          const DOperand& operand) {
5984   os().SetCurrentInstruction(kVqshl, kFpNeon);
5985   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
5986   os() << " ";
5987   if (!rd.Is(rm)) {
5988     os() << rd << ", ";
5989   }
5990   os() << rm << ", " << operand;
5991 }
5992 
vqshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5993 void Disassembler::vqshl(Condition cond,
5994                          DataType dt,
5995                          QRegister rd,
5996                          QRegister rm,
5997                          const QOperand& operand) {
5998   os().SetCurrentInstruction(kVqshl, kFpNeon);
5999   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
6000   os() << " ";
6001   if (!rd.Is(rm)) {
6002     os() << rd << ", ";
6003   }
6004   os() << rm << ", " << operand;
6005 }
6006 
vqshlu(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6007 void Disassembler::vqshlu(Condition cond,
6008                           DataType dt,
6009                           DRegister rd,
6010                           DRegister rm,
6011                           const DOperand& operand) {
6012   os().SetCurrentInstruction(kVqshlu, kFpNeon);
6013   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
6014   os() << " ";
6015   if (!rd.Is(rm)) {
6016     os() << rd << ", ";
6017   }
6018   os() << rm << ", " << operand;
6019 }
6020 
vqshlu(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6021 void Disassembler::vqshlu(Condition cond,
6022                           DataType dt,
6023                           QRegister rd,
6024                           QRegister rm,
6025                           const QOperand& operand) {
6026   os().SetCurrentInstruction(kVqshlu, kFpNeon);
6027   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
6028   os() << " ";
6029   if (!rd.Is(rm)) {
6030     os() << rd << ", ";
6031   }
6032   os() << rm << ", " << operand;
6033 }
6034 
vqshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6035 void Disassembler::vqshrn(Condition cond,
6036                           DataType dt,
6037                           DRegister rd,
6038                           QRegister rm,
6039                           const QOperand& operand) {
6040   os().SetCurrentInstruction(kVqshrn, kFpNeon);
6041   os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6042        << rd << ", " << rm << ", " << operand;
6043 }
6044 
vqshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6045 void Disassembler::vqshrun(Condition cond,
6046                            DataType dt,
6047                            DRegister rd,
6048                            QRegister rm,
6049                            const QOperand& operand) {
6050   os().SetCurrentInstruction(kVqshrun, kFpNeon);
6051   os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
6052        << rd << ", " << rm << ", " << operand;
6053 }
6054 
vqsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6055 void Disassembler::vqsub(
6056     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6057   os().SetCurrentInstruction(kVqsub, kFpNeon);
6058   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6059   os() << " ";
6060   if (!rd.Is(rn)) {
6061     os() << rd << ", ";
6062   }
6063   os() << rn << ", " << rm;
6064 }
6065 
vqsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6066 void Disassembler::vqsub(
6067     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6068   os().SetCurrentInstruction(kVqsub, kFpNeon);
6069   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
6070   os() << " ";
6071   if (!rd.Is(rn)) {
6072     os() << rd << ", ";
6073   }
6074   os() << rn << ", " << rm;
6075 }
6076 
vraddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)6077 void Disassembler::vraddhn(
6078     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6079   os().SetCurrentInstruction(kVraddhn, kFpNeon);
6080   os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
6081        << rd << ", " << rn << ", " << rm;
6082 }
6083 
vrecpe(Condition cond,DataType dt,DRegister rd,DRegister rm)6084 void Disassembler::vrecpe(Condition cond,
6085                           DataType dt,
6086                           DRegister rd,
6087                           DRegister rm) {
6088   os().SetCurrentInstruction(kVrecpe, kFpNeon);
6089   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6090        << rd << ", " << rm;
6091 }
6092 
vrecpe(Condition cond,DataType dt,QRegister rd,QRegister rm)6093 void Disassembler::vrecpe(Condition cond,
6094                           DataType dt,
6095                           QRegister rd,
6096                           QRegister rm) {
6097   os().SetCurrentInstruction(kVrecpe, kFpNeon);
6098   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
6099        << rd << ", " << rm;
6100 }
6101 
vrecps(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6102 void Disassembler::vrecps(
6103     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6104   os().SetCurrentInstruction(kVrecps, kFpNeon);
6105   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6106   os() << " ";
6107   if (!rd.Is(rn)) {
6108     os() << rd << ", ";
6109   }
6110   os() << rn << ", " << rm;
6111 }
6112 
vrecps(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6113 void Disassembler::vrecps(
6114     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6115   os().SetCurrentInstruction(kVrecps, kFpNeon);
6116   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
6117   os() << " ";
6118   if (!rd.Is(rn)) {
6119     os() << rd << ", ";
6120   }
6121   os() << rn << ", " << rm;
6122 }
6123 
vrev16(Condition cond,DataType dt,DRegister rd,DRegister rm)6124 void Disassembler::vrev16(Condition cond,
6125                           DataType dt,
6126                           DRegister rd,
6127                           DRegister rm) {
6128   os().SetCurrentInstruction(kVrev16, kFpNeon);
6129   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6130        << rd << ", " << rm;
6131 }
6132 
vrev16(Condition cond,DataType dt,QRegister rd,QRegister rm)6133 void Disassembler::vrev16(Condition cond,
6134                           DataType dt,
6135                           QRegister rd,
6136                           QRegister rm) {
6137   os().SetCurrentInstruction(kVrev16, kFpNeon);
6138   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
6139        << rd << ", " << rm;
6140 }
6141 
vrev32(Condition cond,DataType dt,DRegister rd,DRegister rm)6142 void Disassembler::vrev32(Condition cond,
6143                           DataType dt,
6144                           DRegister rd,
6145                           DRegister rm) {
6146   os().SetCurrentInstruction(kVrev32, kFpNeon);
6147   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6148        << rd << ", " << rm;
6149 }
6150 
vrev32(Condition cond,DataType dt,QRegister rd,QRegister rm)6151 void Disassembler::vrev32(Condition cond,
6152                           DataType dt,
6153                           QRegister rd,
6154                           QRegister rm) {
6155   os().SetCurrentInstruction(kVrev32, kFpNeon);
6156   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
6157        << rd << ", " << rm;
6158 }
6159 
vrev64(Condition cond,DataType dt,DRegister rd,DRegister rm)6160 void Disassembler::vrev64(Condition cond,
6161                           DataType dt,
6162                           DRegister rd,
6163                           DRegister rm) {
6164   os().SetCurrentInstruction(kVrev64, kFpNeon);
6165   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6166        << rd << ", " << rm;
6167 }
6168 
vrev64(Condition cond,DataType dt,QRegister rd,QRegister rm)6169 void Disassembler::vrev64(Condition cond,
6170                           DataType dt,
6171                           QRegister rd,
6172                           QRegister rm) {
6173   os().SetCurrentInstruction(kVrev64, kFpNeon);
6174   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
6175        << rd << ", " << rm;
6176 }
6177 
vrhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6178 void Disassembler::vrhadd(
6179     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6180   os().SetCurrentInstruction(kVrhadd, kFpNeon);
6181   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6182   os() << " ";
6183   if (!rd.Is(rn)) {
6184     os() << rd << ", ";
6185   }
6186   os() << rn << ", " << rm;
6187 }
6188 
vrhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6189 void Disassembler::vrhadd(
6190     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6191   os().SetCurrentInstruction(kVrhadd, kFpNeon);
6192   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
6193   os() << " ";
6194   if (!rd.Is(rn)) {
6195     os() << rd << ", ";
6196   }
6197   os() << rn << ", " << rm;
6198 }
6199 
vrinta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6200 void Disassembler::vrinta(DataType dt1,
6201                           DataType dt2,
6202                           DRegister rd,
6203                           DRegister rm) {
6204   os().SetCurrentInstruction(kVrinta, kFpNeon);
6205   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
6206 }
6207 
vrinta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6208 void Disassembler::vrinta(DataType dt1,
6209                           DataType dt2,
6210                           QRegister rd,
6211                           QRegister rm) {
6212   os().SetCurrentInstruction(kVrinta, kFpNeon);
6213   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
6214 }
6215 
vrinta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6216 void Disassembler::vrinta(DataType dt1,
6217                           DataType dt2,
6218                           SRegister rd,
6219                           SRegister rm) {
6220   os().SetCurrentInstruction(kVrinta, kFpNeon);
6221   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
6222 }
6223 
vrintm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6224 void Disassembler::vrintm(DataType dt1,
6225                           DataType dt2,
6226                           DRegister rd,
6227                           DRegister rm) {
6228   os().SetCurrentInstruction(kVrintm, kFpNeon);
6229   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
6230 }
6231 
vrintm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6232 void Disassembler::vrintm(DataType dt1,
6233                           DataType dt2,
6234                           QRegister rd,
6235                           QRegister rm) {
6236   os().SetCurrentInstruction(kVrintm, kFpNeon);
6237   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
6238 }
6239 
vrintm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6240 void Disassembler::vrintm(DataType dt1,
6241                           DataType dt2,
6242                           SRegister rd,
6243                           SRegister rm) {
6244   os().SetCurrentInstruction(kVrintm, kFpNeon);
6245   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
6246 }
6247 
vrintn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6248 void Disassembler::vrintn(DataType dt1,
6249                           DataType dt2,
6250                           DRegister rd,
6251                           DRegister rm) {
6252   os().SetCurrentInstruction(kVrintn, kFpNeon);
6253   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
6254 }
6255 
vrintn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6256 void Disassembler::vrintn(DataType dt1,
6257                           DataType dt2,
6258                           QRegister rd,
6259                           QRegister rm) {
6260   os().SetCurrentInstruction(kVrintn, kFpNeon);
6261   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
6262 }
6263 
vrintn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6264 void Disassembler::vrintn(DataType dt1,
6265                           DataType dt2,
6266                           SRegister rd,
6267                           SRegister rm) {
6268   os().SetCurrentInstruction(kVrintn, kFpNeon);
6269   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
6270 }
6271 
vrintp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6272 void Disassembler::vrintp(DataType dt1,
6273                           DataType dt2,
6274                           DRegister rd,
6275                           DRegister rm) {
6276   os().SetCurrentInstruction(kVrintp, kFpNeon);
6277   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
6278 }
6279 
vrintp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6280 void Disassembler::vrintp(DataType dt1,
6281                           DataType dt2,
6282                           QRegister rd,
6283                           QRegister rm) {
6284   os().SetCurrentInstruction(kVrintp, kFpNeon);
6285   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
6286 }
6287 
vrintp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6288 void Disassembler::vrintp(DataType dt1,
6289                           DataType dt2,
6290                           SRegister rd,
6291                           SRegister rm) {
6292   os().SetCurrentInstruction(kVrintp, kFpNeon);
6293   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
6294 }
6295 
vrintr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6296 void Disassembler::vrintr(
6297     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6298   os().SetCurrentInstruction(kVrintr, kFpNeon);
6299   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6300        << " " << rd << ", " << rm;
6301 }
6302 
vrintr(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6303 void Disassembler::vrintr(
6304     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6305   os().SetCurrentInstruction(kVrintr, kFpNeon);
6306   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6307        << " " << rd << ", " << rm;
6308 }
6309 
vrintx(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6310 void Disassembler::vrintx(
6311     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6312   os().SetCurrentInstruction(kVrintx, kFpNeon);
6313   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6314        << " " << rd << ", " << rm;
6315 }
6316 
vrintx(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6317 void Disassembler::vrintx(DataType dt1,
6318                           DataType dt2,
6319                           QRegister rd,
6320                           QRegister rm) {
6321   os().SetCurrentInstruction(kVrintx, kFpNeon);
6322   os() << ToCString(kVrintx) << dt1 << dt2 << " " << rd << ", " << rm;
6323 }
6324 
vrintx(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6325 void Disassembler::vrintx(
6326     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6327   os().SetCurrentInstruction(kVrintx, kFpNeon);
6328   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6329        << " " << rd << ", " << rm;
6330 }
6331 
vrintz(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6332 void Disassembler::vrintz(
6333     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6334   os().SetCurrentInstruction(kVrintz, kFpNeon);
6335   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6336        << " " << rd << ", " << rm;
6337 }
6338 
vrintz(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6339 void Disassembler::vrintz(DataType dt1,
6340                           DataType dt2,
6341                           QRegister rd,
6342                           QRegister rm) {
6343   os().SetCurrentInstruction(kVrintz, kFpNeon);
6344   os() << ToCString(kVrintz) << dt1 << dt2 << " " << rd << ", " << rm;
6345 }
6346 
vrintz(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6347 void Disassembler::vrintz(
6348     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6349   os().SetCurrentInstruction(kVrintz, kFpNeon);
6350   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
6351        << " " << rd << ", " << rm;
6352 }
6353 
vrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)6354 void Disassembler::vrshl(
6355     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
6356   os().SetCurrentInstruction(kVrshl, kFpNeon);
6357   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6358   os() << " ";
6359   if (!rd.Is(rm)) {
6360     os() << rd << ", ";
6361   }
6362   os() << rm << ", " << rn;
6363 }
6364 
vrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)6365 void Disassembler::vrshl(
6366     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
6367   os().SetCurrentInstruction(kVrshl, kFpNeon);
6368   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
6369   os() << " ";
6370   if (!rd.Is(rm)) {
6371     os() << rd << ", ";
6372   }
6373   os() << rm << ", " << rn;
6374 }
6375 
vrshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6376 void Disassembler::vrshr(Condition cond,
6377                          DataType dt,
6378                          DRegister rd,
6379                          DRegister rm,
6380                          const DOperand& operand) {
6381   os().SetCurrentInstruction(kVrshr, kFpNeon);
6382   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6383   os() << " ";
6384   if (!rd.Is(rm)) {
6385     os() << rd << ", ";
6386   }
6387   os() << rm << ", " << operand;
6388 }
6389 
vrshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6390 void Disassembler::vrshr(Condition cond,
6391                          DataType dt,
6392                          QRegister rd,
6393                          QRegister rm,
6394                          const QOperand& operand) {
6395   os().SetCurrentInstruction(kVrshr, kFpNeon);
6396   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
6397   os() << " ";
6398   if (!rd.Is(rm)) {
6399     os() << rd << ", ";
6400   }
6401   os() << rm << ", " << operand;
6402 }
6403 
vrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6404 void Disassembler::vrshrn(Condition cond,
6405                           DataType dt,
6406                           DRegister rd,
6407                           QRegister rm,
6408                           const QOperand& operand) {
6409   os().SetCurrentInstruction(kVrshrn, kFpNeon);
6410   os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6411        << rd << ", " << rm << ", " << operand;
6412 }
6413 
vrsqrte(Condition cond,DataType dt,DRegister rd,DRegister rm)6414 void Disassembler::vrsqrte(Condition cond,
6415                            DataType dt,
6416                            DRegister rd,
6417                            DRegister rm) {
6418   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6419   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6420        << rd << ", " << rm;
6421 }
6422 
vrsqrte(Condition cond,DataType dt,QRegister rd,QRegister rm)6423 void Disassembler::vrsqrte(Condition cond,
6424                            DataType dt,
6425                            QRegister rd,
6426                            QRegister rm) {
6427   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
6428   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
6429        << rd << ", " << rm;
6430 }
6431 
vrsqrts(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6432 void Disassembler::vrsqrts(
6433     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6434   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6435   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6436   os() << " ";
6437   if (!rd.Is(rn)) {
6438     os() << rd << ", ";
6439   }
6440   os() << rn << ", " << rm;
6441 }
6442 
vrsqrts(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6443 void Disassembler::vrsqrts(
6444     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6445   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
6446   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
6447   os() << " ";
6448   if (!rd.Is(rn)) {
6449     os() << rd << ", ";
6450   }
6451   os() << rn << ", " << rm;
6452 }
6453 
vrsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6454 void Disassembler::vrsra(Condition cond,
6455                          DataType dt,
6456                          DRegister rd,
6457                          DRegister rm,
6458                          const DOperand& operand) {
6459   os().SetCurrentInstruction(kVrsra, kFpNeon);
6460   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6461   os() << " ";
6462   if (!rd.Is(rm)) {
6463     os() << rd << ", ";
6464   }
6465   os() << rm << ", " << operand;
6466 }
6467 
vrsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6468 void Disassembler::vrsra(Condition cond,
6469                          DataType dt,
6470                          QRegister rd,
6471                          QRegister rm,
6472                          const QOperand& operand) {
6473   os().SetCurrentInstruction(kVrsra, kFpNeon);
6474   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
6475   os() << " ";
6476   if (!rd.Is(rm)) {
6477     os() << rd << ", ";
6478   }
6479   os() << rm << ", " << operand;
6480 }
6481 
vrsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)6482 void Disassembler::vrsubhn(
6483     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6484   os().SetCurrentInstruction(kVrsubhn, kFpNeon);
6485   os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6486        << rd << ", " << rn << ", " << rm;
6487 }
6488 
vseleq(DataType dt,DRegister rd,DRegister rn,DRegister rm)6489 void Disassembler::vseleq(DataType dt,
6490                           DRegister rd,
6491                           DRegister rn,
6492                           DRegister rm) {
6493   os().SetCurrentInstruction(kVseleq, kFpNeon);
6494   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6495 }
6496 
vseleq(DataType dt,SRegister rd,SRegister rn,SRegister rm)6497 void Disassembler::vseleq(DataType dt,
6498                           SRegister rd,
6499                           SRegister rn,
6500                           SRegister rm) {
6501   os().SetCurrentInstruction(kVseleq, kFpNeon);
6502   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
6503 }
6504 
vselge(DataType dt,DRegister rd,DRegister rn,DRegister rm)6505 void Disassembler::vselge(DataType dt,
6506                           DRegister rd,
6507                           DRegister rn,
6508                           DRegister rm) {
6509   os().SetCurrentInstruction(kVselge, kFpNeon);
6510   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6511 }
6512 
vselge(DataType dt,SRegister rd,SRegister rn,SRegister rm)6513 void Disassembler::vselge(DataType dt,
6514                           SRegister rd,
6515                           SRegister rn,
6516                           SRegister rm) {
6517   os().SetCurrentInstruction(kVselge, kFpNeon);
6518   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
6519 }
6520 
vselgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)6521 void Disassembler::vselgt(DataType dt,
6522                           DRegister rd,
6523                           DRegister rn,
6524                           DRegister rm) {
6525   os().SetCurrentInstruction(kVselgt, kFpNeon);
6526   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6527 }
6528 
vselgt(DataType dt,SRegister rd,SRegister rn,SRegister rm)6529 void Disassembler::vselgt(DataType dt,
6530                           SRegister rd,
6531                           SRegister rn,
6532                           SRegister rm) {
6533   os().SetCurrentInstruction(kVselgt, kFpNeon);
6534   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
6535 }
6536 
vselvs(DataType dt,DRegister rd,DRegister rn,DRegister rm)6537 void Disassembler::vselvs(DataType dt,
6538                           DRegister rd,
6539                           DRegister rn,
6540                           DRegister rm) {
6541   os().SetCurrentInstruction(kVselvs, kFpNeon);
6542   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6543 }
6544 
vselvs(DataType dt,SRegister rd,SRegister rn,SRegister rm)6545 void Disassembler::vselvs(DataType dt,
6546                           SRegister rd,
6547                           SRegister rn,
6548                           SRegister rm) {
6549   os().SetCurrentInstruction(kVselvs, kFpNeon);
6550   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
6551 }
6552 
vshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6553 void Disassembler::vshl(Condition cond,
6554                         DataType dt,
6555                         DRegister rd,
6556                         DRegister rm,
6557                         const DOperand& operand) {
6558   os().SetCurrentInstruction(kVshl, kFpNeon);
6559   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6560   os() << " ";
6561   if (!rd.Is(rm)) {
6562     os() << rd << ", ";
6563   }
6564   os() << rm << ", " << operand;
6565 }
6566 
vshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6567 void Disassembler::vshl(Condition cond,
6568                         DataType dt,
6569                         QRegister rd,
6570                         QRegister rm,
6571                         const QOperand& operand) {
6572   os().SetCurrentInstruction(kVshl, kFpNeon);
6573   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
6574   os() << " ";
6575   if (!rd.Is(rm)) {
6576     os() << rd << ", ";
6577   }
6578   os() << rm << ", " << operand;
6579 }
6580 
vshll(Condition cond,DataType dt,QRegister rd,DRegister rm,const DOperand & operand)6581 void Disassembler::vshll(Condition cond,
6582                          DataType dt,
6583                          QRegister rd,
6584                          DRegister rm,
6585                          const DOperand& operand) {
6586   os().SetCurrentInstruction(kVshll, kFpNeon);
6587   os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
6588        << rd << ", " << rm << ", " << operand;
6589 }
6590 
vshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6591 void Disassembler::vshr(Condition cond,
6592                         DataType dt,
6593                         DRegister rd,
6594                         DRegister rm,
6595                         const DOperand& operand) {
6596   os().SetCurrentInstruction(kVshr, kFpNeon);
6597   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6598   os() << " ";
6599   if (!rd.Is(rm)) {
6600     os() << rd << ", ";
6601   }
6602   os() << rm << ", " << operand;
6603 }
6604 
vshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6605 void Disassembler::vshr(Condition cond,
6606                         DataType dt,
6607                         QRegister rd,
6608                         QRegister rm,
6609                         const QOperand& operand) {
6610   os().SetCurrentInstruction(kVshr, kFpNeon);
6611   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
6612   os() << " ";
6613   if (!rd.Is(rm)) {
6614     os() << rd << ", ";
6615   }
6616   os() << rm << ", " << operand;
6617 }
6618 
vshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)6619 void Disassembler::vshrn(Condition cond,
6620                          DataType dt,
6621                          DRegister rd,
6622                          QRegister rm,
6623                          const QOperand& operand) {
6624   os().SetCurrentInstruction(kVshrn, kFpNeon);
6625   os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
6626        << rd << ", " << rm << ", " << operand;
6627 }
6628 
vsli(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6629 void Disassembler::vsli(Condition cond,
6630                         DataType dt,
6631                         DRegister rd,
6632                         DRegister rm,
6633                         const DOperand& operand) {
6634   os().SetCurrentInstruction(kVsli, kFpNeon);
6635   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6636   os() << " ";
6637   if (!rd.Is(rm)) {
6638     os() << rd << ", ";
6639   }
6640   os() << rm << ", " << operand;
6641 }
6642 
vsli(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6643 void Disassembler::vsli(Condition cond,
6644                         DataType dt,
6645                         QRegister rd,
6646                         QRegister rm,
6647                         const QOperand& operand) {
6648   os().SetCurrentInstruction(kVsli, kFpNeon);
6649   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
6650   os() << " ";
6651   if (!rd.Is(rm)) {
6652     os() << rd << ", ";
6653   }
6654   os() << rm << ", " << operand;
6655 }
6656 
vsqrt(Condition cond,DataType dt,SRegister rd,SRegister rm)6657 void Disassembler::vsqrt(Condition cond,
6658                          DataType dt,
6659                          SRegister rd,
6660                          SRegister rm) {
6661   os().SetCurrentInstruction(kVsqrt, kFpNeon);
6662   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6663        << rd << ", " << rm;
6664 }
6665 
vsqrt(Condition cond,DataType dt,DRegister rd,DRegister rm)6666 void Disassembler::vsqrt(Condition cond,
6667                          DataType dt,
6668                          DRegister rd,
6669                          DRegister rm) {
6670   os().SetCurrentInstruction(kVsqrt, kFpNeon);
6671   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
6672        << rd << ", " << rm;
6673 }
6674 
vsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6675 void Disassembler::vsra(Condition cond,
6676                         DataType dt,
6677                         DRegister rd,
6678                         DRegister rm,
6679                         const DOperand& operand) {
6680   os().SetCurrentInstruction(kVsra, kFpNeon);
6681   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6682   os() << " ";
6683   if (!rd.Is(rm)) {
6684     os() << rd << ", ";
6685   }
6686   os() << rm << ", " << operand;
6687 }
6688 
vsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6689 void Disassembler::vsra(Condition cond,
6690                         DataType dt,
6691                         QRegister rd,
6692                         QRegister rm,
6693                         const QOperand& operand) {
6694   os().SetCurrentInstruction(kVsra, kFpNeon);
6695   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
6696   os() << " ";
6697   if (!rd.Is(rm)) {
6698     os() << rd << ", ";
6699   }
6700   os() << rm << ", " << operand;
6701 }
6702 
vsri(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6703 void Disassembler::vsri(Condition cond,
6704                         DataType dt,
6705                         DRegister rd,
6706                         DRegister rm,
6707                         const DOperand& operand) {
6708   os().SetCurrentInstruction(kVsri, kFpNeon);
6709   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6710   os() << " ";
6711   if (!rd.Is(rm)) {
6712     os() << rd << ", ";
6713   }
6714   os() << rm << ", " << operand;
6715 }
6716 
vsri(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6717 void Disassembler::vsri(Condition cond,
6718                         DataType dt,
6719                         QRegister rd,
6720                         QRegister rm,
6721                         const QOperand& operand) {
6722   os().SetCurrentInstruction(kVsri, kFpNeon);
6723   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
6724   os() << " ";
6725   if (!rd.Is(rm)) {
6726     os() << rd << ", ";
6727   }
6728   os() << rm << ", " << operand;
6729 }
6730 
vst1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6731 void Disassembler::vst1(Condition cond,
6732                         DataType dt,
6733                         const NeonRegisterList& nreglist,
6734                         const AlignedMemOperand& operand) {
6735   os().SetCurrentInstruction(kVst1, kFpNeon);
6736   os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
6737        << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
6738 }
6739 
vst2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6740 void Disassembler::vst2(Condition cond,
6741                         DataType dt,
6742                         const NeonRegisterList& nreglist,
6743                         const AlignedMemOperand& operand) {
6744   os().SetCurrentInstruction(kVst2, kFpNeon);
6745   os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
6746        << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
6747 }
6748 
vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6749 void Disassembler::vst3(Condition cond,
6750                         DataType dt,
6751                         const NeonRegisterList& nreglist,
6752                         const AlignedMemOperand& operand) {
6753   os().SetCurrentInstruction(kVst3, kFpNeon);
6754   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6755        << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
6756 }
6757 
vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)6758 void Disassembler::vst3(Condition cond,
6759                         DataType dt,
6760                         const NeonRegisterList& nreglist,
6761                         const MemOperand& operand) {
6762   os().SetCurrentInstruction(kVst3, kFpNeon);
6763   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
6764        << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
6765 }
6766 
vst4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)6767 void Disassembler::vst4(Condition cond,
6768                         DataType dt,
6769                         const NeonRegisterList& nreglist,
6770                         const AlignedMemOperand& operand) {
6771   os().SetCurrentInstruction(kVst4, kFpNeon);
6772   os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
6773        << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
6774 }
6775 
vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)6776 void Disassembler::vstm(Condition cond,
6777                         DataType dt,
6778                         Register rn,
6779                         WriteBack write_back,
6780                         DRegisterList dreglist) {
6781   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6782   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6783        << rn << write_back << ", " << dreglist;
6784 }
6785 
vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)6786 void Disassembler::vstm(Condition cond,
6787                         DataType dt,
6788                         Register rn,
6789                         WriteBack write_back,
6790                         SRegisterList sreglist) {
6791   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
6792   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
6793        << rn << write_back << ", " << sreglist;
6794 }
6795 
vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)6796 void Disassembler::vstmdb(Condition cond,
6797                           DataType dt,
6798                           Register rn,
6799                           WriteBack write_back,
6800                           DRegisterList dreglist) {
6801   os().SetCurrentInstruction(kVstmdb,
6802                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6803   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6804        << rn << write_back << ", " << dreglist;
6805 }
6806 
vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)6807 void Disassembler::vstmdb(Condition cond,
6808                           DataType dt,
6809                           Register rn,
6810                           WriteBack write_back,
6811                           SRegisterList sreglist) {
6812   os().SetCurrentInstruction(kVstmdb,
6813                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6814   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
6815        << rn << write_back << ", " << sreglist;
6816 }
6817 
vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)6818 void Disassembler::vstmia(Condition cond,
6819                           DataType dt,
6820                           Register rn,
6821                           WriteBack write_back,
6822                           DRegisterList dreglist) {
6823   os().SetCurrentInstruction(kVstmia,
6824                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6825   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6826        << rn << write_back << ", " << dreglist;
6827 }
6828 
vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)6829 void Disassembler::vstmia(Condition cond,
6830                           DataType dt,
6831                           Register rn,
6832                           WriteBack write_back,
6833                           SRegisterList sreglist) {
6834   os().SetCurrentInstruction(kVstmia,
6835                              kLoadStore | kLoadStoreMultiple | kFpNeon);
6836   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
6837        << rn << write_back << ", " << sreglist;
6838 }
6839 
vstr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)6840 void Disassembler::vstr(Condition cond,
6841                         DataType dt,
6842                         DRegister rd,
6843                         const MemOperand& operand) {
6844   os().SetCurrentInstruction(kVstr, kFpNeon);
6845   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " "
6846        << rd << ", " << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
6847 }
6848 
vstr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)6849 void Disassembler::vstr(Condition cond,
6850                         DataType dt,
6851                         SRegister rd,
6852                         const MemOperand& operand) {
6853   os().SetCurrentInstruction(kVstr, kFpNeon);
6854   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " "
6855        << rd << ", " << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
6856 }
6857 
vsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6858 void Disassembler::vsub(
6859     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6860   os().SetCurrentInstruction(kVsub, kFpNeon);
6861   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6862   os() << " ";
6863   if (!rd.Is(rn)) {
6864     os() << rd << ", ";
6865   }
6866   os() << rn << ", " << rm;
6867 }
6868 
vsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6869 void Disassembler::vsub(
6870     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6871   os().SetCurrentInstruction(kVsub, kFpNeon);
6872   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6873   os() << " ";
6874   if (!rd.Is(rn)) {
6875     os() << rd << ", ";
6876   }
6877   os() << rn << ", " << rm;
6878 }
6879 
vsub(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6880 void Disassembler::vsub(
6881     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6882   os().SetCurrentInstruction(kVsub, kFpNeon);
6883   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
6884   os() << " ";
6885   if (!rd.Is(rn)) {
6886     os() << rd << ", ";
6887   }
6888   os() << rn << ", " << rm;
6889 }
6890 
vsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)6891 void Disassembler::vsubhn(
6892     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6893   os().SetCurrentInstruction(kVsubhn, kFpNeon);
6894   os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
6895        << rd << ", " << rn << ", " << rm;
6896 }
6897 
vsubl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)6898 void Disassembler::vsubl(
6899     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6900   os().SetCurrentInstruction(kVsubl, kFpNeon);
6901   os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
6902        << rd << ", " << rn << ", " << rm;
6903 }
6904 
vsubw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)6905 void Disassembler::vsubw(
6906     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
6907   os().SetCurrentInstruction(kVsubw, kFpNeon);
6908   os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
6909   os() << " ";
6910   if (!rd.Is(rn)) {
6911     os() << rd << ", ";
6912   }
6913   os() << rn << ", " << rm;
6914 }
6915 
vswp(Condition cond,DataType dt,DRegister rd,DRegister rm)6916 void Disassembler::vswp(Condition cond,
6917                         DataType dt,
6918                         DRegister rd,
6919                         DRegister rm) {
6920   os().SetCurrentInstruction(kVswp, kFpNeon);
6921   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6922        << rd << ", " << rm;
6923 }
6924 
vswp(Condition cond,DataType dt,QRegister rd,QRegister rm)6925 void Disassembler::vswp(Condition cond,
6926                         DataType dt,
6927                         QRegister rd,
6928                         QRegister rm) {
6929   os().SetCurrentInstruction(kVswp, kFpNeon);
6930   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
6931        << rd << ", " << rm;
6932 }
6933 
vtbl(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)6934 void Disassembler::vtbl(Condition cond,
6935                         DataType dt,
6936                         DRegister rd,
6937                         const NeonRegisterList& nreglist,
6938                         DRegister rm) {
6939   os().SetCurrentInstruction(kVtbl, kFpNeon);
6940   os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
6941        << rd << ", " << nreglist << ", " << rm;
6942 }
6943 
vtbx(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)6944 void Disassembler::vtbx(Condition cond,
6945                         DataType dt,
6946                         DRegister rd,
6947                         const NeonRegisterList& nreglist,
6948                         DRegister rm) {
6949   os().SetCurrentInstruction(kVtbx, kFpNeon);
6950   os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
6951        << rd << ", " << nreglist << ", " << rm;
6952 }
6953 
vtrn(Condition cond,DataType dt,DRegister rd,DRegister rm)6954 void Disassembler::vtrn(Condition cond,
6955                         DataType dt,
6956                         DRegister rd,
6957                         DRegister rm) {
6958   os().SetCurrentInstruction(kVtrn, kFpNeon);
6959   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6960        << rd << ", " << rm;
6961 }
6962 
vtrn(Condition cond,DataType dt,QRegister rd,QRegister rm)6963 void Disassembler::vtrn(Condition cond,
6964                         DataType dt,
6965                         QRegister rd,
6966                         QRegister rm) {
6967   os().SetCurrentInstruction(kVtrn, kFpNeon);
6968   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
6969        << rd << ", " << rm;
6970 }
6971 
vtst(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6972 void Disassembler::vtst(
6973     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6974   os().SetCurrentInstruction(kVtst, kFpNeon);
6975   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6976   os() << " ";
6977   if (!rd.Is(rn)) {
6978     os() << rd << ", ";
6979   }
6980   os() << rn << ", " << rm;
6981 }
6982 
vtst(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6983 void Disassembler::vtst(
6984     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6985   os().SetCurrentInstruction(kVtst, kFpNeon);
6986   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
6987   os() << " ";
6988   if (!rd.Is(rn)) {
6989     os() << rd << ", ";
6990   }
6991   os() << rn << ", " << rm;
6992 }
6993 
vuzp(Condition cond,DataType dt,DRegister rd,DRegister rm)6994 void Disassembler::vuzp(Condition cond,
6995                         DataType dt,
6996                         DRegister rd,
6997                         DRegister rm) {
6998   os().SetCurrentInstruction(kVuzp, kFpNeon);
6999   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
7000        << rd << ", " << rm;
7001 }
7002 
vuzp(Condition cond,DataType dt,QRegister rd,QRegister rm)7003 void Disassembler::vuzp(Condition cond,
7004                         DataType dt,
7005                         QRegister rd,
7006                         QRegister rm) {
7007   os().SetCurrentInstruction(kVuzp, kFpNeon);
7008   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
7009        << rd << ", " << rm;
7010 }
7011 
vzip(Condition cond,DataType dt,DRegister rd,DRegister rm)7012 void Disassembler::vzip(Condition cond,
7013                         DataType dt,
7014                         DRegister rd,
7015                         DRegister rm) {
7016   os().SetCurrentInstruction(kVzip, kFpNeon);
7017   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
7018        << rd << ", " << rm;
7019 }
7020 
vzip(Condition cond,DataType dt,QRegister rd,QRegister rm)7021 void Disassembler::vzip(Condition cond,
7022                         DataType dt,
7023                         QRegister rd,
7024                         QRegister rm) {
7025   os().SetCurrentInstruction(kVzip, kFpNeon);
7026   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
7027        << rd << ", " << rm;
7028 }
7029 
yield(Condition cond,EncodingSize size)7030 void Disassembler::yield(Condition cond, EncodingSize size) {
7031   os().SetCurrentInstruction(kYield, kNoAttribute);
7032   os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
7033 }
7034 
T32Size(uint32_t instr)7035 int Disassembler::T32Size(uint32_t instr) {
7036   if ((instr & 0xe0000000) == 0xe0000000) {
7037     switch (instr & 0x08000000) {
7038       case 0x00000000:
7039         if ((instr & 0x10000000) == 0x10000000) return 4;
7040         return 2;
7041       case 0x08000000:
7042         return 4;
7043       default:
7044         return 2;
7045     }
7046   }
7047   return 2;
7048 }
7049 
DecodeT32(uint32_t instr)7050 void Disassembler::DecodeT32(uint32_t instr) {
7051   T32CodeAddressIncrementer incrementer(instr, &code_address_);
7052   ITBlockScope it_scope(&it_block_);
7053 
7054   switch (instr & 0xe0000000) {
7055     case 0x00000000: {
7056       // 0x00000000
7057       switch (instr & 0x18000000) {
7058         case 0x18000000: {
7059           // 0x18000000
7060           switch (instr & 0x06000000) {
7061             case 0x00000000: {
7062               // 0x18000000
7063               unsigned rd = (instr >> 16) & 0x7;
7064               unsigned rn = (instr >> 19) & 0x7;
7065               unsigned rm = (instr >> 22) & 0x7;
7066               if (InITBlock()) {
7067                 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7068                 add(CurrentCond(),
7069                     Best,
7070                     Register(rd),
7071                     Register(rn),
7072                     Register(rm));
7073               } else {
7074                 VIXL_ASSERT(OutsideITBlock());
7075                 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7076                 adds(Condition::None(),
7077                      Best,
7078                      Register(rd),
7079                      Register(rn),
7080                      Register(rm));
7081               }
7082               break;
7083             }
7084             case 0x02000000: {
7085               // 0x1a000000
7086               unsigned rd = (instr >> 16) & 0x7;
7087               unsigned rn = (instr >> 19) & 0x7;
7088               unsigned rm = (instr >> 22) & 0x7;
7089               if (InITBlock()) {
7090                 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
7091                 sub(CurrentCond(),
7092                     Best,
7093                     Register(rd),
7094                     Register(rn),
7095                     Register(rm));
7096               } else {
7097                 VIXL_ASSERT(OutsideITBlock());
7098                 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
7099                 subs(Condition::None(),
7100                      Best,
7101                      Register(rd),
7102                      Register(rn),
7103                      Register(rm));
7104               }
7105               break;
7106             }
7107             case 0x04000000: {
7108               // 0x1c000000
7109               unsigned rd = (instr >> 16) & 0x7;
7110               unsigned rn = (instr >> 19) & 0x7;
7111               uint32_t imm = (instr >> 22) & 0x7;
7112               if (InITBlock()) {
7113                 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7114                 add(CurrentCond(), Best, Register(rd), Register(rn), imm);
7115               } else {
7116                 VIXL_ASSERT(OutsideITBlock());
7117                 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7118                 adds(Condition::None(), Best, Register(rd), Register(rn), imm);
7119               }
7120               break;
7121             }
7122             case 0x06000000: {
7123               // 0x1e000000
7124               unsigned rd = (instr >> 16) & 0x7;
7125               unsigned rn = (instr >> 19) & 0x7;
7126               uint32_t imm = (instr >> 22) & 0x7;
7127               if (InITBlock()) {
7128                 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
7129                 sub(CurrentCond(), Best, Register(rd), Register(rn), imm);
7130               } else {
7131                 VIXL_ASSERT(OutsideITBlock());
7132                 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
7133                 subs(Condition::None(), Best, Register(rd), Register(rn), imm);
7134               }
7135               break;
7136             }
7137           }
7138           break;
7139         }
7140         default: {
7141           if (((instr & 0x18000000) == 0x18000000)) {
7142             UnallocatedT32(instr);
7143             return;
7144           }
7145           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7146               InITBlock()) {
7147             unsigned rd = (instr >> 16) & 0x7;
7148             unsigned rm = (instr >> 19) & 0x7;
7149             uint32_t amount = (instr >> 22) & 0x1f;
7150             if (amount == 0) amount = 32;
7151             // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7152             asr(CurrentCond(), Best, Register(rd), Register(rm), amount);
7153             return;
7154           }
7155           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
7156               !InITBlock()) {
7157             unsigned rd = (instr >> 16) & 0x7;
7158             unsigned rm = (instr >> 19) & 0x7;
7159             uint32_t amount = (instr >> 22) & 0x1f;
7160             if (amount == 0) amount = 32;
7161             // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7162             asrs(Condition::None(), Best, Register(rd), Register(rm), amount);
7163             return;
7164           }
7165           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7166               ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
7167             unsigned rd = (instr >> 16) & 0x7;
7168             unsigned rm = (instr >> 19) & 0x7;
7169             uint32_t amount = (instr >> 22) & 0x1f;
7170             // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7171             lsl(CurrentCond(), Best, Register(rd), Register(rm), amount);
7172             return;
7173           }
7174           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
7175               ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
7176             unsigned rd = (instr >> 16) & 0x7;
7177             unsigned rm = (instr >> 19) & 0x7;
7178             uint32_t amount = (instr >> 22) & 0x1f;
7179             // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7180             lsls(Condition::None(), Best, Register(rd), Register(rm), amount);
7181             return;
7182           }
7183           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7184               InITBlock()) {
7185             unsigned rd = (instr >> 16) & 0x7;
7186             unsigned rm = (instr >> 19) & 0x7;
7187             uint32_t amount = (instr >> 22) & 0x1f;
7188             if (amount == 0) amount = 32;
7189             // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7190             lsr(CurrentCond(), Best, Register(rd), Register(rm), amount);
7191             return;
7192           }
7193           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
7194               !InITBlock()) {
7195             unsigned rd = (instr >> 16) & 0x7;
7196             unsigned rm = (instr >> 19) & 0x7;
7197             uint32_t amount = (instr >> 22) & 0x1f;
7198             if (amount == 0) amount = 32;
7199             // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
7200             lsrs(Condition::None(), Best, Register(rd), Register(rm), amount);
7201             return;
7202           }
7203           unsigned rd = (instr >> 16) & 0x7;
7204           unsigned rm = (instr >> 19) & 0x7;
7205           ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
7206                                               (instr >> 22) & 0x1f);
7207           if (InITBlock()) {
7208             // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7209             mov(CurrentCond(),
7210                 Best,
7211                 Register(rd),
7212                 Operand(Register(rm),
7213                         shift_operand.GetType(),
7214                         shift_operand.GetAmount()));
7215           } else {
7216             VIXL_ASSERT(OutsideITBlock());
7217             // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
7218             movs(Condition::None(),
7219                  Best,
7220                  Register(rd),
7221                  Operand(Register(rm),
7222                          shift_operand.GetType(),
7223                          shift_operand.GetAmount()));
7224           }
7225           break;
7226         }
7227       }
7228       break;
7229     }
7230     case 0x20000000: {
7231       // 0x20000000
7232       switch (instr & 0x18000000) {
7233         case 0x00000000: {
7234           // 0x20000000
7235           unsigned rd = (instr >> 24) & 0x7;
7236           uint32_t imm = (instr >> 16) & 0xff;
7237           if (InITBlock()) {
7238             // MOV<c>{<q>} <Rd>, #<imm8> ; T1
7239             mov(CurrentCond(), Best, Register(rd), imm);
7240           } else {
7241             VIXL_ASSERT(OutsideITBlock());
7242             // MOVS{<q>} <Rd>, #<imm8> ; T1
7243             movs(Condition::None(), Best, Register(rd), imm);
7244           }
7245           break;
7246         }
7247         case 0x08000000: {
7248           // 0x28000000
7249           unsigned rn = (instr >> 24) & 0x7;
7250           uint32_t imm = (instr >> 16) & 0xff;
7251           // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
7252           cmp(CurrentCond(), Best, Register(rn), imm);
7253           break;
7254         }
7255         case 0x10000000: {
7256           // 0x30000000
7257           unsigned rd = (instr >> 24) & 0x7;
7258           uint32_t imm = (instr >> 16) & 0xff;
7259           if (InITBlock() && ((imm <= 7))) {
7260             // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
7261             add(CurrentCond(), Register(rd), imm);
7262           } else if (InITBlock() && ((imm > 7))) {
7263             // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7264             add(CurrentCond(), Best, Register(rd), Register(rd), imm);
7265           } else if (OutsideITBlock() && ((imm <= 7))) {
7266             // ADDS{<q>} <Rdn>, #<imm8> ; T2
7267             adds(Register(rd), imm);
7268           } else {
7269             VIXL_ASSERT(OutsideITBlock() && ((imm > 7)));
7270             // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7271             adds(Condition::None(), Best, Register(rd), Register(rd), imm);
7272           }
7273           break;
7274         }
7275         case 0x18000000: {
7276           // 0x38000000
7277           unsigned rd = (instr >> 24) & 0x7;
7278           uint32_t imm = (instr >> 16) & 0xff;
7279           if (InITBlock() && ((imm <= 7))) {
7280             // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
7281             sub(CurrentCond(), Register(rd), imm);
7282           } else if (InITBlock() && ((imm > 7))) {
7283             // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7284             sub(CurrentCond(), Best, Register(rd), Register(rd), imm);
7285           } else if (OutsideITBlock() && ((imm <= 7))) {
7286             // SUBS{<q>} <Rdn>, #<imm8> ; T2
7287             subs(Register(rd), imm);
7288           } else {
7289             VIXL_ASSERT(OutsideITBlock() && ((imm > 7)));
7290             // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
7291             subs(Condition::None(), Best, Register(rd), Register(rd), imm);
7292           }
7293           break;
7294         }
7295       }
7296       break;
7297     }
7298     case 0x40000000: {
7299       // 0x40000000
7300       switch (instr & 0x18000000) {
7301         case 0x00000000: {
7302           // 0x40000000
7303           switch (instr & 0x07000000) {
7304             case 0x00000000: {
7305               // 0x40000000
7306               switch (instr & 0x00c00000) {
7307                 case 0x00000000: {
7308                   // 0x40000000
7309                   unsigned rd = (instr >> 16) & 0x7;
7310                   unsigned rm = (instr >> 19) & 0x7;
7311                   if (InITBlock()) {
7312                     // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7313                     and_(CurrentCond(),
7314                          Best,
7315                          Register(rd),
7316                          Register(rd),
7317                          Register(rm));
7318                   } else {
7319                     VIXL_ASSERT(OutsideITBlock());
7320                     // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7321                     ands(Condition::None(),
7322                          Best,
7323                          Register(rd),
7324                          Register(rd),
7325                          Register(rm));
7326                   }
7327                   break;
7328                 }
7329                 case 0x00400000: {
7330                   // 0x40400000
7331                   unsigned rd = (instr >> 16) & 0x7;
7332                   unsigned rm = (instr >> 19) & 0x7;
7333                   if (InITBlock()) {
7334                     // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7335                     eor(CurrentCond(),
7336                         Best,
7337                         Register(rd),
7338                         Register(rd),
7339                         Register(rm));
7340                   } else {
7341                     VIXL_ASSERT(OutsideITBlock());
7342                     // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7343                     eors(Condition::None(),
7344                          Best,
7345                          Register(rd),
7346                          Register(rd),
7347                          Register(rm));
7348                   }
7349                   break;
7350                 }
7351                 case 0x00800000: {
7352                   // 0x40800000
7353                   if (InITBlock()) {
7354                     unsigned rd = (instr >> 16) & 0x7;
7355                     unsigned rs = (instr >> 19) & 0x7;
7356                     // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7357                     lsl(CurrentCond(),
7358                         Best,
7359                         Register(rd),
7360                         Register(rd),
7361                         Register(rs));
7362                     return;
7363                   }
7364                   if (!InITBlock()) {
7365                     unsigned rd = (instr >> 16) & 0x7;
7366                     unsigned rs = (instr >> 19) & 0x7;
7367                     // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7368                     lsls(Condition::None(),
7369                          Best,
7370                          Register(rd),
7371                          Register(rd),
7372                          Register(rs));
7373                     return;
7374                   }
7375                   unsigned rd = (instr >> 16) & 0x7;
7376                   unsigned rm = (instr >> 16) & 0x7;
7377                   unsigned rs = (instr >> 19) & 0x7;
7378                   if (InITBlock()) {
7379                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7380                     mov(CurrentCond(),
7381                         Best,
7382                         Register(rd),
7383                         Operand(Register(rm), LSL, Register(rs)));
7384                   } else {
7385                     VIXL_ASSERT(OutsideITBlock());
7386                     // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
7387                     movs(Condition::None(),
7388                          Best,
7389                          Register(rd),
7390                          Operand(Register(rm), LSL, Register(rs)));
7391                   }
7392                   break;
7393                 }
7394                 case 0x00c00000: {
7395                   // 0x40c00000
7396                   if (InITBlock()) {
7397                     unsigned rd = (instr >> 16) & 0x7;
7398                     unsigned rs = (instr >> 19) & 0x7;
7399                     // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7400                     lsr(CurrentCond(),
7401                         Best,
7402                         Register(rd),
7403                         Register(rd),
7404                         Register(rs));
7405                     return;
7406                   }
7407                   if (!InITBlock()) {
7408                     unsigned rd = (instr >> 16) & 0x7;
7409                     unsigned rs = (instr >> 19) & 0x7;
7410                     // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7411                     lsrs(Condition::None(),
7412                          Best,
7413                          Register(rd),
7414                          Register(rd),
7415                          Register(rs));
7416                     return;
7417                   }
7418                   unsigned rd = (instr >> 16) & 0x7;
7419                   unsigned rm = (instr >> 16) & 0x7;
7420                   unsigned rs = (instr >> 19) & 0x7;
7421                   if (InITBlock()) {
7422                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7423                     mov(CurrentCond(),
7424                         Best,
7425                         Register(rd),
7426                         Operand(Register(rm), LSR, Register(rs)));
7427                   } else {
7428                     VIXL_ASSERT(OutsideITBlock());
7429                     // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
7430                     movs(Condition::None(),
7431                          Best,
7432                          Register(rd),
7433                          Operand(Register(rm), LSR, Register(rs)));
7434                   }
7435                   break;
7436                 }
7437               }
7438               break;
7439             }
7440             case 0x01000000: {
7441               // 0x41000000
7442               switch (instr & 0x00c00000) {
7443                 case 0x00000000: {
7444                   // 0x41000000
7445                   if (InITBlock()) {
7446                     unsigned rd = (instr >> 16) & 0x7;
7447                     unsigned rs = (instr >> 19) & 0x7;
7448                     // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7449                     asr(CurrentCond(),
7450                         Best,
7451                         Register(rd),
7452                         Register(rd),
7453                         Register(rs));
7454                     return;
7455                   }
7456                   if (!InITBlock()) {
7457                     unsigned rd = (instr >> 16) & 0x7;
7458                     unsigned rs = (instr >> 19) & 0x7;
7459                     // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7460                     asrs(Condition::None(),
7461                          Best,
7462                          Register(rd),
7463                          Register(rd),
7464                          Register(rs));
7465                     return;
7466                   }
7467                   unsigned rd = (instr >> 16) & 0x7;
7468                   unsigned rm = (instr >> 16) & 0x7;
7469                   unsigned rs = (instr >> 19) & 0x7;
7470                   if (InITBlock()) {
7471                     // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7472                     mov(CurrentCond(),
7473                         Best,
7474                         Register(rd),
7475                         Operand(Register(rm), ASR, Register(rs)));
7476                   } else {
7477                     VIXL_ASSERT(OutsideITBlock());
7478                     // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
7479                     movs(Condition::None(),
7480                          Best,
7481                          Register(rd),
7482                          Operand(Register(rm), ASR, Register(rs)));
7483                   }
7484                   break;
7485                 }
7486                 case 0x00400000: {
7487                   // 0x41400000
7488                   unsigned rd = (instr >> 16) & 0x7;
7489                   unsigned rm = (instr >> 19) & 0x7;
7490                   if (InITBlock()) {
7491                     // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7492                     adc(CurrentCond(),
7493                         Best,
7494                         Register(rd),
7495                         Register(rd),
7496                         Register(rm));
7497                   } else {
7498                     VIXL_ASSERT(OutsideITBlock());
7499                     // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7500                     adcs(Condition::None(),
7501                          Best,
7502                          Register(rd),
7503                          Register(rd),
7504                          Register(rm));
7505                   }
7506                   break;
7507                 }
7508                 case 0x00800000: {
7509                   // 0x41800000
7510                   unsigned rd = (instr >> 16) & 0x7;
7511                   unsigned rm = (instr >> 19) & 0x7;
7512                   if (InITBlock()) {
7513                     // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7514                     sbc(CurrentCond(),
7515                         Best,
7516                         Register(rd),
7517                         Register(rd),
7518                         Register(rm));
7519                   } else {
7520                     VIXL_ASSERT(OutsideITBlock());
7521                     // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7522                     sbcs(Condition::None(),
7523                          Best,
7524                          Register(rd),
7525                          Register(rd),
7526                          Register(rm));
7527                   }
7528                   break;
7529                 }
7530                 case 0x00c00000: {
7531                   // 0x41c00000
7532                   if (InITBlock()) {
7533                     unsigned rd = (instr >> 16) & 0x7;
7534                     unsigned rs = (instr >> 19) & 0x7;
7535                     // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7536                     ror(CurrentCond(),
7537                         Best,
7538                         Register(rd),
7539                         Register(rd),
7540                         Register(rs));
7541                     return;
7542                   }
7543                   if (!InITBlock()) {
7544                     unsigned rd = (instr >> 16) & 0x7;
7545                     unsigned rs = (instr >> 19) & 0x7;
7546                     // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
7547                     rors(Condition::None(),
7548                          Best,
7549                          Register(rd),
7550                          Register(rd),
7551                          Register(rs));
7552                     return;
7553                   }
7554                   unsigned rd = (instr >> 16) & 0x7;
7555                   unsigned rm = (instr >> 16) & 0x7;
7556                   unsigned rs = (instr >> 19) & 0x7;
7557                   if (InITBlock()) {
7558                     // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7559                     mov(CurrentCond(),
7560                         Best,
7561                         Register(rd),
7562                         Operand(Register(rm), ROR, Register(rs)));
7563                   } else {
7564                     VIXL_ASSERT(OutsideITBlock());
7565                     // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
7566                     movs(Condition::None(),
7567                          Best,
7568                          Register(rd),
7569                          Operand(Register(rm), ROR, Register(rs)));
7570                   }
7571                   break;
7572                 }
7573               }
7574               break;
7575             }
7576             case 0x02000000: {
7577               // 0x42000000
7578               switch (instr & 0x00c00000) {
7579                 case 0x00000000: {
7580                   // 0x42000000
7581                   unsigned rn = (instr >> 16) & 0x7;
7582                   unsigned rm = (instr >> 19) & 0x7;
7583                   // TST{<c>}{<q>} <Rn>, <Rm> ; T1
7584                   tst(CurrentCond(), Best, Register(rn), Register(rm));
7585                   break;
7586                 }
7587                 case 0x00400000: {
7588                   // 0x42400000
7589                   unsigned rd = (instr >> 16) & 0x7;
7590                   unsigned rn = (instr >> 19) & 0x7;
7591                   if (InITBlock()) {
7592                     // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
7593                     rsb(CurrentCond(),
7594                         Best,
7595                         Register(rd),
7596                         Register(rn),
7597                         UINT32_C(0));
7598                   } else {
7599                     VIXL_ASSERT(OutsideITBlock());
7600                     // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
7601                     rsbs(Condition::None(),
7602                          Best,
7603                          Register(rd),
7604                          Register(rn),
7605                          UINT32_C(0));
7606                   }
7607                   break;
7608                 }
7609                 case 0x00800000: {
7610                   // 0x42800000
7611                   unsigned rn = (instr >> 16) & 0x7;
7612                   unsigned rm = (instr >> 19) & 0x7;
7613                   // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
7614                   cmp(CurrentCond(), Best, Register(rn), Register(rm));
7615                   break;
7616                 }
7617                 case 0x00c00000: {
7618                   // 0x42c00000
7619                   unsigned rn = (instr >> 16) & 0x7;
7620                   unsigned rm = (instr >> 19) & 0x7;
7621                   // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
7622                   cmn(CurrentCond(), Best, Register(rn), Register(rm));
7623                   break;
7624                 }
7625               }
7626               break;
7627             }
7628             case 0x03000000: {
7629               // 0x43000000
7630               switch (instr & 0x00c00000) {
7631                 case 0x00000000: {
7632                   // 0x43000000
7633                   unsigned rd = (instr >> 16) & 0x7;
7634                   unsigned rm = (instr >> 19) & 0x7;
7635                   if (InITBlock()) {
7636                     // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7637                     orr(CurrentCond(),
7638                         Best,
7639                         Register(rd),
7640                         Register(rd),
7641                         Register(rm));
7642                   } else {
7643                     VIXL_ASSERT(OutsideITBlock());
7644                     // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7645                     orrs(Condition::None(),
7646                          Best,
7647                          Register(rd),
7648                          Register(rd),
7649                          Register(rm));
7650                   }
7651                   break;
7652                 }
7653                 case 0x00400000: {
7654                   // 0x43400000
7655                   unsigned rd = (instr >> 16) & 0x7;
7656                   unsigned rn = (instr >> 19) & 0x7;
7657                   if (InITBlock()) {
7658                     // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7659                     mul(CurrentCond(),
7660                         Best,
7661                         Register(rd),
7662                         Register(rn),
7663                         Register(rd));
7664                   } else {
7665                     VIXL_ASSERT(OutsideITBlock());
7666                     // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
7667                     muls(Condition::None(),
7668                          Register(rd),
7669                          Register(rn),
7670                          Register(rd));
7671                   }
7672                   break;
7673                 }
7674                 case 0x00800000: {
7675                   // 0x43800000
7676                   unsigned rd = (instr >> 16) & 0x7;
7677                   unsigned rm = (instr >> 19) & 0x7;
7678                   if (InITBlock()) {
7679                     // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7680                     bic(CurrentCond(),
7681                         Best,
7682                         Register(rd),
7683                         Register(rd),
7684                         Register(rm));
7685                   } else {
7686                     VIXL_ASSERT(OutsideITBlock());
7687                     // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
7688                     bics(Condition::None(),
7689                          Best,
7690                          Register(rd),
7691                          Register(rd),
7692                          Register(rm));
7693                   }
7694                   break;
7695                 }
7696                 case 0x00c00000: {
7697                   // 0x43c00000
7698                   unsigned rd = (instr >> 16) & 0x7;
7699                   unsigned rm = (instr >> 19) & 0x7;
7700                   if (InITBlock()) {
7701                     // MVN<c>{<q>} <Rd>, <Rm> ; T1
7702                     mvn(CurrentCond(), Best, Register(rd), Register(rm));
7703                   } else {
7704                     VIXL_ASSERT(OutsideITBlock());
7705                     // MVNS{<q>} <Rd>, <Rm> ; T1
7706                     mvns(Condition::None(), Best, Register(rd), Register(rm));
7707                   }
7708                   break;
7709                 }
7710               }
7711               break;
7712             }
7713             case 0x04000000: {
7714               // 0x44000000
7715               switch (instr & 0x00780000) {
7716                 case 0x00680000: {
7717                   // 0x44680000
7718                   unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7719                   // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
7720                   add(CurrentCond(), Best, Register(rd), sp, Register(rd));
7721                   break;
7722                 }
7723                 default: {
7724                   switch (instr & 0x00870000) {
7725                     case 0x00850000: {
7726                       // 0x44850000
7727                       if (((instr & 0x780000) == 0x680000)) {
7728                         UnallocatedT32(instr);
7729                         return;
7730                       }
7731                       unsigned rm = (instr >> 19) & 0xf;
7732                       // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
7733                       add(CurrentCond(), Best, sp, sp, Register(rm));
7734                       break;
7735                     }
7736                     default: {
7737                       if (((instr & 0x780000) == 0x680000) ||
7738                           ((instr & 0x870000) == 0x850000)) {
7739                         UnallocatedT32(instr);
7740                         return;
7741                       }
7742                       unsigned rd =
7743                           ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7744                       unsigned rm = (instr >> 19) & 0xf;
7745                       if (InITBlock()) {
7746                         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
7747                         add(CurrentCond(), Register(rd), Register(rm));
7748                       } else {
7749                         // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
7750                         add(CurrentCond(),
7751                             Best,
7752                             Register(rd),
7753                             Register(rd),
7754                             Register(rm));
7755                       }
7756                       break;
7757                     }
7758                   }
7759                   break;
7760                 }
7761               }
7762               break;
7763             }
7764             case 0x05000000: {
7765               // 0x45000000
7766               unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7767               unsigned rm = (instr >> 19) & 0xf;
7768               // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
7769               cmp(CurrentCond(), Best, Register(rn), Register(rm));
7770               break;
7771             }
7772             case 0x06000000: {
7773               // 0x46000000
7774               unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
7775               unsigned rm = (instr >> 19) & 0xf;
7776               // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
7777               mov(CurrentCond(), Best, Register(rd), Register(rm));
7778               break;
7779             }
7780             case 0x07000000: {
7781               // 0x47000000
7782               switch (instr & 0x00800000) {
7783                 case 0x00000000: {
7784                   // 0x47000000
7785                   unsigned rm = (instr >> 19) & 0xf;
7786                   // BX{<c>}{<q>} <Rm> ; T1
7787                   bx(CurrentCond(), Register(rm));
7788                   if (((instr & 0xff870000) != 0x47000000)) {
7789                     UnpredictableT32(instr);
7790                   }
7791                   break;
7792                 }
7793                 case 0x00800000: {
7794                   // 0x47800000
7795                   unsigned rm = (instr >> 19) & 0xf;
7796                   // BLX{<c>}{<q>} <Rm> ; T1
7797                   blx(CurrentCond(), Register(rm));
7798                   if (((instr & 0xff870000) != 0x47800000)) {
7799                     UnpredictableT32(instr);
7800                   }
7801                   break;
7802                 }
7803               }
7804               break;
7805             }
7806           }
7807           break;
7808         }
7809         case 0x08000000: {
7810           // 0x48000000
7811           unsigned rt = (instr >> 24) & 0x7;
7812           int32_t imm = ((instr >> 16) & 0xff) << 2;
7813           Label label(imm, kT32PcDelta);
7814           // LDR{<c>}{<q>} <Rt>, <label> ; T1
7815           ldr(CurrentCond(), Best, Register(rt), &label);
7816           break;
7817         }
7818         case 0x10000000: {
7819           // 0x50000000
7820           switch (instr & 0x06000000) {
7821             case 0x00000000: {
7822               // 0x50000000
7823               unsigned rt = (instr >> 16) & 0x7;
7824               unsigned rn = (instr >> 19) & 0x7;
7825               Sign sign(plus);
7826               unsigned rm = (instr >> 22) & 0x7;
7827               AddrMode addrmode = Offset;
7828               // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7829               str(CurrentCond(),
7830                   Best,
7831                   Register(rt),
7832                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7833               break;
7834             }
7835             case 0x02000000: {
7836               // 0x52000000
7837               unsigned rt = (instr >> 16) & 0x7;
7838               unsigned rn = (instr >> 19) & 0x7;
7839               Sign sign(plus);
7840               unsigned rm = (instr >> 22) & 0x7;
7841               AddrMode addrmode = Offset;
7842               // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7843               strh(CurrentCond(),
7844                    Best,
7845                    Register(rt),
7846                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7847               break;
7848             }
7849             case 0x04000000: {
7850               // 0x54000000
7851               unsigned rt = (instr >> 16) & 0x7;
7852               unsigned rn = (instr >> 19) & 0x7;
7853               Sign sign(plus);
7854               unsigned rm = (instr >> 22) & 0x7;
7855               AddrMode addrmode = Offset;
7856               // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7857               strb(CurrentCond(),
7858                    Best,
7859                    Register(rt),
7860                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7861               break;
7862             }
7863             case 0x06000000: {
7864               // 0x56000000
7865               unsigned rt = (instr >> 16) & 0x7;
7866               unsigned rn = (instr >> 19) & 0x7;
7867               Sign sign(plus);
7868               unsigned rm = (instr >> 22) & 0x7;
7869               AddrMode addrmode = Offset;
7870               // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7871               ldrsb(CurrentCond(),
7872                     Best,
7873                     Register(rt),
7874                     MemOperand(Register(rn), sign, Register(rm), addrmode));
7875               break;
7876             }
7877           }
7878           break;
7879         }
7880         case 0x18000000: {
7881           // 0x58000000
7882           switch (instr & 0x06000000) {
7883             case 0x00000000: {
7884               // 0x58000000
7885               unsigned rt = (instr >> 16) & 0x7;
7886               unsigned rn = (instr >> 19) & 0x7;
7887               Sign sign(plus);
7888               unsigned rm = (instr >> 22) & 0x7;
7889               AddrMode addrmode = Offset;
7890               // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7891               ldr(CurrentCond(),
7892                   Best,
7893                   Register(rt),
7894                   MemOperand(Register(rn), sign, Register(rm), addrmode));
7895               break;
7896             }
7897             case 0x02000000: {
7898               // 0x5a000000
7899               unsigned rt = (instr >> 16) & 0x7;
7900               unsigned rn = (instr >> 19) & 0x7;
7901               Sign sign(plus);
7902               unsigned rm = (instr >> 22) & 0x7;
7903               AddrMode addrmode = Offset;
7904               // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7905               ldrh(CurrentCond(),
7906                    Best,
7907                    Register(rt),
7908                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7909               break;
7910             }
7911             case 0x04000000: {
7912               // 0x5c000000
7913               unsigned rt = (instr >> 16) & 0x7;
7914               unsigned rn = (instr >> 19) & 0x7;
7915               Sign sign(plus);
7916               unsigned rm = (instr >> 22) & 0x7;
7917               AddrMode addrmode = Offset;
7918               // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7919               ldrb(CurrentCond(),
7920                    Best,
7921                    Register(rt),
7922                    MemOperand(Register(rn), sign, Register(rm), addrmode));
7923               break;
7924             }
7925             case 0x06000000: {
7926               // 0x5e000000
7927               unsigned rt = (instr >> 16) & 0x7;
7928               unsigned rn = (instr >> 19) & 0x7;
7929               Sign sign(plus);
7930               unsigned rm = (instr >> 22) & 0x7;
7931               AddrMode addrmode = Offset;
7932               // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
7933               ldrsh(CurrentCond(),
7934                     Best,
7935                     Register(rt),
7936                     MemOperand(Register(rn), sign, Register(rm), addrmode));
7937               break;
7938             }
7939           }
7940           break;
7941         }
7942       }
7943       break;
7944     }
7945     case 0x60000000: {
7946       // 0x60000000
7947       switch (instr & 0x18000000) {
7948         case 0x00000000: {
7949           // 0x60000000
7950           unsigned rt = (instr >> 16) & 0x7;
7951           unsigned rn = (instr >> 19) & 0x7;
7952           int32_t offset = ((instr >> 22) & 0x1f) << 2;
7953           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7954           str(CurrentCond(),
7955               Best,
7956               Register(rt),
7957               MemOperand(Register(rn), plus, offset, Offset));
7958           break;
7959         }
7960         case 0x08000000: {
7961           // 0x68000000
7962           unsigned rt = (instr >> 16) & 0x7;
7963           unsigned rn = (instr >> 19) & 0x7;
7964           int32_t offset = ((instr >> 22) & 0x1f) << 2;
7965           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7966           ldr(CurrentCond(),
7967               Best,
7968               Register(rt),
7969               MemOperand(Register(rn), plus, offset, Offset));
7970           break;
7971         }
7972         case 0x10000000: {
7973           // 0x70000000
7974           unsigned rt = (instr >> 16) & 0x7;
7975           unsigned rn = (instr >> 19) & 0x7;
7976           int32_t offset = (instr >> 22) & 0x1f;
7977           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7978           strb(CurrentCond(),
7979                Best,
7980                Register(rt),
7981                MemOperand(Register(rn), plus, offset, Offset));
7982           break;
7983         }
7984         case 0x18000000: {
7985           // 0x78000000
7986           unsigned rt = (instr >> 16) & 0x7;
7987           unsigned rn = (instr >> 19) & 0x7;
7988           int32_t offset = (instr >> 22) & 0x1f;
7989           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
7990           ldrb(CurrentCond(),
7991                Best,
7992                Register(rt),
7993                MemOperand(Register(rn), plus, offset, Offset));
7994           break;
7995         }
7996       }
7997       break;
7998     }
7999     case 0x80000000: {
8000       // 0x80000000
8001       switch (instr & 0x18000000) {
8002         case 0x00000000: {
8003           // 0x80000000
8004           unsigned rt = (instr >> 16) & 0x7;
8005           unsigned rn = (instr >> 19) & 0x7;
8006           int32_t offset = ((instr >> 22) & 0x1f) << 1;
8007           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
8008           strh(CurrentCond(),
8009                Best,
8010                Register(rt),
8011                MemOperand(Register(rn), plus, offset, Offset));
8012           break;
8013         }
8014         case 0x08000000: {
8015           // 0x88000000
8016           unsigned rt = (instr >> 16) & 0x7;
8017           unsigned rn = (instr >> 19) & 0x7;
8018           int32_t offset = ((instr >> 22) & 0x1f) << 1;
8019           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
8020           ldrh(CurrentCond(),
8021                Best,
8022                Register(rt),
8023                MemOperand(Register(rn), plus, offset, Offset));
8024           break;
8025         }
8026         case 0x10000000: {
8027           // 0x90000000
8028           unsigned rt = (instr >> 24) & 0x7;
8029           int32_t offset = ((instr >> 16) & 0xff) << 2;
8030           // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
8031           str(CurrentCond(),
8032               Best,
8033               Register(rt),
8034               MemOperand(sp, plus, offset, Offset));
8035           break;
8036         }
8037         case 0x18000000: {
8038           // 0x98000000
8039           unsigned rt = (instr >> 24) & 0x7;
8040           int32_t offset = ((instr >> 16) & 0xff) << 2;
8041           // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
8042           ldr(CurrentCond(),
8043               Best,
8044               Register(rt),
8045               MemOperand(sp, plus, offset, Offset));
8046           break;
8047         }
8048       }
8049       break;
8050     }
8051     case 0xa0000000: {
8052       // 0xa0000000
8053       switch (instr & 0x18000000) {
8054         case 0x00000000: {
8055           // 0xa0000000
8056           unsigned rd = (instr >> 24) & 0x7;
8057           int32_t imm = ((instr >> 16) & 0xff) << 2;
8058           Label label(imm, kT32PcDelta);
8059           // ADR{<c>}{<q>} <Rd>, <label> ; T1
8060           adr(CurrentCond(), Best, Register(rd), &label);
8061           break;
8062         }
8063         case 0x08000000: {
8064           // 0xa8000000
8065           unsigned rd = (instr >> 24) & 0x7;
8066           uint32_t imm = ((instr >> 16) & 0xff) << 2;
8067           // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
8068           add(CurrentCond(), Best, Register(rd), sp, imm);
8069           break;
8070         }
8071         case 0x10000000: {
8072           // 0xb0000000
8073           switch (instr & 0x04000000) {
8074             case 0x00000000: {
8075               // 0xb0000000
8076               switch (instr & 0x01000000) {
8077                 case 0x00000000: {
8078                   // 0xb0000000
8079                   switch (instr & 0x02800000) {
8080                     case 0x00000000: {
8081                       // 0xb0000000
8082                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8083                       // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
8084                       add(CurrentCond(), Best, sp, sp, imm);
8085                       break;
8086                     }
8087                     case 0x00800000: {
8088                       // 0xb0800000
8089                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
8090                       // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
8091                       sub(CurrentCond(), Best, sp, sp, imm);
8092                       break;
8093                     }
8094                     case 0x02000000: {
8095                       // 0xb2000000
8096                       switch (instr & 0x00400000) {
8097                         case 0x00000000: {
8098                           // 0xb2000000
8099                           unsigned rd = (instr >> 16) & 0x7;
8100                           unsigned rm = (instr >> 19) & 0x7;
8101                           // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8102                           sxth(CurrentCond(), Best, Register(rd), Register(rm));
8103                           break;
8104                         }
8105                         case 0x00400000: {
8106                           // 0xb2400000
8107                           unsigned rd = (instr >> 16) & 0x7;
8108                           unsigned rm = (instr >> 19) & 0x7;
8109                           // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8110                           sxtb(CurrentCond(), Best, Register(rd), Register(rm));
8111                           break;
8112                         }
8113                       }
8114                       break;
8115                     }
8116                     case 0x02800000: {
8117                       // 0xb2800000
8118                       switch (instr & 0x00400000) {
8119                         case 0x00000000: {
8120                           // 0xb2800000
8121                           unsigned rd = (instr >> 16) & 0x7;
8122                           unsigned rm = (instr >> 19) & 0x7;
8123                           // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
8124                           uxth(CurrentCond(), Best, Register(rd), Register(rm));
8125                           break;
8126                         }
8127                         case 0x00400000: {
8128                           // 0xb2c00000
8129                           unsigned rd = (instr >> 16) & 0x7;
8130                           unsigned rm = (instr >> 19) & 0x7;
8131                           // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
8132                           uxtb(CurrentCond(), Best, Register(rd), Register(rm));
8133                           break;
8134                         }
8135                       }
8136                       break;
8137                     }
8138                   }
8139                   break;
8140                 }
8141                 case 0x01000000: {
8142                   // 0xb1000000
8143                   unsigned rn = (instr >> 16) & 0x7;
8144                   int32_t imm =
8145                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8146                   Label label(imm, kT32PcDelta);
8147                   // CBZ{<q>} <Rn>, <label> ; T1
8148                   cbz(Register(rn), &label);
8149                   break;
8150                 }
8151               }
8152               break;
8153             }
8154             case 0x04000000: {
8155               // 0xb4000000
8156               switch (instr & 0x02000000) {
8157                 case 0x00000000: {
8158                   // 0xb4000000
8159                   RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
8160                                          ((instr >> 16) & 0xff));
8161                   // PUSH{<c>}{<q>} <registers> ; T1
8162                   push(CurrentCond(), Best, registers);
8163                   break;
8164                 }
8165                 case 0x02000000: {
8166                   // 0xb6000000
8167                   switch (instr & 0x01e00000) {
8168                     case 0x00400000: {
8169                       // 0xb6400000
8170                       UnimplementedT32_16("SETEND", instr);
8171                       break;
8172                     }
8173                     case 0x00600000: {
8174                       // 0xb6600000
8175                       switch (instr & 0x00100000) {
8176                         case 0x00000000: {
8177                           // 0xb6600000
8178                           UnimplementedT32_16("CPSIE", instr);
8179                           break;
8180                         }
8181                         case 0x00100000: {
8182                           // 0xb6700000
8183                           UnimplementedT32_16("CPSID", instr);
8184                           break;
8185                         }
8186                       }
8187                       break;
8188                     }
8189                     default:
8190                       UnallocatedT32(instr);
8191                       break;
8192                   }
8193                   break;
8194                 }
8195               }
8196               break;
8197             }
8198           }
8199           break;
8200         }
8201         case 0x18000000: {
8202           // 0xb8000000
8203           switch (instr & 0x04000000) {
8204             case 0x00000000: {
8205               // 0xb8000000
8206               switch (instr & 0x01000000) {
8207                 case 0x00000000: {
8208                   // 0xb8000000
8209                   switch (instr & 0x02c00000) {
8210                     case 0x02000000: {
8211                       // 0xba000000
8212                       unsigned rd = (instr >> 16) & 0x7;
8213                       unsigned rm = (instr >> 19) & 0x7;
8214                       // REV{<c>}{<q>} <Rd>, <Rm> ; T1
8215                       rev(CurrentCond(), Best, Register(rd), Register(rm));
8216                       break;
8217                     }
8218                     case 0x02400000: {
8219                       // 0xba400000
8220                       unsigned rd = (instr >> 16) & 0x7;
8221                       unsigned rm = (instr >> 19) & 0x7;
8222                       // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
8223                       rev16(CurrentCond(), Best, Register(rd), Register(rm));
8224                       break;
8225                     }
8226                     case 0x02800000: {
8227                       // 0xba800000
8228                       uint32_t imm = (instr >> 16) & 0x3f;
8229                       // HLT{<q>} {#}<imm> ; T1
8230                       hlt(Condition::None(), imm);
8231                       break;
8232                     }
8233                     case 0x02c00000: {
8234                       // 0xbac00000
8235                       unsigned rd = (instr >> 16) & 0x7;
8236                       unsigned rm = (instr >> 19) & 0x7;
8237                       // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
8238                       revsh(CurrentCond(), Best, Register(rd), Register(rm));
8239                       break;
8240                     }
8241                     default:
8242                       UnallocatedT32(instr);
8243                       break;
8244                   }
8245                   break;
8246                 }
8247                 case 0x01000000: {
8248                   // 0xb9000000
8249                   unsigned rn = (instr >> 16) & 0x7;
8250                   int32_t imm =
8251                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
8252                   Label label(imm, kT32PcDelta);
8253                   // CBNZ{<q>} <Rn>, <label> ; T1
8254                   cbnz(Register(rn), &label);
8255                   break;
8256                 }
8257               }
8258               break;
8259             }
8260             case 0x04000000: {
8261               // 0xbc000000
8262               switch (instr & 0x02000000) {
8263                 case 0x00000000: {
8264                   // 0xbc000000
8265                   RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
8266                                          ((instr >> 16) & 0xff));
8267                   // POP{<c>}{<q>} <registers> ; T1
8268                   pop(CurrentCond(), Best, registers);
8269                   break;
8270                 }
8271                 case 0x02000000: {
8272                   // 0xbe000000
8273                   switch (instr & 0x01000000) {
8274                     case 0x00000000: {
8275                       // 0xbe000000
8276                       uint32_t imm = (instr >> 16) & 0xff;
8277                       // BKPT{<q>} {#}<imm> ; T1
8278                       bkpt(Condition::None(), imm);
8279                       break;
8280                     }
8281                     case 0x01000000: {
8282                       // 0xbf000000
8283                       switch (instr & 0x000f0000) {
8284                         case 0x00000000: {
8285                           // 0xbf000000
8286                           switch (instr & 0x00f00000) {
8287                             case 0x00000000: {
8288                               // 0xbf000000
8289                               // NOP{<c>}{<q>} ; T1
8290                               nop(CurrentCond(), Best);
8291                               break;
8292                             }
8293                             case 0x00100000: {
8294                               // 0xbf100000
8295                               // YIELD{<c>}{<q>} ; T1
8296                               yield(CurrentCond(), Best);
8297                               break;
8298                             }
8299                             case 0x00200000: {
8300                               // 0xbf200000
8301                               UnimplementedT32_16("WFE", instr);
8302                               break;
8303                             }
8304                             case 0x00300000: {
8305                               // 0xbf300000
8306                               UnimplementedT32_16("WFI", instr);
8307                               break;
8308                             }
8309                             case 0x00400000: {
8310                               // 0xbf400000
8311                               UnimplementedT32_16("SEV", instr);
8312                               break;
8313                             }
8314                             case 0x00500000: {
8315                               // 0xbf500000
8316                               UnimplementedT32_16("SEVL", instr);
8317                               break;
8318                             }
8319                             default:
8320                               UnallocatedT32(instr);
8321                               break;
8322                           }
8323                           break;
8324                         }
8325                         default: {
8326                           if (((instr & 0xf0000) == 0x0)) {
8327                             UnallocatedT32(instr);
8328                             return;
8329                           }
8330                           unsigned firstcond = (instr >> 20) & 0xf;
8331                           unsigned mask = (instr >> 16) & 0xf;
8332                           bool wasInITBlock = InITBlock();
8333                           SetIT(Condition(firstcond), mask);
8334                           it(Condition(firstcond), mask);
8335                           if (wasInITBlock || (firstcond == 15) ||
8336                               ((firstcond == al) &&
8337                                (BitCount(Uint32(mask)) != 1))) {
8338                             UnpredictableT32(instr);
8339                           }
8340                           break;
8341                         }
8342                       }
8343                       break;
8344                     }
8345                   }
8346                   break;
8347                 }
8348               }
8349               break;
8350             }
8351           }
8352           break;
8353         }
8354       }
8355       break;
8356     }
8357     case 0xc0000000: {
8358       // 0xc0000000
8359       switch (instr & 0x10000000) {
8360         case 0x00000000: {
8361           // 0xc0000000
8362           switch (instr & 0x08000000) {
8363             case 0x00000000: {
8364               // 0xc0000000
8365               unsigned rn = (instr >> 24) & 0x7;
8366               RegisterList registers(((instr >> 16) & 0xff));
8367               // STM{<c>}{<q>} <Rn>!, <registers> ; T1
8368               stm(CurrentCond(),
8369                   Best,
8370                   Register(rn),
8371                   WriteBack(WRITE_BACK),
8372                   registers);
8373               break;
8374             }
8375             case 0x08000000: {
8376               // 0xc8000000
8377               unsigned rn = (instr >> 24) & 0x7;
8378               RegisterList registers(((instr >> 16) & 0xff));
8379               // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
8380               ldm(CurrentCond(),
8381                   Best,
8382                   Register(rn),
8383                   WriteBack(!registers.Includes(Register(rn))),
8384                   registers);
8385               break;
8386             }
8387           }
8388           break;
8389         }
8390         case 0x10000000: {
8391           // 0xd0000000
8392           switch (instr & 0x0e000000) {
8393             case 0x0e000000: {
8394               // 0xde000000
8395               switch (instr & 0x01000000) {
8396                 case 0x00000000: {
8397                   // 0xde000000
8398                   uint32_t imm = (instr >> 16) & 0xff;
8399                   // UDF{<c>}{<q>} {#}<imm> ; T1
8400                   udf(CurrentCond(), Best, imm);
8401                   break;
8402                 }
8403                 case 0x01000000: {
8404                   // 0xdf000000
8405                   uint32_t imm = (instr >> 16) & 0xff;
8406                   // SVC{<c>}{<q>} {#}<imm> ; T1
8407                   svc(CurrentCond(), imm);
8408                   break;
8409                 }
8410               }
8411               break;
8412             }
8413             default: {
8414               if (((instr & 0xe000000) == 0xe000000)) {
8415                 UnallocatedT32(instr);
8416                 return;
8417               }
8418               Condition condition((instr >> 24) & 0xf);
8419               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0xff, 8) << 1;
8420               Label label(imm, kT32PcDelta);
8421               // B<c>{<q>} <label> ; T1
8422               b(condition, Best, &label);
8423               break;
8424             }
8425           }
8426           break;
8427         }
8428       }
8429       break;
8430     }
8431     case 0xe0000000: {
8432       // 0xe0000000
8433       switch (instr & 0x08000000) {
8434         case 0x00000000: {
8435           // 0xe0000000
8436           switch (instr & 0x10000000) {
8437             case 0x00000000: {
8438               // 0xe0000000
8439               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0x7ff, 11) << 1;
8440               Label label(imm, kT32PcDelta);
8441               // B{<c>}{<q>} <label> ; T2
8442               b(CurrentCond(), Best, &label);
8443               break;
8444             }
8445             case 0x10000000: {
8446               // 0xf0000000
8447               switch (instr & 0x00008000) {
8448                 case 0x00000000: {
8449                   // 0xf0000000
8450                   switch (instr & 0x03f00000) {
8451                     case 0x00000000: {
8452                       // 0xf0000000
8453                       unsigned rd = (instr >> 8) & 0xf;
8454                       unsigned rn = (instr >> 16) & 0xf;
8455                       uint32_t imm = ImmediateT32::Decode(
8456                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8457                           ((instr >> 15) & 0x800));
8458                       // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8459                       and_(CurrentCond(),
8460                            Best,
8461                            Register(rd),
8462                            Register(rn),
8463                            imm);
8464                       break;
8465                     }
8466                     case 0x00100000: {
8467                       // 0xf0100000
8468                       switch (instr & 0x00000f00) {
8469                         case 0x00000f00: {
8470                           // 0xf0100f00
8471                           unsigned rn = (instr >> 16) & 0xf;
8472                           uint32_t imm = ImmediateT32::Decode(
8473                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8474                               ((instr >> 15) & 0x800));
8475                           // TST{<c>}{<q>} <Rn>, #<const> ; T1
8476                           tst(CurrentCond(), Best, Register(rn), imm);
8477                           break;
8478                         }
8479                         default: {
8480                           if (((instr & 0xf00) == 0xf00)) {
8481                             UnallocatedT32(instr);
8482                             return;
8483                           }
8484                           unsigned rd = (instr >> 8) & 0xf;
8485                           unsigned rn = (instr >> 16) & 0xf;
8486                           uint32_t imm = ImmediateT32::Decode(
8487                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8488                               ((instr >> 15) & 0x800));
8489                           // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8490                           ands(CurrentCond(),
8491                                Best,
8492                                Register(rd),
8493                                Register(rn),
8494                                imm);
8495                           break;
8496                         }
8497                       }
8498                       break;
8499                     }
8500                     case 0x00200000: {
8501                       // 0xf0200000
8502                       unsigned rd = (instr >> 8) & 0xf;
8503                       unsigned rn = (instr >> 16) & 0xf;
8504                       uint32_t imm = ImmediateT32::Decode(
8505                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8506                           ((instr >> 15) & 0x800));
8507                       // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8508                       bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
8509                       break;
8510                     }
8511                     case 0x00300000: {
8512                       // 0xf0300000
8513                       unsigned rd = (instr >> 8) & 0xf;
8514                       unsigned rn = (instr >> 16) & 0xf;
8515                       uint32_t imm = ImmediateT32::Decode(
8516                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8517                           ((instr >> 15) & 0x800));
8518                       // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8519                       bics(CurrentCond(),
8520                            Best,
8521                            Register(rd),
8522                            Register(rn),
8523                            imm);
8524                       break;
8525                     }
8526                     case 0x00400000: {
8527                       // 0xf0400000
8528                       switch (instr & 0x000f0000) {
8529                         case 0x000f0000: {
8530                           // 0xf04f0000
8531                           unsigned rd = (instr >> 8) & 0xf;
8532                           uint32_t imm = ImmediateT32::Decode(
8533                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8534                               ((instr >> 15) & 0x800));
8535                           if (InITBlock() &&
8536                               (instr & 0x00100000) == 0x00000000 &&
8537                               ((rd < kNumberOfT32LowRegisters) &&
8538                                (imm <= 255))) {
8539                             // MOV<c>.W <Rd>, #<const> ; T2
8540                             mov(CurrentCond(), Wide, Register(rd), imm);
8541                           } else {
8542                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
8543                             // MOV{<c>}{<q>} <Rd>, #<const> ; T2
8544                             mov(CurrentCond(), Best, Register(rd), imm);
8545                           }
8546                           break;
8547                         }
8548                         default: {
8549                           if (((instr & 0xf0000) == 0xf0000)) {
8550                             UnallocatedT32(instr);
8551                             return;
8552                           }
8553                           unsigned rd = (instr >> 8) & 0xf;
8554                           unsigned rn = (instr >> 16) & 0xf;
8555                           uint32_t imm = ImmediateT32::Decode(
8556                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8557                               ((instr >> 15) & 0x800));
8558                           // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8559                           orr(CurrentCond(),
8560                               Best,
8561                               Register(rd),
8562                               Register(rn),
8563                               imm);
8564                           break;
8565                         }
8566                       }
8567                       break;
8568                     }
8569                     case 0x00500000: {
8570                       // 0xf0500000
8571                       switch (instr & 0x000f0000) {
8572                         case 0x000f0000: {
8573                           // 0xf05f0000
8574                           unsigned rd = (instr >> 8) & 0xf;
8575                           uint32_t imm = ImmediateT32::Decode(
8576                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8577                               ((instr >> 15) & 0x800));
8578                           if (OutsideITBlock() &&
8579                               (instr & 0x00100000) == 0x00100000 &&
8580                               ((rd < kNumberOfT32LowRegisters) &&
8581                                (imm <= 255))) {
8582                             // MOVS.W <Rd>, #<const> ; T2
8583                             movs(Condition::None(), Wide, Register(rd), imm);
8584                           } else {
8585                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
8586                             // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
8587                             movs(CurrentCond(), Best, Register(rd), imm);
8588                           }
8589                           break;
8590                         }
8591                         default: {
8592                           if (((instr & 0xf0000) == 0xf0000)) {
8593                             UnallocatedT32(instr);
8594                             return;
8595                           }
8596                           unsigned rd = (instr >> 8) & 0xf;
8597                           unsigned rn = (instr >> 16) & 0xf;
8598                           uint32_t imm = ImmediateT32::Decode(
8599                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8600                               ((instr >> 15) & 0x800));
8601                           // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8602                           orrs(CurrentCond(),
8603                                Best,
8604                                Register(rd),
8605                                Register(rn),
8606                                imm);
8607                           break;
8608                         }
8609                       }
8610                       break;
8611                     }
8612                     case 0x00600000: {
8613                       // 0xf0600000
8614                       switch (instr & 0x000f0000) {
8615                         case 0x000f0000: {
8616                           // 0xf06f0000
8617                           unsigned rd = (instr >> 8) & 0xf;
8618                           uint32_t imm = ImmediateT32::Decode(
8619                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8620                               ((instr >> 15) & 0x800));
8621                           // MVN{<c>}{<q>} <Rd>, #<const> ; T1
8622                           mvn(CurrentCond(), Best, Register(rd), imm);
8623                           break;
8624                         }
8625                         default: {
8626                           if (((instr & 0xf0000) == 0xf0000)) {
8627                             UnallocatedT32(instr);
8628                             return;
8629                           }
8630                           unsigned rd = (instr >> 8) & 0xf;
8631                           unsigned rn = (instr >> 16) & 0xf;
8632                           uint32_t imm = ImmediateT32::Decode(
8633                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8634                               ((instr >> 15) & 0x800));
8635                           // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8636                           orn(CurrentCond(), Register(rd), Register(rn), imm);
8637                           break;
8638                         }
8639                       }
8640                       break;
8641                     }
8642                     case 0x00700000: {
8643                       // 0xf0700000
8644                       switch (instr & 0x000f0000) {
8645                         case 0x000f0000: {
8646                           // 0xf07f0000
8647                           unsigned rd = (instr >> 8) & 0xf;
8648                           uint32_t imm = ImmediateT32::Decode(
8649                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8650                               ((instr >> 15) & 0x800));
8651                           // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
8652                           mvns(CurrentCond(), Best, Register(rd), imm);
8653                           break;
8654                         }
8655                         default: {
8656                           if (((instr & 0xf0000) == 0xf0000)) {
8657                             UnallocatedT32(instr);
8658                             return;
8659                           }
8660                           unsigned rd = (instr >> 8) & 0xf;
8661                           unsigned rn = (instr >> 16) & 0xf;
8662                           uint32_t imm = ImmediateT32::Decode(
8663                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8664                               ((instr >> 15) & 0x800));
8665                           // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8666                           orns(CurrentCond(), Register(rd), Register(rn), imm);
8667                           break;
8668                         }
8669                       }
8670                       break;
8671                     }
8672                     case 0x00800000: {
8673                       // 0xf0800000
8674                       unsigned rd = (instr >> 8) & 0xf;
8675                       unsigned rn = (instr >> 16) & 0xf;
8676                       uint32_t imm = ImmediateT32::Decode(
8677                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8678                           ((instr >> 15) & 0x800));
8679                       // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8680                       eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
8681                       break;
8682                     }
8683                     case 0x00900000: {
8684                       // 0xf0900000
8685                       switch (instr & 0x00000f00) {
8686                         case 0x00000f00: {
8687                           // 0xf0900f00
8688                           unsigned rn = (instr >> 16) & 0xf;
8689                           uint32_t imm = ImmediateT32::Decode(
8690                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8691                               ((instr >> 15) & 0x800));
8692                           // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
8693                           teq(CurrentCond(), Register(rn), imm);
8694                           break;
8695                         }
8696                         default: {
8697                           if (((instr & 0xf00) == 0xf00)) {
8698                             UnallocatedT32(instr);
8699                             return;
8700                           }
8701                           unsigned rd = (instr >> 8) & 0xf;
8702                           unsigned rn = (instr >> 16) & 0xf;
8703                           uint32_t imm = ImmediateT32::Decode(
8704                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8705                               ((instr >> 15) & 0x800));
8706                           // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8707                           eors(CurrentCond(),
8708                                Best,
8709                                Register(rd),
8710                                Register(rn),
8711                                imm);
8712                           break;
8713                         }
8714                       }
8715                       break;
8716                     }
8717                     case 0x01000000: {
8718                       // 0xf1000000
8719                       switch (instr & 0x000f0000) {
8720                         case 0x000d0000: {
8721                           // 0xf10d0000
8722                           unsigned rd = (instr >> 8) & 0xf;
8723                           uint32_t imm = ImmediateT32::Decode(
8724                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8725                               ((instr >> 15) & 0x800));
8726                           if ((instr & 0x00100000) == 0x00000000 &&
8727                               (((rd < kNumberOfT32LowRegisters) &&
8728                                 ((imm <= 1020) && ((imm & 3) == 0))) ||
8729                                ((rd == sp.GetCode()) &&
8730                                 ((imm <= 508) && ((imm & 3) == 0))))) {
8731                             // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
8732                             add(CurrentCond(), Wide, Register(rd), sp, imm);
8733                           } else {
8734                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
8735                             // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8736                             add(CurrentCond(), Best, Register(rd), sp, imm);
8737                           }
8738                           break;
8739                         }
8740                         default: {
8741                           if (((instr & 0xf0000) == 0xd0000)) {
8742                             UnallocatedT32(instr);
8743                             return;
8744                           }
8745                           unsigned rd = (instr >> 8) & 0xf;
8746                           unsigned rn = (instr >> 16) & 0xf;
8747                           uint32_t imm = ImmediateT32::Decode(
8748                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8749                               ((instr >> 15) & 0x800));
8750                           if (InITBlock() &&
8751                               (instr & 0x00100000) == 0x00000000 &&
8752                               (((rd < kNumberOfT32LowRegisters) &&
8753                                 (rn < kNumberOfT32LowRegisters) &&
8754                                 (imm <= 7)) ||
8755                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8756                                 (imm <= 255)))) {
8757                             // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
8758                             add(CurrentCond(),
8759                                 Wide,
8760                                 Register(rd),
8761                                 Register(rn),
8762                                 imm);
8763                           } else {
8764                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
8765                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8766                             add(CurrentCond(),
8767                                 Best,
8768                                 Register(rd),
8769                                 Register(rn),
8770                                 imm);
8771                           }
8772                           break;
8773                         }
8774                       }
8775                       break;
8776                     }
8777                     case 0x01100000: {
8778                       // 0xf1100000
8779                       switch (instr & 0x00000f00) {
8780                         case 0x00000f00: {
8781                           // 0xf1100f00
8782                           unsigned rn = (instr >> 16) & 0xf;
8783                           uint32_t imm = ImmediateT32::Decode(
8784                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8785                               ((instr >> 15) & 0x800));
8786                           // CMN{<c>}{<q>} <Rn>, #<const> ; T1
8787                           cmn(CurrentCond(), Best, Register(rn), imm);
8788                           break;
8789                         }
8790                         default: {
8791                           switch (instr & 0x000f0000) {
8792                             case 0x000d0000: {
8793                               // 0xf11d0000
8794                               if (((instr & 0xf00) == 0xf00)) {
8795                                 UnallocatedT32(instr);
8796                                 return;
8797                               }
8798                               unsigned rd = (instr >> 8) & 0xf;
8799                               uint32_t imm = ImmediateT32::Decode(
8800                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8801                                   ((instr >> 15) & 0x800));
8802                               // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
8803                               adds(CurrentCond(), Best, Register(rd), sp, imm);
8804                               break;
8805                             }
8806                             default: {
8807                               if (((instr & 0xf0000) == 0xd0000) ||
8808                                   ((instr & 0xf00) == 0xf00)) {
8809                                 UnallocatedT32(instr);
8810                                 return;
8811                               }
8812                               unsigned rd = (instr >> 8) & 0xf;
8813                               unsigned rn = (instr >> 16) & 0xf;
8814                               uint32_t imm = ImmediateT32::Decode(
8815                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8816                                   ((instr >> 15) & 0x800));
8817                               if (OutsideITBlock() &&
8818                                   (instr & 0x00100000) == 0x00100000 &&
8819                                   (((rd < kNumberOfT32LowRegisters) &&
8820                                     (rn < kNumberOfT32LowRegisters) &&
8821                                     (imm <= 7)) ||
8822                                    ((rd == rn) &&
8823                                     (rd < kNumberOfT32LowRegisters) &&
8824                                     (imm <= 255)))) {
8825                                 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
8826                                 adds(Condition::None(),
8827                                      Wide,
8828                                      Register(rd),
8829                                      Register(rn),
8830                                      imm);
8831                               } else {
8832                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
8833                                 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8834                                 adds(CurrentCond(),
8835                                      Best,
8836                                      Register(rd),
8837                                      Register(rn),
8838                                      imm);
8839                               }
8840                               break;
8841                             }
8842                           }
8843                           break;
8844                         }
8845                       }
8846                       break;
8847                     }
8848                     case 0x01400000: {
8849                       // 0xf1400000
8850                       unsigned rd = (instr >> 8) & 0xf;
8851                       unsigned rn = (instr >> 16) & 0xf;
8852                       uint32_t imm = ImmediateT32::Decode(
8853                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8854                           ((instr >> 15) & 0x800));
8855                       // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8856                       adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8857                       break;
8858                     }
8859                     case 0x01500000: {
8860                       // 0xf1500000
8861                       unsigned rd = (instr >> 8) & 0xf;
8862                       unsigned rn = (instr >> 16) & 0xf;
8863                       uint32_t imm = ImmediateT32::Decode(
8864                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8865                           ((instr >> 15) & 0x800));
8866                       // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8867                       adcs(CurrentCond(),
8868                            Best,
8869                            Register(rd),
8870                            Register(rn),
8871                            imm);
8872                       break;
8873                     }
8874                     case 0x01600000: {
8875                       // 0xf1600000
8876                       unsigned rd = (instr >> 8) & 0xf;
8877                       unsigned rn = (instr >> 16) & 0xf;
8878                       uint32_t imm = ImmediateT32::Decode(
8879                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8880                           ((instr >> 15) & 0x800));
8881                       // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8882                       sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
8883                       break;
8884                     }
8885                     case 0x01700000: {
8886                       // 0xf1700000
8887                       unsigned rd = (instr >> 8) & 0xf;
8888                       unsigned rn = (instr >> 16) & 0xf;
8889                       uint32_t imm = ImmediateT32::Decode(
8890                           (instr & 0xff) | ((instr >> 4) & 0x700) |
8891                           ((instr >> 15) & 0x800));
8892                       // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
8893                       sbcs(CurrentCond(),
8894                            Best,
8895                            Register(rd),
8896                            Register(rn),
8897                            imm);
8898                       break;
8899                     }
8900                     case 0x01a00000: {
8901                       // 0xf1a00000
8902                       switch (instr & 0x000f0000) {
8903                         case 0x000d0000: {
8904                           // 0xf1ad0000
8905                           unsigned rd = (instr >> 8) & 0xf;
8906                           uint32_t imm = ImmediateT32::Decode(
8907                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8908                               ((instr >> 15) & 0x800));
8909                           if ((instr & 0x00100000) == 0x00000000 &&
8910                               ((rd == sp.GetCode()) &&
8911                                ((imm <= 508) && ((imm & 3) == 0)))) {
8912                             // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
8913                             sub(CurrentCond(), Wide, Register(rd), sp, imm);
8914                           } else {
8915                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
8916                             // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8917                             sub(CurrentCond(), Best, Register(rd), sp, imm);
8918                           }
8919                           break;
8920                         }
8921                         default: {
8922                           if (((instr & 0xf0000) == 0xd0000)) {
8923                             UnallocatedT32(instr);
8924                             return;
8925                           }
8926                           unsigned rd = (instr >> 8) & 0xf;
8927                           unsigned rn = (instr >> 16) & 0xf;
8928                           uint32_t imm = ImmediateT32::Decode(
8929                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8930                               ((instr >> 15) & 0x800));
8931                           if (InITBlock() &&
8932                               (instr & 0x00100000) == 0x00000000 &&
8933                               (((rd < kNumberOfT32LowRegisters) &&
8934                                 (rn < kNumberOfT32LowRegisters) &&
8935                                 (imm <= 7)) ||
8936                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
8937                                 (imm <= 255)))) {
8938                             // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
8939                             sub(CurrentCond(),
8940                                 Wide,
8941                                 Register(rd),
8942                                 Register(rn),
8943                                 imm);
8944                           } else {
8945                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
8946                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
8947                             sub(CurrentCond(),
8948                                 Best,
8949                                 Register(rd),
8950                                 Register(rn),
8951                                 imm);
8952                           }
8953                           break;
8954                         }
8955                       }
8956                       break;
8957                     }
8958                     case 0x01b00000: {
8959                       // 0xf1b00000
8960                       switch (instr & 0x00000f00) {
8961                         case 0x00000f00: {
8962                           // 0xf1b00f00
8963                           unsigned rn = (instr >> 16) & 0xf;
8964                           uint32_t imm = ImmediateT32::Decode(
8965                               (instr & 0xff) | ((instr >> 4) & 0x700) |
8966                               ((instr >> 15) & 0x800));
8967                           if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
8968                             // CMP{<c>}.W <Rn>, #<const> ; T2
8969                             cmp(CurrentCond(), Wide, Register(rn), imm);
8970                           } else {
8971                             // CMP{<c>}{<q>} <Rn>, #<const> ; T2
8972                             cmp(CurrentCond(), Best, Register(rn), imm);
8973                           }
8974                           break;
8975                         }
8976                         default: {
8977                           switch (instr & 0x000f0000) {
8978                             case 0x000d0000: {
8979                               // 0xf1bd0000
8980                               if (((instr & 0xf00) == 0xf00)) {
8981                                 UnallocatedT32(instr);
8982                                 return;
8983                               }
8984                               unsigned rd = (instr >> 8) & 0xf;
8985                               uint32_t imm = ImmediateT32::Decode(
8986                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
8987                                   ((instr >> 15) & 0x800));
8988                               // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
8989                               subs(CurrentCond(), Best, Register(rd), sp, imm);
8990                               break;
8991                             }
8992                             default: {
8993                               if (((instr & 0xf0000) == 0xd0000) ||
8994                                   ((instr & 0xf00) == 0xf00)) {
8995                                 UnallocatedT32(instr);
8996                                 return;
8997                               }
8998                               unsigned rd = (instr >> 8) & 0xf;
8999                               unsigned rn = (instr >> 16) & 0xf;
9000                               uint32_t imm = ImmediateT32::Decode(
9001                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
9002                                   ((instr >> 15) & 0x800));
9003                               if (OutsideITBlock() &&
9004                                   (instr & 0x00100000) == 0x00100000 &&
9005                                   (((rd < kNumberOfT32LowRegisters) &&
9006                                     (rn < kNumberOfT32LowRegisters) &&
9007                                     (imm <= 7)) ||
9008                                    ((rd == rn) &&
9009                                     (rd < kNumberOfT32LowRegisters) &&
9010                                     (imm <= 255)))) {
9011                                 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
9012                                 subs(Condition::None(),
9013                                      Wide,
9014                                      Register(rd),
9015                                      Register(rn),
9016                                      imm);
9017                               } else {
9018                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
9019                                 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
9020                                 subs(CurrentCond(),
9021                                      Best,
9022                                      Register(rd),
9023                                      Register(rn),
9024                                      imm);
9025                               }
9026                               break;
9027                             }
9028                           }
9029                           break;
9030                         }
9031                       }
9032                       break;
9033                     }
9034                     case 0x01c00000: {
9035                       // 0xf1c00000
9036                       unsigned rd = (instr >> 8) & 0xf;
9037                       unsigned rn = (instr >> 16) & 0xf;
9038                       uint32_t imm = ImmediateT32::Decode(
9039                           (instr & 0xff) | ((instr >> 4) & 0x700) |
9040                           ((instr >> 15) & 0x800));
9041                       if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
9042                           (imm == 0) &&
9043                           ((rd < kNumberOfT32LowRegisters) &&
9044                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9045                         // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
9046                         rsb(CurrentCond(),
9047                             Wide,
9048                             Register(rd),
9049                             Register(rn),
9050                             UINT32_C(0));
9051                       } else {
9052                         VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
9053                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9054                         rsb(CurrentCond(),
9055                             Best,
9056                             Register(rd),
9057                             Register(rn),
9058                             imm);
9059                       }
9060                       break;
9061                     }
9062                     case 0x01d00000: {
9063                       // 0xf1d00000
9064                       unsigned rd = (instr >> 8) & 0xf;
9065                       unsigned rn = (instr >> 16) & 0xf;
9066                       uint32_t imm = ImmediateT32::Decode(
9067                           (instr & 0xff) | ((instr >> 4) & 0x700) |
9068                           ((instr >> 15) & 0x800));
9069                       if (OutsideITBlock() &&
9070                           (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
9071                           ((rd < kNumberOfT32LowRegisters) &&
9072                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
9073                         // RSBS.W {<Rd>}, <Rn>, #0 ; T2
9074                         rsbs(Condition::None(),
9075                              Wide,
9076                              Register(rd),
9077                              Register(rn),
9078                              UINT32_C(0));
9079                       } else {
9080                         VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
9081                         // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
9082                         rsbs(CurrentCond(),
9083                              Best,
9084                              Register(rd),
9085                              Register(rn),
9086                              imm);
9087                       }
9088                       break;
9089                     }
9090                     case 0x02000000: {
9091                       // 0xf2000000
9092                       switch (instr & 0x000d0000) {
9093                         case 0x000d0000: {
9094                           // 0xf20d0000
9095                           switch (instr & 0x00020000) {
9096                             case 0x00000000: {
9097                               // 0xf20d0000
9098                               unsigned rd = (instr >> 8) & 0xf;
9099                               uint32_t imm = (instr & 0xff) |
9100                                              ((instr >> 4) & 0x700) |
9101                                              ((instr >> 15) & 0x800);
9102                               if (((rd >= kNumberOfT32LowRegisters) ||
9103                                    ((imm > 1020) || ((imm & 3) != 0))) &&
9104                                   ((rd != sp.GetCode()) ||
9105                                    ((imm > 508) || ((imm & 3) != 0))) &&
9106                                   (!ImmediateT32::IsImmediateT32(imm))) {
9107                                 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9108                                 add(CurrentCond(), Best, Register(rd), sp, imm);
9109                               } else {
9110                                 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
9111                                 addw(CurrentCond(), Register(rd), sp, imm);
9112                               }
9113                               break;
9114                             }
9115                             case 0x00020000: {
9116                               // 0xf20f0000
9117                               unsigned rd = (instr >> 8) & 0xf;
9118                               int32_t imm = (instr & 0xff) |
9119                                             ((instr >> 4) & 0x700) |
9120                                             ((instr >> 15) & 0x800);
9121                               Label label(imm, kT32PcDelta);
9122                               if ((imm >= 0) && (imm <= 4095) &&
9123                                   ((rd < kNumberOfT32LowRegisters) &&
9124                                    (imm >= 0) && (imm <= 1020) &&
9125                                    ((imm & 3) == 0))) {
9126                                 // ADR{<c>}.W <Rd>, <label> ; T3
9127                                 adr(CurrentCond(), Wide, Register(rd), &label);
9128                               } else {
9129                                 // ADR{<c>}{<q>} <Rd>, <label> ; T3
9130                                 adr(CurrentCond(), Best, Register(rd), &label);
9131                               }
9132                               break;
9133                             }
9134                           }
9135                           break;
9136                         }
9137                         default: {
9138                           if (((instr & 0xd0000) == 0xd0000)) {
9139                             UnallocatedT32(instr);
9140                             return;
9141                           }
9142                           unsigned rd = (instr >> 8) & 0xf;
9143                           unsigned rn = (instr >> 16) & 0xf;
9144                           uint32_t imm = (instr & 0xff) |
9145                                          ((instr >> 4) & 0x700) |
9146                                          ((instr >> 15) & 0x800);
9147                           if ((InITBlock() ||
9148                                (rd >= kNumberOfT32LowRegisters) ||
9149                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9150                               (InITBlock() || (rd != rn) ||
9151                                (rd >= kNumberOfT32LowRegisters) ||
9152                                (imm > 255)) &&
9153                               (!ImmediateT32::IsImmediateT32(imm))) {
9154                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9155                             add(CurrentCond(),
9156                                 Best,
9157                                 Register(rd),
9158                                 Register(rn),
9159                                 imm);
9160                           } else {
9161                             // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9162                             addw(CurrentCond(),
9163                                  Register(rd),
9164                                  Register(rn),
9165                                  imm);
9166                           }
9167                           break;
9168                         }
9169                       }
9170                       break;
9171                     }
9172                     case 0x02400000: {
9173                       // 0xf2400000
9174                       unsigned rd = (instr >> 8) & 0xf;
9175                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9176                                      ((instr >> 15) & 0x800) |
9177                                      ((instr >> 4) & 0xf000);
9178                       if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
9179                            (imm > 255)) &&
9180                           (!ImmediateT32::IsImmediateT32(imm))) {
9181                         // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
9182                         mov(CurrentCond(), Best, Register(rd), imm);
9183                       } else {
9184                         // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
9185                         movw(CurrentCond(), Register(rd), imm);
9186                       }
9187                       break;
9188                     }
9189                     case 0x02a00000: {
9190                       // 0xf2a00000
9191                       switch (instr & 0x000d0000) {
9192                         case 0x000d0000: {
9193                           // 0xf2ad0000
9194                           switch (instr & 0x00020000) {
9195                             case 0x00000000: {
9196                               // 0xf2ad0000
9197                               unsigned rd = (instr >> 8) & 0xf;
9198                               uint32_t imm = (instr & 0xff) |
9199                                              ((instr >> 4) & 0x700) |
9200                                              ((instr >> 15) & 0x800);
9201                               if (((rd != sp.GetCode()) ||
9202                                    ((imm > 508) || ((imm & 3) != 0))) &&
9203                                   (!ImmediateT32::IsImmediateT32(imm))) {
9204                                 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9205                                 sub(CurrentCond(), Best, Register(rd), sp, imm);
9206                               } else {
9207                                 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
9208                                 subw(CurrentCond(), Register(rd), sp, imm);
9209                               }
9210                               break;
9211                             }
9212                             case 0x00020000: {
9213                               // 0xf2af0000
9214                               if (((((Uint32((instr >> 26)) & Uint32(0x1))
9215                                      << 11) |
9216                                     ((Uint32((instr >> 12)) & Uint32(0x7))
9217                                      << 8) |
9218                                     (Uint32(instr) & Uint32(0xff))) ==
9219                                    Uint32(0x0))) {
9220                                 unsigned rd = (instr >> 8) & 0xf;
9221                                 uint32_t imm = (instr & 0xff) |
9222                                                ((instr >> 4) & 0x700) |
9223                                                ((instr >> 15) & 0x800);
9224                                 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
9225                                 sub(CurrentCond(), Best, Register(rd), pc, imm);
9226                                 return;
9227                               }
9228                               unsigned rd = (instr >> 8) & 0xf;
9229                               int32_t imm = (instr & 0xff) |
9230                                             ((instr >> 4) & 0x700) |
9231                                             ((instr >> 15) & 0x800);
9232                               Label label(-imm, kT32PcDelta);
9233                               // ADR{<c>}{<q>} <Rd>, <label> ; T2
9234                               adr(CurrentCond(), Best, Register(rd), &label);
9235                               break;
9236                             }
9237                           }
9238                           break;
9239                         }
9240                         default: {
9241                           if (((instr & 0xd0000) == 0xd0000)) {
9242                             UnallocatedT32(instr);
9243                             return;
9244                           }
9245                           unsigned rd = (instr >> 8) & 0xf;
9246                           unsigned rn = (instr >> 16) & 0xf;
9247                           uint32_t imm = (instr & 0xff) |
9248                                          ((instr >> 4) & 0x700) |
9249                                          ((instr >> 15) & 0x800);
9250                           if ((InITBlock() ||
9251                                (rd >= kNumberOfT32LowRegisters) ||
9252                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
9253                               (InITBlock() || (rd != rn) ||
9254                                (rd >= kNumberOfT32LowRegisters) ||
9255                                (imm > 255)) &&
9256                               (!ImmediateT32::IsImmediateT32(imm))) {
9257                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9258                             sub(CurrentCond(),
9259                                 Best,
9260                                 Register(rd),
9261                                 Register(rn),
9262                                 imm);
9263                           } else {
9264                             // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
9265                             subw(CurrentCond(),
9266                                  Register(rd),
9267                                  Register(rn),
9268                                  imm);
9269                           }
9270                           break;
9271                         }
9272                       }
9273                       break;
9274                     }
9275                     case 0x02c00000: {
9276                       // 0xf2c00000
9277                       unsigned rd = (instr >> 8) & 0xf;
9278                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
9279                                      ((instr >> 15) & 0x800) |
9280                                      ((instr >> 4) & 0xf000);
9281                       // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
9282                       movt(CurrentCond(), Register(rd), imm);
9283                       break;
9284                     }
9285                     case 0x03000000: {
9286                       // 0xf3000000
9287                       unsigned rd = (instr >> 8) & 0xf;
9288                       uint32_t imm = (instr & 0x1f) + 1;
9289                       unsigned rn = (instr >> 16) & 0xf;
9290                       uint32_t amount =
9291                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9292                       // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9293                       ssat(CurrentCond(),
9294                            Register(rd),
9295                            imm,
9296                            Operand(Register(rn), LSL, amount));
9297                       if (((instr & 0xfff08020) != 0xf3000000)) {
9298                         UnpredictableT32(instr);
9299                       }
9300                       break;
9301                     }
9302                     case 0x03200000: {
9303                       // 0xf3200000
9304                       switch (instr & 0x000070c0) {
9305                         case 0x00000000: {
9306                           // 0xf3200000
9307                           unsigned rd = (instr >> 8) & 0xf;
9308                           uint32_t imm = (instr & 0xf) + 1;
9309                           unsigned rn = (instr >> 16) & 0xf;
9310                           // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9311                           ssat16(CurrentCond(),
9312                                  Register(rd),
9313                                  imm,
9314                                  Register(rn));
9315                           if (((instr & 0xfff0f0f0) != 0xf3200000)) {
9316                             UnpredictableT32(instr);
9317                           }
9318                           break;
9319                         }
9320                         default: {
9321                           if (((instr & 0x70c0) == 0x0)) {
9322                             UnallocatedT32(instr);
9323                             return;
9324                           }
9325                           unsigned rd = (instr >> 8) & 0xf;
9326                           uint32_t imm = (instr & 0x1f) + 1;
9327                           unsigned rn = (instr >> 16) & 0xf;
9328                           uint32_t amount =
9329                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9330                           // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9331                           ssat(CurrentCond(),
9332                                Register(rd),
9333                                imm,
9334                                Operand(Register(rn), ASR, amount));
9335                           if (((instr & 0xfff08020) != 0xf3200000)) {
9336                             UnpredictableT32(instr);
9337                           }
9338                           break;
9339                         }
9340                       }
9341                       break;
9342                     }
9343                     case 0x03400000: {
9344                       // 0xf3400000
9345                       unsigned rd = (instr >> 8) & 0xf;
9346                       unsigned rn = (instr >> 16) & 0xf;
9347                       uint32_t lsb =
9348                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9349                       uint32_t widthm1 = instr & 0x1f;
9350                       uint32_t width = widthm1 + 1;
9351                       // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9352                       sbfx(CurrentCond(),
9353                            Register(rd),
9354                            Register(rn),
9355                            lsb,
9356                            width);
9357                       if (((instr & 0xfff08020) != 0xf3400000)) {
9358                         UnpredictableT32(instr);
9359                       }
9360                       break;
9361                     }
9362                     case 0x03600000: {
9363                       // 0xf3600000
9364                       switch (instr & 0x000f0000) {
9365                         case 0x000f0000: {
9366                           // 0xf36f0000
9367                           unsigned rd = (instr >> 8) & 0xf;
9368                           uint32_t lsb =
9369                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9370                           uint32_t msb = instr & 0x1f;
9371                           uint32_t width = msb - lsb + 1;
9372                           // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
9373                           bfc(CurrentCond(), Register(rd), lsb, width);
9374                           if (((instr & 0xffff8020) != 0xf36f0000)) {
9375                             UnpredictableT32(instr);
9376                           }
9377                           break;
9378                         }
9379                         default: {
9380                           if (((instr & 0xf0000) == 0xf0000)) {
9381                             UnallocatedT32(instr);
9382                             return;
9383                           }
9384                           unsigned rd = (instr >> 8) & 0xf;
9385                           unsigned rn = (instr >> 16) & 0xf;
9386                           uint32_t lsb =
9387                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9388                           uint32_t msb = instr & 0x1f;
9389                           uint32_t width = msb - lsb + 1;
9390                           // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9391                           bfi(CurrentCond(),
9392                               Register(rd),
9393                               Register(rn),
9394                               lsb,
9395                               width);
9396                           if (((instr & 0xfff08020) != 0xf3600000)) {
9397                             UnpredictableT32(instr);
9398                           }
9399                           break;
9400                         }
9401                       }
9402                       break;
9403                     }
9404                     case 0x03800000: {
9405                       // 0xf3800000
9406                       unsigned rd = (instr >> 8) & 0xf;
9407                       uint32_t imm = instr & 0x1f;
9408                       unsigned rn = (instr >> 16) & 0xf;
9409                       uint32_t amount =
9410                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9411                       // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
9412                       usat(CurrentCond(),
9413                            Register(rd),
9414                            imm,
9415                            Operand(Register(rn), LSL, amount));
9416                       if (((instr & 0xfff08020) != 0xf3800000)) {
9417                         UnpredictableT32(instr);
9418                       }
9419                       break;
9420                     }
9421                     case 0x03a00000: {
9422                       // 0xf3a00000
9423                       switch (instr & 0x000070c0) {
9424                         case 0x00000000: {
9425                           // 0xf3a00000
9426                           unsigned rd = (instr >> 8) & 0xf;
9427                           uint32_t imm = instr & 0xf;
9428                           unsigned rn = (instr >> 16) & 0xf;
9429                           // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
9430                           usat16(CurrentCond(),
9431                                  Register(rd),
9432                                  imm,
9433                                  Register(rn));
9434                           if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
9435                             UnpredictableT32(instr);
9436                           }
9437                           break;
9438                         }
9439                         default: {
9440                           if (((instr & 0x70c0) == 0x0)) {
9441                             UnallocatedT32(instr);
9442                             return;
9443                           }
9444                           unsigned rd = (instr >> 8) & 0xf;
9445                           uint32_t imm = instr & 0x1f;
9446                           unsigned rn = (instr >> 16) & 0xf;
9447                           uint32_t amount =
9448                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9449                           // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
9450                           usat(CurrentCond(),
9451                                Register(rd),
9452                                imm,
9453                                Operand(Register(rn), ASR, amount));
9454                           if (((instr & 0xfff08020) != 0xf3a00000)) {
9455                             UnpredictableT32(instr);
9456                           }
9457                           break;
9458                         }
9459                       }
9460                       break;
9461                     }
9462                     case 0x03c00000: {
9463                       // 0xf3c00000
9464                       unsigned rd = (instr >> 8) & 0xf;
9465                       unsigned rn = (instr >> 16) & 0xf;
9466                       uint32_t lsb =
9467                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
9468                       uint32_t widthm1 = instr & 0x1f;
9469                       uint32_t width = widthm1 + 1;
9470                       // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
9471                       ubfx(CurrentCond(),
9472                            Register(rd),
9473                            Register(rn),
9474                            lsb,
9475                            width);
9476                       if (((instr & 0xfff08020) != 0xf3c00000)) {
9477                         UnpredictableT32(instr);
9478                       }
9479                       break;
9480                     }
9481                     default:
9482                       UnallocatedT32(instr);
9483                       break;
9484                   }
9485                   break;
9486                 }
9487                 case 0x00008000: {
9488                   // 0xf0008000
9489                   switch (instr & 0x00005000) {
9490                     case 0x00000000: {
9491                       // 0xf0008000
9492                       switch (instr & 0x03800000) {
9493                         case 0x03800000: {
9494                           // 0xf3808000
9495                           switch (instr & 0x04600000) {
9496                             case 0x00000000: {
9497                               // 0xf3808000
9498                               switch (instr & 0x00000020) {
9499                                 case 0x00000000: {
9500                                   // 0xf3808000
9501                                   unsigned spec_reg = ((instr >> 8) & 0xf) |
9502                                                       ((instr >> 16) & 0x10);
9503                                   unsigned rn = (instr >> 16) & 0xf;
9504                                   // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
9505                                   msr(CurrentCond(),
9506                                       MaskedSpecialRegister(spec_reg),
9507                                       Register(rn));
9508                                   if (((instr & 0xffe0f0ff) != 0xf3808000)) {
9509                                     UnpredictableT32(instr);
9510                                   }
9511                                   break;
9512                                 }
9513                                 case 0x00000020: {
9514                                   // 0xf3808020
9515                                   UnimplementedT32_32("MSR", instr);
9516                                   break;
9517                                 }
9518                               }
9519                               break;
9520                             }
9521                             case 0x00200000: {
9522                               // 0xf3a08000
9523                               switch (instr & 0x00100000) {
9524                                 case 0x00000000: {
9525                                   // 0xf3a08000
9526                                   switch (instr & 0x00000700) {
9527                                     case 0x00000000: {
9528                                       // 0xf3a08000
9529                                       switch (instr & 0x000000f0) {
9530                                         case 0x00000000: {
9531                                           // 0xf3a08000
9532                                           switch (instr & 0x0000000f) {
9533                                             case 0x00000000: {
9534                                               // 0xf3a08000
9535                                               // NOP{<c>}.W ; T2
9536                                               nop(CurrentCond(), Wide);
9537                                               if (((instr & 0xffffffff) !=
9538                                                    0xf3af8000)) {
9539                                                 UnpredictableT32(instr);
9540                                               }
9541                                               break;
9542                                             }
9543                                             case 0x00000001: {
9544                                               // 0xf3a08001
9545                                               // YIELD{<c>}.W ; T2
9546                                               yield(CurrentCond(), Wide);
9547                                               if (((instr & 0xffffffff) !=
9548                                                    0xf3af8001)) {
9549                                                 UnpredictableT32(instr);
9550                                               }
9551                                               break;
9552                                             }
9553                                             case 0x00000002: {
9554                                               // 0xf3a08002
9555                                               UnimplementedT32_32("WFE", instr);
9556                                               break;
9557                                             }
9558                                             case 0x00000003: {
9559                                               // 0xf3a08003
9560                                               UnimplementedT32_32("WFI", instr);
9561                                               break;
9562                                             }
9563                                             case 0x00000004: {
9564                                               // 0xf3a08004
9565                                               UnimplementedT32_32("SEV", instr);
9566                                               break;
9567                                             }
9568                                             case 0x00000005: {
9569                                               // 0xf3a08005
9570                                               UnimplementedT32_32("SEVL",
9571                                                                   instr);
9572                                               break;
9573                                             }
9574                                             default:
9575                                               UnallocatedT32(instr);
9576                                               break;
9577                                           }
9578                                           break;
9579                                         }
9580                                         case 0x000000f0: {
9581                                           // 0xf3a080f0
9582                                           UnimplementedT32_32("DBG", instr);
9583                                           break;
9584                                         }
9585                                         default:
9586                                           UnallocatedT32(instr);
9587                                           break;
9588                                       }
9589                                       break;
9590                                     }
9591                                     case 0x00000100: {
9592                                       // 0xf3a08100
9593                                       if ((instr & 0x000000e0) == 0x00000000) {
9594                                         UnimplementedT32_32("CPS", instr);
9595                                       } else {
9596                                         UnallocatedT32(instr);
9597                                       }
9598                                       break;
9599                                     }
9600                                     case 0x00000400: {
9601                                       // 0xf3a08400
9602                                       if ((instr & 0x0000001f) == 0x00000000) {
9603                                         UnimplementedT32_32("CPSIE", instr);
9604                                       } else {
9605                                         UnallocatedT32(instr);
9606                                       }
9607                                       break;
9608                                     }
9609                                     case 0x00000500: {
9610                                       // 0xf3a08500
9611                                       UnimplementedT32_32("CPSIE", instr);
9612                                       break;
9613                                     }
9614                                     case 0x00000600: {
9615                                       // 0xf3a08600
9616                                       if ((instr & 0x0000001f) == 0x00000000) {
9617                                         UnimplementedT32_32("CPSID", instr);
9618                                       } else {
9619                                         UnallocatedT32(instr);
9620                                       }
9621                                       break;
9622                                     }
9623                                     case 0x00000700: {
9624                                       // 0xf3a08700
9625                                       UnimplementedT32_32("CPSID", instr);
9626                                       break;
9627                                     }
9628                                     default:
9629                                       UnallocatedT32(instr);
9630                                       break;
9631                                   }
9632                                   break;
9633                                 }
9634                                 case 0x00100000: {
9635                                   // 0xf3b08000
9636                                   switch (instr & 0x000000f0) {
9637                                     case 0x00000020: {
9638                                       // 0xf3b08020
9639                                       // CLREX{<c>}{<q>} ; T1
9640                                       clrex(CurrentCond());
9641                                       if (((instr & 0xffffffff) !=
9642                                            0xf3bf8f2f)) {
9643                                         UnpredictableT32(instr);
9644                                       }
9645                                       break;
9646                                     }
9647                                     case 0x00000040: {
9648                                       // 0xf3b08040
9649                                       MemoryBarrier option(instr & 0xf);
9650                                       // DSB{<c>}{<q>} {<option>} ; T1
9651                                       dsb(CurrentCond(), option);
9652                                       if (((instr & 0xfffffff0) !=
9653                                            0xf3bf8f40)) {
9654                                         UnpredictableT32(instr);
9655                                       }
9656                                       break;
9657                                     }
9658                                     case 0x00000050: {
9659                                       // 0xf3b08050
9660                                       MemoryBarrier option(instr & 0xf);
9661                                       // DMB{<c>}{<q>} {<option>} ; T1
9662                                       dmb(CurrentCond(), option);
9663                                       if (((instr & 0xfffffff0) !=
9664                                            0xf3bf8f50)) {
9665                                         UnpredictableT32(instr);
9666                                       }
9667                                       break;
9668                                     }
9669                                     case 0x00000060: {
9670                                       // 0xf3b08060
9671                                       MemoryBarrier option(instr & 0xf);
9672                                       // ISB{<c>}{<q>} {<option>} ; T1
9673                                       isb(CurrentCond(), option);
9674                                       if (((instr & 0xfffffff0) !=
9675                                            0xf3bf8f60)) {
9676                                         UnpredictableT32(instr);
9677                                       }
9678                                       break;
9679                                     }
9680                                     default:
9681                                       UnallocatedT32(instr);
9682                                       break;
9683                                   }
9684                                   break;
9685                                 }
9686                               }
9687                               break;
9688                             }
9689                             case 0x00400000: {
9690                               // 0xf3c08000
9691                               switch (instr & 0x00100000) {
9692                                 case 0x00000000: {
9693                                   // 0xf3c08000
9694                                   unsigned rm = (instr >> 16) & 0xf;
9695                                   // BXJ{<c>}{<q>} <Rm> ; T1
9696                                   bxj(CurrentCond(), Register(rm));
9697                                   if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
9698                                     UnpredictableT32(instr);
9699                                   }
9700                                   break;
9701                                 }
9702                                 case 0x00100000: {
9703                                   // 0xf3d08000
9704                                   switch (instr & 0x000000ff) {
9705                                     case 0x00000000: {
9706                                       // 0xf3d08000
9707                                       if ((instr & 0x000f0000) == 0x000e0000) {
9708                                         UnimplementedT32_32("ERET", instr);
9709                                       } else {
9710                                         UnallocatedT32(instr);
9711                                       }
9712                                       break;
9713                                     }
9714                                     default: {
9715                                       if (((instr & 0xff) == 0x0)) {
9716                                         UnallocatedT32(instr);
9717                                         return;
9718                                       }
9719                                       uint32_t imm = instr & 0xff;
9720                                       // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
9721                                       subs(CurrentCond(), Best, pc, lr, imm);
9722                                       if (((instr & 0xffffff00) !=
9723                                            0xf3de8f00)) {
9724                                         UnpredictableT32(instr);
9725                                       }
9726                                       break;
9727                                     }
9728                                   }
9729                                   break;
9730                                 }
9731                               }
9732                               break;
9733                             }
9734                             case 0x00600000: {
9735                               // 0xf3e08000
9736                               switch (instr & 0x00000020) {
9737                                 case 0x00000000: {
9738                                   // 0xf3e08000
9739                                   unsigned rd = (instr >> 8) & 0xf;
9740                                   unsigned spec_reg = (instr >> 20) & 0x1;
9741                                   // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
9742                                   mrs(CurrentCond(),
9743                                       Register(rd),
9744                                       SpecialRegister(spec_reg));
9745                                   if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
9746                                     UnpredictableT32(instr);
9747                                   }
9748                                   break;
9749                                 }
9750                                 case 0x00000020: {
9751                                   // 0xf3e08020
9752                                   UnimplementedT32_32("MRS", instr);
9753                                   break;
9754                                 }
9755                               }
9756                               break;
9757                             }
9758                             case 0x04000000: {
9759                               // 0xf7808000
9760                               switch (instr & 0x001f2fff) {
9761                                 case 0x000f0001: {
9762                                   // 0xf78f8001
9763                                   UnimplementedT32_32("DCPS1", instr);
9764                                   break;
9765                                 }
9766                                 case 0x000f0002: {
9767                                   // 0xf78f8002
9768                                   UnimplementedT32_32("DCPS2", instr);
9769                                   break;
9770                                 }
9771                                 case 0x000f0003: {
9772                                   // 0xf78f8003
9773                                   UnimplementedT32_32("DCPS3", instr);
9774                                   break;
9775                                 }
9776                                 default:
9777                                   UnallocatedT32(instr);
9778                                   break;
9779                               }
9780                               break;
9781                             }
9782                             case 0x04600000: {
9783                               // 0xf7e08000
9784                               switch (instr & 0x00102000) {
9785                                 case 0x00000000: {
9786                                   // 0xf7e08000
9787                                   uint32_t imm =
9788                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
9789                                   // HVC{<q>} {#}<imm16> ; T1
9790                                   hvc(Condition::None(), imm);
9791                                   break;
9792                                 }
9793                                 case 0x00100000: {
9794                                   // 0xf7f08000
9795                                   UnimplementedT32_32("SMC", instr);
9796                                   break;
9797                                 }
9798                                 case 0x00102000: {
9799                                   // 0xf7f0a000
9800                                   uint32_t imm =
9801                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
9802                                   if ((imm <= 255)) {
9803                                     // UDF{<c>}.W {#}<imm> ; T2
9804                                     udf(CurrentCond(), Wide, imm);
9805                                   } else {
9806                                     // UDF{<c>}{<q>} {#}<imm> ; T2
9807                                     udf(CurrentCond(), Best, imm);
9808                                   }
9809                                   break;
9810                                 }
9811                                 default:
9812                                   UnallocatedT32(instr);
9813                                   break;
9814                               }
9815                               break;
9816                             }
9817                             default:
9818                               UnallocatedT32(instr);
9819                               break;
9820                           }
9821                           break;
9822                         }
9823                         default: {
9824                           if (((instr & 0x3800000) == 0x3800000)) {
9825                             UnallocatedT32(instr);
9826                             return;
9827                           }
9828                           Condition condition((instr >> 22) & 0xf);
9829                           int32_t imm =
9830                               SignExtend<int32_t>((instr & 0x7ff) |
9831                                                       ((instr >> 5) & 0x1f800) |
9832                                                       ((instr << 4) & 0x20000) |
9833                                                       ((instr << 7) & 0x40000) |
9834                                                       ((instr >> 7) & 0x80000),
9835                                                   20)
9836                               << 1;
9837                           Label label(imm, kT32PcDelta);
9838                           if (OutsideITBlock() && (imm >= -1048576) &&
9839                               (imm <= 1048574) && ((imm & 1) == 0) &&
9840                               ((imm >= -256) && (imm <= 254) &&
9841                                ((imm & 1) == 0))) {
9842                             // B<c>.W <label> ; T3
9843                             b(condition, Wide, &label);
9844                           } else {
9845                             VIXL_ASSERT(OutsideITBlock() && (imm >= -1048576) &&
9846                                         (imm <= 1048574) && ((imm & 1) == 0));
9847                             // B<c>{<q>} <label> ; T3
9848                             b(condition, Best, &label);
9849                           }
9850                           break;
9851                         }
9852                       }
9853                       break;
9854                     }
9855                     case 0x00001000: {
9856                       // 0xf0009000
9857                       uint32_t encoded_imm =
9858                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9859                           ((instr << 10) & 0x200000) |
9860                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9861                       uint32_t S = encoded_imm & (1 << 23);
9862                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9863                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9864                       Label label(imm, kT32PcDelta);
9865                       if ((imm >= -16777216) && (imm <= 16777214) &&
9866                           ((imm & 1) == 0) &&
9867                           (OutsideITBlockOrLast() && (imm >= -2048) &&
9868                            (imm <= 2046) && ((imm & 1) == 0))) {
9869                         // B{<c>}.W <label> ; T4
9870                         b(CurrentCond(), Wide, &label);
9871                       } else {
9872                         VIXL_ASSERT(OutsideITBlockOrLast() &&
9873                                     (imm >= -16777216) && (imm <= 16777214) &&
9874                                     ((imm & 1) == 0));
9875                         // B{<c>}{<q>} <label> ; T4
9876                         b(CurrentCond(), Best, &label);
9877                       }
9878                       break;
9879                     }
9880                     case 0x00004000: {
9881                       // 0xf000c000
9882                       if ((instr & 0x00000001) == 0x00000000) {
9883                         uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
9884                                                ((instr >> 6) & 0xffc00) |
9885                                                ((instr << 9) & 0x100000) |
9886                                                ((instr << 8) & 0x200000) |
9887                                                ((instr >> 4) & 0x400000);
9888                         uint32_t S = encoded_imm & (1 << 22);
9889                         encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
9890                         int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
9891                         Label label(imm, kT32PcDelta);
9892                         // BLX{<c>}{<q>} <label> ; T2
9893                         blx(CurrentCond(), &label);
9894                       } else {
9895                         UnallocatedT32(instr);
9896                       }
9897                       break;
9898                     }
9899                     case 0x00005000: {
9900                       // 0xf000d000
9901                       uint32_t encoded_imm =
9902                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
9903                           ((instr << 10) & 0x200000) |
9904                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
9905                       uint32_t S = encoded_imm & (1 << 23);
9906                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
9907                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
9908                       Label label(imm, kT32PcDelta);
9909                       // BL{<c>}{<q>} <label> ; T1
9910                       bl(CurrentCond(), &label);
9911                       break;
9912                     }
9913                   }
9914                   break;
9915                 }
9916               }
9917               break;
9918             }
9919           }
9920           break;
9921         }
9922         case 0x08000000: {
9923           // 0xe8000000
9924           switch (instr & 0x06000000) {
9925             case 0x00000000: {
9926               // 0xe8000000
9927               switch (instr & 0x10100000) {
9928                 case 0x00000000: {
9929                   // 0xe8000000
9930                   switch (instr & 0x01400000) {
9931                     case 0x00000000: {
9932                       // 0xe8000000
9933                       switch (instr & 0x00800000) {
9934                         case 0x00000000: {
9935                           // 0xe8000000
9936                           UnimplementedT32_32("SRSDB", instr);
9937                           break;
9938                         }
9939                         case 0x00800000: {
9940                           // 0xe8800000
9941                           unsigned rn = (instr >> 16) & 0xf;
9942                           WriteBack write_back((instr >> 21) & 0x1);
9943                           RegisterList registers(
9944                               (((instr >> 14) & 0x1) << kLRRegNum) |
9945                               (instr & 0x1fff));
9946                           if ((rn < kNumberOfT32LowRegisters) &&
9947                               write_back.DoesWriteBack() &&
9948                               ((registers.GetList() & ~0xff) == 0)) {
9949                             // STM{<c>}.W <Rn>{!}, <registers> ; T2
9950                             stm(CurrentCond(),
9951                                 Wide,
9952                                 Register(rn),
9953                                 write_back,
9954                                 registers);
9955                             if (((instr & 0xffd0a000) != 0xe8800000)) {
9956                               UnpredictableT32(instr);
9957                             }
9958                           } else {
9959                             // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
9960                             stm(CurrentCond(),
9961                                 Best,
9962                                 Register(rn),
9963                                 write_back,
9964                                 registers);
9965                             if (((instr & 0xffd0a000) != 0xe8800000)) {
9966                               UnpredictableT32(instr);
9967                             }
9968                           }
9969                           break;
9970                         }
9971                       }
9972                       break;
9973                     }
9974                     case 0x00400000: {
9975                       // 0xe8400000
9976                       switch (instr & 0x00200000) {
9977                         case 0x00000000: {
9978                           // 0xe8400000
9979                           switch (instr & 0x00800000) {
9980                             case 0x00000000: {
9981                               // 0xe8400000
9982                               unsigned rd = (instr >> 8) & 0xf;
9983                               unsigned rt = (instr >> 12) & 0xf;
9984                               unsigned rn = (instr >> 16) & 0xf;
9985                               int32_t offset = (instr & 0xff) << 2;
9986                               // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
9987                               strex(CurrentCond(),
9988                                     Register(rd),
9989                                     Register(rt),
9990                                     MemOperand(Register(rn),
9991                                                plus,
9992                                                offset,
9993                                                Offset));
9994                               break;
9995                             }
9996                             case 0x00800000: {
9997                               // 0xe8c00000
9998                               switch (instr & 0x000000f0) {
9999                                 case 0x00000040: {
10000                                   // 0xe8c00040
10001                                   unsigned rd = instr & 0xf;
10002                                   unsigned rt = (instr >> 12) & 0xf;
10003                                   unsigned rn = (instr >> 16) & 0xf;
10004                                   // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10005                                   strexb(CurrentCond(),
10006                                          Register(rd),
10007                                          Register(rt),
10008                                          MemOperand(Register(rn), Offset));
10009                                   if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
10010                                     UnpredictableT32(instr);
10011                                   }
10012                                   break;
10013                                 }
10014                                 case 0x00000050: {
10015                                   // 0xe8c00050
10016                                   unsigned rd = instr & 0xf;
10017                                   unsigned rt = (instr >> 12) & 0xf;
10018                                   unsigned rn = (instr >> 16) & 0xf;
10019                                   // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10020                                   strexh(CurrentCond(),
10021                                          Register(rd),
10022                                          Register(rt),
10023                                          MemOperand(Register(rn), Offset));
10024                                   if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
10025                                     UnpredictableT32(instr);
10026                                   }
10027                                   break;
10028                                 }
10029                                 case 0x00000070: {
10030                                   // 0xe8c00070
10031                                   unsigned rd = instr & 0xf;
10032                                   unsigned rt = (instr >> 12) & 0xf;
10033                                   unsigned rt2 = (instr >> 8) & 0xf;
10034                                   unsigned rn = (instr >> 16) & 0xf;
10035                                   // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10036                                   strexd(CurrentCond(),
10037                                          Register(rd),
10038                                          Register(rt),
10039                                          Register(rt2),
10040                                          MemOperand(Register(rn), Offset));
10041                                   break;
10042                                 }
10043                                 case 0x00000080: {
10044                                   // 0xe8c00080
10045                                   unsigned rt = (instr >> 12) & 0xf;
10046                                   unsigned rn = (instr >> 16) & 0xf;
10047                                   // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10048                                   stlb(CurrentCond(),
10049                                        Register(rt),
10050                                        MemOperand(Register(rn), Offset));
10051                                   if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
10052                                     UnpredictableT32(instr);
10053                                   }
10054                                   break;
10055                                 }
10056                                 case 0x00000090: {
10057                                   // 0xe8c00090
10058                                   unsigned rt = (instr >> 12) & 0xf;
10059                                   unsigned rn = (instr >> 16) & 0xf;
10060                                   // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10061                                   stlh(CurrentCond(),
10062                                        Register(rt),
10063                                        MemOperand(Register(rn), Offset));
10064                                   if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
10065                                     UnpredictableT32(instr);
10066                                   }
10067                                   break;
10068                                 }
10069                                 case 0x000000a0: {
10070                                   // 0xe8c000a0
10071                                   unsigned rt = (instr >> 12) & 0xf;
10072                                   unsigned rn = (instr >> 16) & 0xf;
10073                                   // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
10074                                   stl(CurrentCond(),
10075                                       Register(rt),
10076                                       MemOperand(Register(rn), Offset));
10077                                   if (((instr & 0xfff00fff) != 0xe8c00faf)) {
10078                                     UnpredictableT32(instr);
10079                                   }
10080                                   break;
10081                                 }
10082                                 case 0x000000c0: {
10083                                   // 0xe8c000c0
10084                                   unsigned rd = instr & 0xf;
10085                                   unsigned rt = (instr >> 12) & 0xf;
10086                                   unsigned rn = (instr >> 16) & 0xf;
10087                                   // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10088                                   stlexb(CurrentCond(),
10089                                          Register(rd),
10090                                          Register(rt),
10091                                          MemOperand(Register(rn), Offset));
10092                                   if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
10093                                     UnpredictableT32(instr);
10094                                   }
10095                                   break;
10096                                 }
10097                                 case 0x000000d0: {
10098                                   // 0xe8c000d0
10099                                   unsigned rd = instr & 0xf;
10100                                   unsigned rt = (instr >> 12) & 0xf;
10101                                   unsigned rn = (instr >> 16) & 0xf;
10102                                   // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10103                                   stlexh(CurrentCond(),
10104                                          Register(rd),
10105                                          Register(rt),
10106                                          MemOperand(Register(rn), Offset));
10107                                   if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
10108                                     UnpredictableT32(instr);
10109                                   }
10110                                   break;
10111                                 }
10112                                 case 0x000000e0: {
10113                                   // 0xe8c000e0
10114                                   unsigned rd = instr & 0xf;
10115                                   unsigned rt = (instr >> 12) & 0xf;
10116                                   unsigned rn = (instr >> 16) & 0xf;
10117                                   // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
10118                                   stlex(CurrentCond(),
10119                                         Register(rd),
10120                                         Register(rt),
10121                                         MemOperand(Register(rn), Offset));
10122                                   if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
10123                                     UnpredictableT32(instr);
10124                                   }
10125                                   break;
10126                                 }
10127                                 case 0x000000f0: {
10128                                   // 0xe8c000f0
10129                                   unsigned rd = instr & 0xf;
10130                                   unsigned rt = (instr >> 12) & 0xf;
10131                                   unsigned rt2 = (instr >> 8) & 0xf;
10132                                   unsigned rn = (instr >> 16) & 0xf;
10133                                   // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
10134                                   stlexd(CurrentCond(),
10135                                          Register(rd),
10136                                          Register(rt),
10137                                          Register(rt2),
10138                                          MemOperand(Register(rn), Offset));
10139                                   break;
10140                                 }
10141                                 default:
10142                                   UnallocatedT32(instr);
10143                                   break;
10144                               }
10145                               break;
10146                             }
10147                           }
10148                           break;
10149                         }
10150                         case 0x00200000: {
10151                           // 0xe8600000
10152                           if (((instr & 0xf0000) == 0xf0000)) {
10153                             UnallocatedT32(instr);
10154                             return;
10155                           }
10156                           unsigned rt = (instr >> 12) & 0xf;
10157                           unsigned rt2 = (instr >> 8) & 0xf;
10158                           unsigned rn = (instr >> 16) & 0xf;
10159                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10160                                                                  : plus);
10161                           int32_t offset = (instr & 0xff) << 2;
10162                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10163                           strd(CurrentCond(),
10164                                Register(rt),
10165                                Register(rt2),
10166                                MemOperand(Register(rn),
10167                                           sign,
10168                                           offset,
10169                                           PostIndex));
10170                           break;
10171                         }
10172                       }
10173                       break;
10174                     }
10175                     case 0x01000000: {
10176                       // 0xe9000000
10177                       switch (instr & 0x00800000) {
10178                         case 0x00000000: {
10179                           // 0xe9000000
10180                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10181                                Uint32(0x1)) &&
10182                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10183                                Uint32(0xd)) &&
10184                               (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
10185                                          << 13) |
10186                                         (Uint32(instr) & Uint32(0x1fff))) >
10187                                Int64(1))) {
10188                             RegisterList registers(
10189                                 (((instr >> 14) & 0x1) << kLRRegNum) |
10190                                 (instr & 0x1fff));
10191                             if (registers.IsR0toR7orLR()) {
10192                               // PUSH{<c>}.W <registers> ; T1
10193                               push(CurrentCond(), Wide, registers);
10194                               if (((instr & 0xffffa000) != 0xe92d0000)) {
10195                                 UnpredictableT32(instr);
10196                               }
10197                             } else {
10198                               // PUSH{<c>}{<q>} <registers> ; T1
10199                               push(CurrentCond(), Best, registers);
10200                               if (((instr & 0xffffa000) != 0xe92d0000)) {
10201                                 UnpredictableT32(instr);
10202                               }
10203                             }
10204                             return;
10205                           }
10206                           unsigned rn = (instr >> 16) & 0xf;
10207                           WriteBack write_back((instr >> 21) & 0x1);
10208                           RegisterList registers(
10209                               (((instr >> 14) & 0x1) << kLRRegNum) |
10210                               (instr & 0x1fff));
10211                           // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10212                           stmdb(CurrentCond(),
10213                                 Best,
10214                                 Register(rn),
10215                                 write_back,
10216                                 registers);
10217                           if (((instr & 0xffd0a000) != 0xe9000000)) {
10218                             UnpredictableT32(instr);
10219                           }
10220                           break;
10221                         }
10222                         case 0x00800000: {
10223                           // 0xe9800000
10224                           UnimplementedT32_32("SRS{IA}", instr);
10225                           break;
10226                         }
10227                       }
10228                       break;
10229                     }
10230                     case 0x01400000: {
10231                       // 0xe9400000
10232                       switch (instr & 0x00200000) {
10233                         case 0x00000000: {
10234                           // 0xe9400000
10235                           if (((instr & 0xf0000) == 0xf0000)) {
10236                             UnallocatedT32(instr);
10237                             return;
10238                           }
10239                           unsigned rt = (instr >> 12) & 0xf;
10240                           unsigned rt2 = (instr >> 8) & 0xf;
10241                           unsigned rn = (instr >> 16) & 0xf;
10242                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10243                                                                  : plus);
10244                           int32_t offset = (instr & 0xff) << 2;
10245                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10246                           strd(CurrentCond(),
10247                                Register(rt),
10248                                Register(rt2),
10249                                MemOperand(Register(rn), sign, offset, Offset));
10250                           break;
10251                         }
10252                         case 0x00200000: {
10253                           // 0xe9600000
10254                           if (((instr & 0xf0000) == 0xf0000)) {
10255                             UnallocatedT32(instr);
10256                             return;
10257                           }
10258                           unsigned rt = (instr >> 12) & 0xf;
10259                           unsigned rt2 = (instr >> 8) & 0xf;
10260                           unsigned rn = (instr >> 16) & 0xf;
10261                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10262                                                                  : plus);
10263                           int32_t offset = (instr & 0xff) << 2;
10264                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10265                           strd(CurrentCond(),
10266                                Register(rt),
10267                                Register(rt2),
10268                                MemOperand(Register(rn),
10269                                           sign,
10270                                           offset,
10271                                           PreIndex));
10272                           break;
10273                         }
10274                       }
10275                       break;
10276                     }
10277                   }
10278                   break;
10279                 }
10280                 case 0x00100000: {
10281                   // 0xe8100000
10282                   switch (instr & 0x00400000) {
10283                     case 0x00000000: {
10284                       // 0xe8100000
10285                       switch (instr & 0x01800000) {
10286                         case 0x00000000: {
10287                           // 0xe8100000
10288                           UnimplementedT32_32("RFEDB", instr);
10289                           break;
10290                         }
10291                         case 0x00800000: {
10292                           // 0xe8900000
10293                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
10294                                Uint32(0x1)) &&
10295                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
10296                                Uint32(0xd)) &&
10297                               (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
10298                                          << 14) |
10299                                         ((Uint32((instr >> 14)) & Uint32(0x1))
10300                                          << 13) |
10301                                         (Uint32(instr) & Uint32(0x1fff))) >
10302                                Int64(1))) {
10303                             RegisterList registers(
10304                                 (((instr >> 15) & 0x1) << kPCRegNum) |
10305                                 (((instr >> 14) & 0x1) << kLRRegNum) |
10306                                 (instr & 0x1fff));
10307                             if (registers.IsR0toR7orPC()) {
10308                               // POP{<c>}.W <registers> ; T2
10309                               pop(CurrentCond(), Wide, registers);
10310                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
10311                                 UnpredictableT32(instr);
10312                               }
10313                             } else {
10314                               // POP{<c>}{<q>} <registers> ; T2
10315                               pop(CurrentCond(), Best, registers);
10316                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
10317                                 UnpredictableT32(instr);
10318                               }
10319                             }
10320                             return;
10321                           }
10322                           unsigned rn = (instr >> 16) & 0xf;
10323                           WriteBack write_back((instr >> 21) & 0x1);
10324                           RegisterList registers(
10325                               (((instr >> 15) & 0x1) << kPCRegNum) |
10326                               (((instr >> 14) & 0x1) << kLRRegNum) |
10327                               (instr & 0x1fff));
10328                           if ((rn < kNumberOfT32LowRegisters) &&
10329                               (((registers.GetList() & (1 << rn)) == 0) ==
10330                                write_back.DoesWriteBack()) &&
10331                               ((registers.GetList() & ~0xff) == 0)) {
10332                             // LDM{<c>}.W <Rn>{!}, <registers> ; T2
10333                             ldm(CurrentCond(),
10334                                 Wide,
10335                                 Register(rn),
10336                                 write_back,
10337                                 registers);
10338                             if (((instr & 0xffd02000) != 0xe8900000)) {
10339                               UnpredictableT32(instr);
10340                             }
10341                           } else {
10342                             // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
10343                             ldm(CurrentCond(),
10344                                 Best,
10345                                 Register(rn),
10346                                 write_back,
10347                                 registers);
10348                             if (((instr & 0xffd02000) != 0xe8900000)) {
10349                               UnpredictableT32(instr);
10350                             }
10351                           }
10352                           break;
10353                         }
10354                         case 0x01000000: {
10355                           // 0xe9100000
10356                           unsigned rn = (instr >> 16) & 0xf;
10357                           WriteBack write_back((instr >> 21) & 0x1);
10358                           RegisterList registers(
10359                               (((instr >> 15) & 0x1) << kPCRegNum) |
10360                               (((instr >> 14) & 0x1) << kLRRegNum) |
10361                               (instr & 0x1fff));
10362                           // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
10363                           ldmdb(CurrentCond(),
10364                                 Register(rn),
10365                                 write_back,
10366                                 registers);
10367                           if (((instr & 0xffd02000) != 0xe9100000)) {
10368                             UnpredictableT32(instr);
10369                           }
10370                           break;
10371                         }
10372                         case 0x01800000: {
10373                           // 0xe9900000
10374                           UnimplementedT32_32("RFE{IA}", instr);
10375                           break;
10376                         }
10377                       }
10378                       break;
10379                     }
10380                     case 0x00400000: {
10381                       // 0xe8500000
10382                       switch (instr & 0x01200000) {
10383                         case 0x00000000: {
10384                           // 0xe8500000
10385                           switch (instr & 0x00800000) {
10386                             case 0x00000000: {
10387                               // 0xe8500000
10388                               unsigned rt = (instr >> 12) & 0xf;
10389                               unsigned rn = (instr >> 16) & 0xf;
10390                               int32_t offset = (instr & 0xff) << 2;
10391                               // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
10392                               ldrex(CurrentCond(),
10393                                     Register(rt),
10394                                     MemOperand(Register(rn),
10395                                                plus,
10396                                                offset,
10397                                                Offset));
10398                               if (((instr & 0xfff00f00) != 0xe8500f00)) {
10399                                 UnpredictableT32(instr);
10400                               }
10401                               break;
10402                             }
10403                             case 0x00800000: {
10404                               // 0xe8d00000
10405                               switch (instr & 0x000000f0) {
10406                                 case 0x00000000: {
10407                                   // 0xe8d00000
10408                                   unsigned rn = (instr >> 16) & 0xf;
10409                                   unsigned rm = instr & 0xf;
10410                                   // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
10411                                   tbb(CurrentCond(),
10412                                       Register(rn),
10413                                       Register(rm));
10414                                   if (((instr & 0xfff0fff0) != 0xe8d0f000)) {
10415                                     UnpredictableT32(instr);
10416                                   }
10417                                   break;
10418                                 }
10419                                 case 0x00000010: {
10420                                   // 0xe8d00010
10421                                   unsigned rn = (instr >> 16) & 0xf;
10422                                   unsigned rm = instr & 0xf;
10423                                   // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
10424                                   tbh(CurrentCond(),
10425                                       Register(rn),
10426                                       Register(rm));
10427                                   if (((instr & 0xfff0fff0) != 0xe8d0f010)) {
10428                                     UnpredictableT32(instr);
10429                                   }
10430                                   break;
10431                                 }
10432                                 case 0x00000040: {
10433                                   // 0xe8d00040
10434                                   unsigned rt = (instr >> 12) & 0xf;
10435                                   unsigned rn = (instr >> 16) & 0xf;
10436                                   // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10437                                   ldrexb(CurrentCond(),
10438                                          Register(rt),
10439                                          MemOperand(Register(rn), Offset));
10440                                   if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
10441                                     UnpredictableT32(instr);
10442                                   }
10443                                   break;
10444                                 }
10445                                 case 0x00000050: {
10446                                   // 0xe8d00050
10447                                   unsigned rt = (instr >> 12) & 0xf;
10448                                   unsigned rn = (instr >> 16) & 0xf;
10449                                   // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10450                                   ldrexh(CurrentCond(),
10451                                          Register(rt),
10452                                          MemOperand(Register(rn), Offset));
10453                                   if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
10454                                     UnpredictableT32(instr);
10455                                   }
10456                                   break;
10457                                 }
10458                                 case 0x00000070: {
10459                                   // 0xe8d00070
10460                                   unsigned rt = (instr >> 12) & 0xf;
10461                                   unsigned rt2 = (instr >> 8) & 0xf;
10462                                   unsigned rn = (instr >> 16) & 0xf;
10463                                   // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10464                                   ldrexd(CurrentCond(),
10465                                          Register(rt),
10466                                          Register(rt2),
10467                                          MemOperand(Register(rn), Offset));
10468                                   if (((instr & 0xfff000ff) != 0xe8d0007f)) {
10469                                     UnpredictableT32(instr);
10470                                   }
10471                                   break;
10472                                 }
10473                                 case 0x00000080: {
10474                                   // 0xe8d00080
10475                                   unsigned rt = (instr >> 12) & 0xf;
10476                                   unsigned rn = (instr >> 16) & 0xf;
10477                                   // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10478                                   ldab(CurrentCond(),
10479                                        Register(rt),
10480                                        MemOperand(Register(rn), Offset));
10481                                   if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
10482                                     UnpredictableT32(instr);
10483                                   }
10484                                   break;
10485                                 }
10486                                 case 0x00000090: {
10487                                   // 0xe8d00090
10488                                   unsigned rt = (instr >> 12) & 0xf;
10489                                   unsigned rn = (instr >> 16) & 0xf;
10490                                   // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10491                                   ldah(CurrentCond(),
10492                                        Register(rt),
10493                                        MemOperand(Register(rn), Offset));
10494                                   if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
10495                                     UnpredictableT32(instr);
10496                                   }
10497                                   break;
10498                                 }
10499                                 case 0x000000a0: {
10500                                   // 0xe8d000a0
10501                                   unsigned rt = (instr >> 12) & 0xf;
10502                                   unsigned rn = (instr >> 16) & 0xf;
10503                                   // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
10504                                   lda(CurrentCond(),
10505                                       Register(rt),
10506                                       MemOperand(Register(rn), Offset));
10507                                   if (((instr & 0xfff00fff) != 0xe8d00faf)) {
10508                                     UnpredictableT32(instr);
10509                                   }
10510                                   break;
10511                                 }
10512                                 case 0x000000c0: {
10513                                   // 0xe8d000c0
10514                                   unsigned rt = (instr >> 12) & 0xf;
10515                                   unsigned rn = (instr >> 16) & 0xf;
10516                                   // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
10517                                   ldaexb(CurrentCond(),
10518                                          Register(rt),
10519                                          MemOperand(Register(rn), Offset));
10520                                   if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
10521                                     UnpredictableT32(instr);
10522                                   }
10523                                   break;
10524                                 }
10525                                 case 0x000000d0: {
10526                                   // 0xe8d000d0
10527                                   unsigned rt = (instr >> 12) & 0xf;
10528                                   unsigned rn = (instr >> 16) & 0xf;
10529                                   // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
10530                                   ldaexh(CurrentCond(),
10531                                          Register(rt),
10532                                          MemOperand(Register(rn), Offset));
10533                                   if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
10534                                     UnpredictableT32(instr);
10535                                   }
10536                                   break;
10537                                 }
10538                                 case 0x000000e0: {
10539                                   // 0xe8d000e0
10540                                   unsigned rt = (instr >> 12) & 0xf;
10541                                   unsigned rn = (instr >> 16) & 0xf;
10542                                   // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
10543                                   ldaex(CurrentCond(),
10544                                         Register(rt),
10545                                         MemOperand(Register(rn), Offset));
10546                                   if (((instr & 0xfff00fff) != 0xe8d00fef)) {
10547                                     UnpredictableT32(instr);
10548                                   }
10549                                   break;
10550                                 }
10551                                 case 0x000000f0: {
10552                                   // 0xe8d000f0
10553                                   unsigned rt = (instr >> 12) & 0xf;
10554                                   unsigned rt2 = (instr >> 8) & 0xf;
10555                                   unsigned rn = (instr >> 16) & 0xf;
10556                                   // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
10557                                   ldaexd(CurrentCond(),
10558                                          Register(rt),
10559                                          Register(rt2),
10560                                          MemOperand(Register(rn), Offset));
10561                                   if (((instr & 0xfff000ff) != 0xe8d000ff)) {
10562                                     UnpredictableT32(instr);
10563                                   }
10564                                   break;
10565                                 }
10566                                 default:
10567                                   UnallocatedT32(instr);
10568                                   break;
10569                               }
10570                               break;
10571                             }
10572                           }
10573                           break;
10574                         }
10575                         case 0x00200000: {
10576                           // 0xe8700000
10577                           switch (instr & 0x000f0000) {
10578                             case 0x000f0000: {
10579                               // 0xe87f0000
10580                               if (((instr & 0x1200000) == 0x0)) {
10581                                 UnallocatedT32(instr);
10582                                 return;
10583                               }
10584                               unsigned rt = (instr >> 12) & 0xf;
10585                               unsigned rt2 = (instr >> 8) & 0xf;
10586                               uint32_t U = (instr >> 23) & 0x1;
10587                               int32_t imm = instr & 0xff;
10588                               imm <<= 2;
10589                               if (U == 0) imm = -imm;
10590                               bool minus_zero = (imm == 0) && (U == 0);
10591                               Label label(imm, kT32PcDelta, minus_zero);
10592                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10593                               ldrd(CurrentCond(),
10594                                    Register(rt),
10595                                    Register(rt2),
10596                                    &label);
10597                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
10598                                 UnpredictableT32(instr);
10599                               }
10600                               break;
10601                             }
10602                             default: {
10603                               if (((instr & 0xf0000) == 0xf0000)) {
10604                                 UnallocatedT32(instr);
10605                                 return;
10606                               }
10607                               unsigned rt = (instr >> 12) & 0xf;
10608                               unsigned rt2 = (instr >> 8) & 0xf;
10609                               unsigned rn = (instr >> 16) & 0xf;
10610                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10611                                                                      : plus);
10612                               int32_t offset = (instr & 0xff) << 2;
10613                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
10614                               ldrd(CurrentCond(),
10615                                    Register(rt),
10616                                    Register(rt2),
10617                                    MemOperand(Register(rn),
10618                                               sign,
10619                                               offset,
10620                                               PostIndex));
10621                               break;
10622                             }
10623                           }
10624                           break;
10625                         }
10626                         case 0x01000000: {
10627                           // 0xe9500000
10628                           switch (instr & 0x000f0000) {
10629                             case 0x000f0000: {
10630                               // 0xe95f0000
10631                               if (((instr & 0x1200000) == 0x0)) {
10632                                 UnallocatedT32(instr);
10633                                 return;
10634                               }
10635                               unsigned rt = (instr >> 12) & 0xf;
10636                               unsigned rt2 = (instr >> 8) & 0xf;
10637                               uint32_t U = (instr >> 23) & 0x1;
10638                               int32_t imm = instr & 0xff;
10639                               imm <<= 2;
10640                               if (U == 0) imm = -imm;
10641                               bool minus_zero = (imm == 0) && (U == 0);
10642                               Label label(imm, kT32PcDelta, minus_zero);
10643                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10644                               ldrd(CurrentCond(),
10645                                    Register(rt),
10646                                    Register(rt2),
10647                                    &label);
10648                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
10649                                 UnpredictableT32(instr);
10650                               }
10651                               break;
10652                             }
10653                             default: {
10654                               if (((instr & 0xf0000) == 0xf0000)) {
10655                                 UnallocatedT32(instr);
10656                                 return;
10657                               }
10658                               unsigned rt = (instr >> 12) & 0xf;
10659                               unsigned rt2 = (instr >> 8) & 0xf;
10660                               unsigned rn = (instr >> 16) & 0xf;
10661                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10662                                                                      : plus);
10663                               int32_t offset = (instr & 0xff) << 2;
10664                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
10665                               ldrd(CurrentCond(),
10666                                    Register(rt),
10667                                    Register(rt2),
10668                                    MemOperand(Register(rn),
10669                                               sign,
10670                                               offset,
10671                                               Offset));
10672                               break;
10673                             }
10674                           }
10675                           break;
10676                         }
10677                         case 0x01200000: {
10678                           // 0xe9700000
10679                           switch (instr & 0x000f0000) {
10680                             case 0x000f0000: {
10681                               // 0xe97f0000
10682                               if (((instr & 0x1200000) == 0x0)) {
10683                                 UnallocatedT32(instr);
10684                                 return;
10685                               }
10686                               unsigned rt = (instr >> 12) & 0xf;
10687                               unsigned rt2 = (instr >> 8) & 0xf;
10688                               uint32_t U = (instr >> 23) & 0x1;
10689                               int32_t imm = instr & 0xff;
10690                               imm <<= 2;
10691                               if (U == 0) imm = -imm;
10692                               bool minus_zero = (imm == 0) && (U == 0);
10693                               Label label(imm, kT32PcDelta, minus_zero);
10694                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
10695                               ldrd(CurrentCond(),
10696                                    Register(rt),
10697                                    Register(rt2),
10698                                    &label);
10699                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
10700                                 UnpredictableT32(instr);
10701                               }
10702                               break;
10703                             }
10704                             default: {
10705                               if (((instr & 0xf0000) == 0xf0000)) {
10706                                 UnallocatedT32(instr);
10707                                 return;
10708                               }
10709                               unsigned rt = (instr >> 12) & 0xf;
10710                               unsigned rt2 = (instr >> 8) & 0xf;
10711                               unsigned rn = (instr >> 16) & 0xf;
10712                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
10713                                                                      : plus);
10714                               int32_t offset = (instr & 0xff) << 2;
10715                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
10716                               ldrd(CurrentCond(),
10717                                    Register(rt),
10718                                    Register(rt2),
10719                                    MemOperand(Register(rn),
10720                                               sign,
10721                                               offset,
10722                                               PreIndex));
10723                               break;
10724                             }
10725                           }
10726                           break;
10727                         }
10728                       }
10729                       break;
10730                     }
10731                   }
10732                   break;
10733                 }
10734                 case 0x10000000: {
10735                   // 0xf8000000
10736                   switch (instr & 0x01a00000) {
10737                     case 0x00000000: {
10738                       // 0xf8000000
10739                       switch (instr & 0x00400d00) {
10740                         case 0x00000000: {
10741                           // 0xf8000000
10742                           if ((instr & 0x000002c0) == 0x00000000) {
10743                             if (((instr & 0xf0000) == 0xf0000)) {
10744                               UnallocatedT32(instr);
10745                               return;
10746                             }
10747                             unsigned rt = (instr >> 12) & 0xf;
10748                             unsigned rn = (instr >> 16) & 0xf;
10749                             Sign sign(plus);
10750                             unsigned rm = instr & 0xf;
10751                             Shift shift = LSL;
10752                             uint32_t amount = (instr >> 4) & 0x3;
10753                             AddrMode addrmode = Offset;
10754                             if ((rt < kNumberOfT32LowRegisters) &&
10755                                 (rn < kNumberOfT32LowRegisters) &&
10756                                 (rm < kNumberOfT32LowRegisters) &&
10757                                 shift.IsLSL() && (amount == 0) &&
10758                                 sign.IsPlus()) {
10759                               // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10760                               strb(CurrentCond(),
10761                                    Wide,
10762                                    Register(rt),
10763                                    MemOperand(Register(rn),
10764                                               sign,
10765                                               Register(rm),
10766                                               addrmode));
10767                             } else {
10768                               // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10769                               strb(CurrentCond(),
10770                                    Best,
10771                                    Register(rt),
10772                                    MemOperand(Register(rn),
10773                                               sign,
10774                                               Register(rm),
10775                                               shift,
10776                                               amount,
10777                                               addrmode));
10778                             }
10779                           } else {
10780                             UnallocatedT32(instr);
10781                           }
10782                           break;
10783                         }
10784                         case 0x00000900: {
10785                           // 0xf8000900
10786                           if (((instr & 0xf0000) == 0xf0000)) {
10787                             UnallocatedT32(instr);
10788                             return;
10789                           }
10790                           unsigned rt = (instr >> 12) & 0xf;
10791                           unsigned rn = (instr >> 16) & 0xf;
10792                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10793                           int32_t offset = instr & 0xff;
10794                           // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
10795                           strb(CurrentCond(),
10796                                Best,
10797                                Register(rt),
10798                                MemOperand(Register(rn),
10799                                           sign,
10800                                           offset,
10801                                           PostIndex));
10802                           break;
10803                         }
10804                         case 0x00000c00: {
10805                           // 0xf8000c00
10806                           switch (instr & 0x00000200) {
10807                             case 0x00000000: {
10808                               // 0xf8000c00
10809                               if (((instr & 0xf0000) == 0xf0000)) {
10810                                 UnallocatedT32(instr);
10811                                 return;
10812                               }
10813                               unsigned rt = (instr >> 12) & 0xf;
10814                               unsigned rn = (instr >> 16) & 0xf;
10815                               int32_t offset = instr & 0xff;
10816                               // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
10817                               strb(CurrentCond(),
10818                                    Best,
10819                                    Register(rt),
10820                                    MemOperand(Register(rn),
10821                                               minus,
10822                                               offset,
10823                                               Offset));
10824                               break;
10825                             }
10826                             case 0x00000200: {
10827                               // 0xf8000e00
10828                               if (((instr & 0xf0000) == 0xf0000)) {
10829                                 UnallocatedT32(instr);
10830                                 return;
10831                               }
10832                               UnimplementedT32_32("STRBT", instr);
10833                               break;
10834                             }
10835                           }
10836                           break;
10837                         }
10838                         case 0x00000d00: {
10839                           // 0xf8000d00
10840                           if (((instr & 0xf0000) == 0xf0000)) {
10841                             UnallocatedT32(instr);
10842                             return;
10843                           }
10844                           unsigned rt = (instr >> 12) & 0xf;
10845                           unsigned rn = (instr >> 16) & 0xf;
10846                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10847                           int32_t offset = instr & 0xff;
10848                           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
10849                           strb(CurrentCond(),
10850                                Best,
10851                                Register(rt),
10852                                MemOperand(Register(rn),
10853                                           sign,
10854                                           offset,
10855                                           PreIndex));
10856                           break;
10857                         }
10858                         case 0x00400000: {
10859                           // 0xf8400000
10860                           if ((instr & 0x000002c0) == 0x00000000) {
10861                             if (((instr & 0xf0000) == 0xf0000)) {
10862                               UnallocatedT32(instr);
10863                               return;
10864                             }
10865                             unsigned rt = (instr >> 12) & 0xf;
10866                             unsigned rn = (instr >> 16) & 0xf;
10867                             Sign sign(plus);
10868                             unsigned rm = instr & 0xf;
10869                             Shift shift = LSL;
10870                             uint32_t amount = (instr >> 4) & 0x3;
10871                             AddrMode addrmode = Offset;
10872                             if ((rt < kNumberOfT32LowRegisters) &&
10873                                 (rn < kNumberOfT32LowRegisters) &&
10874                                 (rm < kNumberOfT32LowRegisters) &&
10875                                 shift.IsLSL() && (amount == 0) &&
10876                                 sign.IsPlus()) {
10877                               // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
10878                               str(CurrentCond(),
10879                                   Wide,
10880                                   Register(rt),
10881                                   MemOperand(Register(rn),
10882                                              sign,
10883                                              Register(rm),
10884                                              addrmode));
10885                             } else {
10886                               // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
10887                               str(CurrentCond(),
10888                                   Best,
10889                                   Register(rt),
10890                                   MemOperand(Register(rn),
10891                                              sign,
10892                                              Register(rm),
10893                                              shift,
10894                                              amount,
10895                                              addrmode));
10896                             }
10897                           } else {
10898                             UnallocatedT32(instr);
10899                           }
10900                           break;
10901                         }
10902                         case 0x00400900: {
10903                           // 0xf8400900
10904                           if (((instr & 0xf0000) == 0xf0000)) {
10905                             UnallocatedT32(instr);
10906                             return;
10907                           }
10908                           unsigned rt = (instr >> 12) & 0xf;
10909                           unsigned rn = (instr >> 16) & 0xf;
10910                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10911                           int32_t offset = instr & 0xff;
10912                           // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
10913                           str(CurrentCond(),
10914                               Best,
10915                               Register(rt),
10916                               MemOperand(Register(rn),
10917                                          sign,
10918                                          offset,
10919                                          PostIndex));
10920                           break;
10921                         }
10922                         case 0x00400c00: {
10923                           // 0xf8400c00
10924                           switch (instr & 0x00000200) {
10925                             case 0x00000000: {
10926                               // 0xf8400c00
10927                               if (((instr & 0xf0000) == 0xf0000)) {
10928                                 UnallocatedT32(instr);
10929                                 return;
10930                               }
10931                               unsigned rt = (instr >> 12) & 0xf;
10932                               unsigned rn = (instr >> 16) & 0xf;
10933                               int32_t offset = instr & 0xff;
10934                               // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
10935                               str(CurrentCond(),
10936                                   Best,
10937                                   Register(rt),
10938                                   MemOperand(Register(rn),
10939                                              minus,
10940                                              offset,
10941                                              Offset));
10942                               break;
10943                             }
10944                             case 0x00000200: {
10945                               // 0xf8400e00
10946                               if (((instr & 0xf0000) == 0xf0000)) {
10947                                 UnallocatedT32(instr);
10948                                 return;
10949                               }
10950                               UnimplementedT32_32("STRT", instr);
10951                               break;
10952                             }
10953                           }
10954                           break;
10955                         }
10956                         case 0x00400d00: {
10957                           // 0xf8400d00
10958                           if (((instr & 0xf0000) == 0xf0000)) {
10959                             UnallocatedT32(instr);
10960                             return;
10961                           }
10962                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
10963                                Uint32(0xd)) &&
10964                               ((Uint32((instr >> 9)) & Uint32(0x1)) ==
10965                                Uint32(0x0)) &&
10966                               ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
10967                             unsigned rt = (instr >> 12) & 0xf;
10968                             if ((rt <= 7) || (rt == kLRRegNum)) {
10969                               // PUSH{<c>}.W <single_register_list> ; T4
10970                               push(CurrentCond(), Wide, Register(rt));
10971                             } else {
10972                               // PUSH{<c>}{<q>} <single_register_list> ; T4
10973                               push(CurrentCond(), Best, Register(rt));
10974                             }
10975                             return;
10976                           }
10977                           unsigned rt = (instr >> 12) & 0xf;
10978                           unsigned rn = (instr >> 16) & 0xf;
10979                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
10980                           int32_t offset = instr & 0xff;
10981                           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
10982                           str(CurrentCond(),
10983                               Best,
10984                               Register(rt),
10985                               MemOperand(Register(rn), sign, offset, PreIndex));
10986                           break;
10987                         }
10988                         default:
10989                           UnallocatedT32(instr);
10990                           break;
10991                       }
10992                       break;
10993                     }
10994                     case 0x00200000: {
10995                       // 0xf8200000
10996                       switch (instr & 0x00400d00) {
10997                         case 0x00000000: {
10998                           // 0xf8200000
10999                           if ((instr & 0x000002c0) == 0x00000000) {
11000                             if (((instr & 0xf0000) == 0xf0000)) {
11001                               UnallocatedT32(instr);
11002                               return;
11003                             }
11004                             unsigned rt = (instr >> 12) & 0xf;
11005                             unsigned rn = (instr >> 16) & 0xf;
11006                             Sign sign(plus);
11007                             unsigned rm = instr & 0xf;
11008                             Shift shift = LSL;
11009                             uint32_t amount = (instr >> 4) & 0x3;
11010                             AddrMode addrmode = Offset;
11011                             if ((rt < kNumberOfT32LowRegisters) &&
11012                                 (rn < kNumberOfT32LowRegisters) &&
11013                                 (rm < kNumberOfT32LowRegisters) &&
11014                                 shift.IsLSL() && (amount == 0) &&
11015                                 sign.IsPlus()) {
11016                               // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
11017                               strh(CurrentCond(),
11018                                    Wide,
11019                                    Register(rt),
11020                                    MemOperand(Register(rn),
11021                                               sign,
11022                                               Register(rm),
11023                                               addrmode));
11024                             } else {
11025                               // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
11026                               strh(CurrentCond(),
11027                                    Best,
11028                                    Register(rt),
11029                                    MemOperand(Register(rn),
11030                                               sign,
11031                                               Register(rm),
11032                                               shift,
11033                                               amount,
11034                                               addrmode));
11035                             }
11036                           } else {
11037                             UnallocatedT32(instr);
11038                           }
11039                           break;
11040                         }
11041                         case 0x00000900: {
11042                           // 0xf8200900
11043                           if (((instr & 0xf0000) == 0xf0000)) {
11044                             UnallocatedT32(instr);
11045                             return;
11046                           }
11047                           unsigned rt = (instr >> 12) & 0xf;
11048                           unsigned rn = (instr >> 16) & 0xf;
11049                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11050                           int32_t offset = instr & 0xff;
11051                           // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
11052                           strh(CurrentCond(),
11053                                Best,
11054                                Register(rt),
11055                                MemOperand(Register(rn),
11056                                           sign,
11057                                           offset,
11058                                           PostIndex));
11059                           break;
11060                         }
11061                         case 0x00000c00: {
11062                           // 0xf8200c00
11063                           switch (instr & 0x00000200) {
11064                             case 0x00000000: {
11065                               // 0xf8200c00
11066                               if (((instr & 0xf0000) == 0xf0000)) {
11067                                 UnallocatedT32(instr);
11068                                 return;
11069                               }
11070                               unsigned rt = (instr >> 12) & 0xf;
11071                               unsigned rn = (instr >> 16) & 0xf;
11072                               int32_t offset = instr & 0xff;
11073                               // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
11074                               strh(CurrentCond(),
11075                                    Best,
11076                                    Register(rt),
11077                                    MemOperand(Register(rn),
11078                                               minus,
11079                                               offset,
11080                                               Offset));
11081                               break;
11082                             }
11083                             case 0x00000200: {
11084                               // 0xf8200e00
11085                               if (((instr & 0xf0000) == 0xf0000)) {
11086                                 UnallocatedT32(instr);
11087                                 return;
11088                               }
11089                               UnimplementedT32_32("STRHT", instr);
11090                               break;
11091                             }
11092                           }
11093                           break;
11094                         }
11095                         case 0x00000d00: {
11096                           // 0xf8200d00
11097                           if (((instr & 0xf0000) == 0xf0000)) {
11098                             UnallocatedT32(instr);
11099                             return;
11100                           }
11101                           unsigned rt = (instr >> 12) & 0xf;
11102                           unsigned rn = (instr >> 16) & 0xf;
11103                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
11104                           int32_t offset = instr & 0xff;
11105                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
11106                           strh(CurrentCond(),
11107                                Best,
11108                                Register(rt),
11109                                MemOperand(Register(rn),
11110                                           sign,
11111                                           offset,
11112                                           PreIndex));
11113                           break;
11114                         }
11115                         default:
11116                           UnallocatedT32(instr);
11117                           break;
11118                       }
11119                       break;
11120                     }
11121                     case 0x00800000: {
11122                       // 0xf8800000
11123                       switch (instr & 0x00400000) {
11124                         case 0x00000000: {
11125                           // 0xf8800000
11126                           if (((instr & 0xf0000) == 0xf0000)) {
11127                             UnallocatedT32(instr);
11128                             return;
11129                           }
11130                           unsigned rt = (instr >> 12) & 0xf;
11131                           unsigned rn = (instr >> 16) & 0xf;
11132                           int32_t offset = instr & 0xfff;
11133                           if ((rt < kNumberOfT32LowRegisters) &&
11134                               (rn < kNumberOfT32LowRegisters) &&
11135                               ((offset >= 0) && (offset <= 31))) {
11136                             // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11137                             strb(CurrentCond(),
11138                                  Wide,
11139                                  Register(rt),
11140                                  MemOperand(Register(rn),
11141                                             plus,
11142                                             offset,
11143                                             Offset));
11144                           } else {
11145                             // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11146                             strb(CurrentCond(),
11147                                  Best,
11148                                  Register(rt),
11149                                  MemOperand(Register(rn),
11150                                             plus,
11151                                             offset,
11152                                             Offset));
11153                           }
11154                           break;
11155                         }
11156                         case 0x00400000: {
11157                           // 0xf8c00000
11158                           if (((instr & 0xf0000) == 0xf0000)) {
11159                             UnallocatedT32(instr);
11160                             return;
11161                           }
11162                           unsigned rt = (instr >> 12) & 0xf;
11163                           unsigned rn = (instr >> 16) & 0xf;
11164                           int32_t offset = instr & 0xfff;
11165                           if (((rt < kNumberOfT32LowRegisters) &&
11166                                (rn < kNumberOfT32LowRegisters) &&
11167                                ((offset >= 0) && (offset <= 124) &&
11168                                 ((offset & 3) == 0))) ||
11169                               ((rt < kNumberOfT32LowRegisters) &&
11170                                (rn == sp.GetCode()) &&
11171                                ((offset >= 0) && (offset <= 1020) &&
11172                                 ((offset & 3) == 0)))) {
11173                             // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11174                             str(CurrentCond(),
11175                                 Wide,
11176                                 Register(rt),
11177                                 MemOperand(Register(rn), plus, offset, Offset));
11178                           } else {
11179                             // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
11180                             str(CurrentCond(),
11181                                 Best,
11182                                 Register(rt),
11183                                 MemOperand(Register(rn), plus, offset, Offset));
11184                           }
11185                           break;
11186                         }
11187                       }
11188                       break;
11189                     }
11190                     case 0x00a00000: {
11191                       // 0xf8a00000
11192                       if ((instr & 0x00400000) == 0x00000000) {
11193                         if (((instr & 0xf0000) == 0xf0000)) {
11194                           UnallocatedT32(instr);
11195                           return;
11196                         }
11197                         unsigned rt = (instr >> 12) & 0xf;
11198                         unsigned rn = (instr >> 16) & 0xf;
11199                         int32_t offset = instr & 0xfff;
11200                         if ((rt < kNumberOfT32LowRegisters) &&
11201                             (rn < kNumberOfT32LowRegisters) &&
11202                             ((offset >= 0) && (offset <= 62) &&
11203                              ((offset & 1) == 0))) {
11204                           // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11205                           strh(CurrentCond(),
11206                                Wide,
11207                                Register(rt),
11208                                MemOperand(Register(rn), plus, offset, Offset));
11209                         } else {
11210                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
11211                           strh(CurrentCond(),
11212                                Best,
11213                                Register(rt),
11214                                MemOperand(Register(rn), plus, offset, Offset));
11215                         }
11216                       } else {
11217                         UnallocatedT32(instr);
11218                       }
11219                       break;
11220                     }
11221                     case 0x01000000: {
11222                       // 0xf9000000
11223                       switch (instr & 0x0000000d) {
11224                         case 0x0000000d: {
11225                           // 0xf900000d
11226                           switch (instr & 0x00000002) {
11227                             case 0x00000000: {
11228                               // 0xf900000d
11229                               switch (instr & 0x00000f00) {
11230                                 case 0x00000000: {
11231                                   // 0xf900000d
11232                                   DataType dt =
11233                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11234                                   if (dt.Is(kDataTypeValueInvalid)) {
11235                                     UnallocatedT32(instr);
11236                                     return;
11237                                   }
11238                                   Alignment align =
11239                                       Align_align_4_Decode((instr >> 4) & 0x3);
11240                                   if (dt.Is(kDataTypeValueInvalid) ||
11241                                       align.Is(kBadAlignment)) {
11242                                     UnallocatedT32(instr);
11243                                     return;
11244                                   }
11245                                   unsigned first =
11246                                       ExtractDRegister(instr, 22, 12);
11247                                   unsigned length;
11248                                   SpacingType spacing;
11249                                   switch ((instr >> 8) & 0xf) {
11250                                     default:
11251                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11252                                     case 0x0:
11253                                       length = 4;
11254                                       spacing = kSingle;
11255                                       break;
11256                                     case 0x1:
11257                                       length = 4;
11258                                       spacing = kDouble;
11259                                       break;
11260                                   }
11261                                   unsigned last =
11262                                       first +
11263                                       (length - 1) *
11264                                           (spacing == kSingle ? 1 : 2);
11265                                   TransferType transfer = kMultipleLanes;
11266                                   unsigned rn = (instr >> 16) & 0xf;
11267                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11268                                   vst4(CurrentCond(),
11269                                        dt,
11270                                        NeonRegisterList(DRegister(first),
11271                                                         DRegister(last),
11272                                                         spacing,
11273                                                         transfer),
11274                                        AlignedMemOperand(Register(rn),
11275                                                          align,
11276                                                          PostIndex));
11277                                   break;
11278                                 }
11279                                 case 0x00000100: {
11280                                   // 0xf900010d
11281                                   DataType dt =
11282                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11283                                   if (dt.Is(kDataTypeValueInvalid)) {
11284                                     UnallocatedT32(instr);
11285                                     return;
11286                                   }
11287                                   Alignment align =
11288                                       Align_align_4_Decode((instr >> 4) & 0x3);
11289                                   if (dt.Is(kDataTypeValueInvalid) ||
11290                                       align.Is(kBadAlignment)) {
11291                                     UnallocatedT32(instr);
11292                                     return;
11293                                   }
11294                                   unsigned first =
11295                                       ExtractDRegister(instr, 22, 12);
11296                                   unsigned length;
11297                                   SpacingType spacing;
11298                                   switch ((instr >> 8) & 0xf) {
11299                                     default:
11300                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11301                                     case 0x0:
11302                                       length = 4;
11303                                       spacing = kSingle;
11304                                       break;
11305                                     case 0x1:
11306                                       length = 4;
11307                                       spacing = kDouble;
11308                                       break;
11309                                   }
11310                                   unsigned last =
11311                                       first +
11312                                       (length - 1) *
11313                                           (spacing == kSingle ? 1 : 2);
11314                                   TransferType transfer = kMultipleLanes;
11315                                   unsigned rn = (instr >> 16) & 0xf;
11316                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11317                                   vst4(CurrentCond(),
11318                                        dt,
11319                                        NeonRegisterList(DRegister(first),
11320                                                         DRegister(last),
11321                                                         spacing,
11322                                                         transfer),
11323                                        AlignedMemOperand(Register(rn),
11324                                                          align,
11325                                                          PostIndex));
11326                                   break;
11327                                 }
11328                                 case 0x00000200: {
11329                                   // 0xf900020d
11330                                   if (((instr & 0xe20) == 0x620) ||
11331                                       ((instr & 0xf30) == 0xa30)) {
11332                                     UnallocatedT32(instr);
11333                                     return;
11334                                   }
11335                                   DataType dt =
11336                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11337                                   if (dt.Is(kDataTypeValueInvalid)) {
11338                                     UnallocatedT32(instr);
11339                                     return;
11340                                   }
11341                                   Alignment align =
11342                                       Align_align_5_Decode((instr >> 4) & 0x3);
11343                                   if (dt.Is(kDataTypeValueInvalid) ||
11344                                       align.Is(kBadAlignment)) {
11345                                     UnallocatedT32(instr);
11346                                     return;
11347                                   }
11348                                   unsigned first =
11349                                       ExtractDRegister(instr, 22, 12);
11350                                   unsigned length;
11351                                   SpacingType spacing = kSingle;
11352                                   switch ((instr >> 8) & 0xf) {
11353                                     default:
11354                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11355                                     case 0x7:
11356                                       length = 1;
11357                                       break;
11358                                     case 0xa:
11359                                       length = 2;
11360                                       break;
11361                                     case 0x6:
11362                                       length = 3;
11363                                       break;
11364                                     case 0x2:
11365                                       length = 4;
11366                                       break;
11367                                   }
11368                                   unsigned last = first + length - 1;
11369                                   TransferType transfer = kMultipleLanes;
11370                                   unsigned rn = (instr >> 16) & 0xf;
11371                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11372                                   vst1(CurrentCond(),
11373                                        dt,
11374                                        NeonRegisterList(DRegister(first),
11375                                                         DRegister(last),
11376                                                         spacing,
11377                                                         transfer),
11378                                        AlignedMemOperand(Register(rn),
11379                                                          align,
11380                                                          PostIndex));
11381                                   break;
11382                                 }
11383                                 case 0x00000300: {
11384                                   // 0xf900030d
11385                                   if (((instr & 0xe30) == 0x830)) {
11386                                     UnallocatedT32(instr);
11387                                     return;
11388                                   }
11389                                   DataType dt =
11390                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11391                                   if (dt.Is(kDataTypeValueInvalid)) {
11392                                     UnallocatedT32(instr);
11393                                     return;
11394                                   }
11395                                   Alignment align =
11396                                       Align_align_2_Decode((instr >> 4) & 0x3);
11397                                   if (dt.Is(kDataTypeValueInvalid) ||
11398                                       align.Is(kBadAlignment)) {
11399                                     UnallocatedT32(instr);
11400                                     return;
11401                                   }
11402                                   unsigned first =
11403                                       ExtractDRegister(instr, 22, 12);
11404                                   unsigned length;
11405                                   SpacingType spacing;
11406                                   switch ((instr >> 8) & 0xf) {
11407                                     default:
11408                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11409                                     case 0x8:
11410                                       length = 2;
11411                                       spacing = kSingle;
11412                                       break;
11413                                     case 0x9:
11414                                       length = 2;
11415                                       spacing = kDouble;
11416                                       break;
11417                                     case 0x3:
11418                                       length = 4;
11419                                       spacing = kSingle;
11420                                       break;
11421                                   }
11422                                   unsigned last =
11423                                       first +
11424                                       (length - 1) *
11425                                           (spacing == kSingle ? 1 : 2);
11426                                   TransferType transfer = kMultipleLanes;
11427                                   unsigned rn = (instr >> 16) & 0xf;
11428                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11429                                   vst2(CurrentCond(),
11430                                        dt,
11431                                        NeonRegisterList(DRegister(first),
11432                                                         DRegister(last),
11433                                                         spacing,
11434                                                         transfer),
11435                                        AlignedMemOperand(Register(rn),
11436                                                          align,
11437                                                          PostIndex));
11438                                   break;
11439                                 }
11440                                 case 0x00000400: {
11441                                   // 0xf900040d
11442                                   if (((instr & 0x20) == 0x20)) {
11443                                     UnallocatedT32(instr);
11444                                     return;
11445                                   }
11446                                   DataType dt =
11447                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11448                                   if (dt.Is(kDataTypeValueInvalid)) {
11449                                     UnallocatedT32(instr);
11450                                     return;
11451                                   }
11452                                   Alignment align =
11453                                       Align_align_3_Decode((instr >> 4) & 0x3);
11454                                   if (dt.Is(kDataTypeValueInvalid) ||
11455                                       align.Is(kBadAlignment)) {
11456                                     UnallocatedT32(instr);
11457                                     return;
11458                                   }
11459                                   unsigned first =
11460                                       ExtractDRegister(instr, 22, 12);
11461                                   unsigned length;
11462                                   SpacingType spacing;
11463                                   switch ((instr >> 8) & 0xf) {
11464                                     default:
11465                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11466                                     case 0x4:
11467                                       length = 3;
11468                                       spacing = kSingle;
11469                                       break;
11470                                     case 0x5:
11471                                       length = 3;
11472                                       spacing = kDouble;
11473                                       break;
11474                                   }
11475                                   unsigned last =
11476                                       first +
11477                                       (length - 1) *
11478                                           (spacing == kSingle ? 1 : 2);
11479                                   TransferType transfer = kMultipleLanes;
11480                                   unsigned rn = (instr >> 16) & 0xf;
11481                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11482                                   vst3(CurrentCond(),
11483                                        dt,
11484                                        NeonRegisterList(DRegister(first),
11485                                                         DRegister(last),
11486                                                         spacing,
11487                                                         transfer),
11488                                        AlignedMemOperand(Register(rn),
11489                                                          align,
11490                                                          PostIndex));
11491                                   break;
11492                                 }
11493                                 case 0x00000500: {
11494                                   // 0xf900050d
11495                                   if (((instr & 0x20) == 0x20)) {
11496                                     UnallocatedT32(instr);
11497                                     return;
11498                                   }
11499                                   DataType dt =
11500                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11501                                   if (dt.Is(kDataTypeValueInvalid)) {
11502                                     UnallocatedT32(instr);
11503                                     return;
11504                                   }
11505                                   Alignment align =
11506                                       Align_align_3_Decode((instr >> 4) & 0x3);
11507                                   if (dt.Is(kDataTypeValueInvalid) ||
11508                                       align.Is(kBadAlignment)) {
11509                                     UnallocatedT32(instr);
11510                                     return;
11511                                   }
11512                                   unsigned first =
11513                                       ExtractDRegister(instr, 22, 12);
11514                                   unsigned length;
11515                                   SpacingType spacing;
11516                                   switch ((instr >> 8) & 0xf) {
11517                                     default:
11518                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11519                                     case 0x4:
11520                                       length = 3;
11521                                       spacing = kSingle;
11522                                       break;
11523                                     case 0x5:
11524                                       length = 3;
11525                                       spacing = kDouble;
11526                                       break;
11527                                   }
11528                                   unsigned last =
11529                                       first +
11530                                       (length - 1) *
11531                                           (spacing == kSingle ? 1 : 2);
11532                                   TransferType transfer = kMultipleLanes;
11533                                   unsigned rn = (instr >> 16) & 0xf;
11534                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11535                                   vst3(CurrentCond(),
11536                                        dt,
11537                                        NeonRegisterList(DRegister(first),
11538                                                         DRegister(last),
11539                                                         spacing,
11540                                                         transfer),
11541                                        AlignedMemOperand(Register(rn),
11542                                                          align,
11543                                                          PostIndex));
11544                                   break;
11545                                 }
11546                                 case 0x00000600: {
11547                                   // 0xf900060d
11548                                   if (((instr & 0xe20) == 0x620) ||
11549                                       ((instr & 0xf30) == 0xa30)) {
11550                                     UnallocatedT32(instr);
11551                                     return;
11552                                   }
11553                                   DataType dt =
11554                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11555                                   if (dt.Is(kDataTypeValueInvalid)) {
11556                                     UnallocatedT32(instr);
11557                                     return;
11558                                   }
11559                                   Alignment align =
11560                                       Align_align_5_Decode((instr >> 4) & 0x3);
11561                                   if (dt.Is(kDataTypeValueInvalid) ||
11562                                       align.Is(kBadAlignment)) {
11563                                     UnallocatedT32(instr);
11564                                     return;
11565                                   }
11566                                   unsigned first =
11567                                       ExtractDRegister(instr, 22, 12);
11568                                   unsigned length;
11569                                   SpacingType spacing = kSingle;
11570                                   switch ((instr >> 8) & 0xf) {
11571                                     default:
11572                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11573                                     case 0x7:
11574                                       length = 1;
11575                                       break;
11576                                     case 0xa:
11577                                       length = 2;
11578                                       break;
11579                                     case 0x6:
11580                                       length = 3;
11581                                       break;
11582                                     case 0x2:
11583                                       length = 4;
11584                                       break;
11585                                   }
11586                                   unsigned last = first + length - 1;
11587                                   TransferType transfer = kMultipleLanes;
11588                                   unsigned rn = (instr >> 16) & 0xf;
11589                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11590                                   vst1(CurrentCond(),
11591                                        dt,
11592                                        NeonRegisterList(DRegister(first),
11593                                                         DRegister(last),
11594                                                         spacing,
11595                                                         transfer),
11596                                        AlignedMemOperand(Register(rn),
11597                                                          align,
11598                                                          PostIndex));
11599                                   break;
11600                                 }
11601                                 case 0x00000700: {
11602                                   // 0xf900070d
11603                                   if (((instr & 0xe20) == 0x620) ||
11604                                       ((instr & 0xf30) == 0xa30)) {
11605                                     UnallocatedT32(instr);
11606                                     return;
11607                                   }
11608                                   DataType dt =
11609                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11610                                   if (dt.Is(kDataTypeValueInvalid)) {
11611                                     UnallocatedT32(instr);
11612                                     return;
11613                                   }
11614                                   Alignment align =
11615                                       Align_align_5_Decode((instr >> 4) & 0x3);
11616                                   if (dt.Is(kDataTypeValueInvalid) ||
11617                                       align.Is(kBadAlignment)) {
11618                                     UnallocatedT32(instr);
11619                                     return;
11620                                   }
11621                                   unsigned first =
11622                                       ExtractDRegister(instr, 22, 12);
11623                                   unsigned length;
11624                                   SpacingType spacing = kSingle;
11625                                   switch ((instr >> 8) & 0xf) {
11626                                     default:
11627                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11628                                     case 0x7:
11629                                       length = 1;
11630                                       break;
11631                                     case 0xa:
11632                                       length = 2;
11633                                       break;
11634                                     case 0x6:
11635                                       length = 3;
11636                                       break;
11637                                     case 0x2:
11638                                       length = 4;
11639                                       break;
11640                                   }
11641                                   unsigned last = first + length - 1;
11642                                   TransferType transfer = kMultipleLanes;
11643                                   unsigned rn = (instr >> 16) & 0xf;
11644                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11645                                   vst1(CurrentCond(),
11646                                        dt,
11647                                        NeonRegisterList(DRegister(first),
11648                                                         DRegister(last),
11649                                                         spacing,
11650                                                         transfer),
11651                                        AlignedMemOperand(Register(rn),
11652                                                          align,
11653                                                          PostIndex));
11654                                   break;
11655                                 }
11656                                 case 0x00000800: {
11657                                   // 0xf900080d
11658                                   if (((instr & 0xe30) == 0x830)) {
11659                                     UnallocatedT32(instr);
11660                                     return;
11661                                   }
11662                                   DataType dt =
11663                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11664                                   if (dt.Is(kDataTypeValueInvalid)) {
11665                                     UnallocatedT32(instr);
11666                                     return;
11667                                   }
11668                                   Alignment align =
11669                                       Align_align_2_Decode((instr >> 4) & 0x3);
11670                                   if (dt.Is(kDataTypeValueInvalid) ||
11671                                       align.Is(kBadAlignment)) {
11672                                     UnallocatedT32(instr);
11673                                     return;
11674                                   }
11675                                   unsigned first =
11676                                       ExtractDRegister(instr, 22, 12);
11677                                   unsigned length;
11678                                   SpacingType spacing;
11679                                   switch ((instr >> 8) & 0xf) {
11680                                     default:
11681                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11682                                     case 0x8:
11683                                       length = 2;
11684                                       spacing = kSingle;
11685                                       break;
11686                                     case 0x9:
11687                                       length = 2;
11688                                       spacing = kDouble;
11689                                       break;
11690                                     case 0x3:
11691                                       length = 4;
11692                                       spacing = kSingle;
11693                                       break;
11694                                   }
11695                                   unsigned last =
11696                                       first +
11697                                       (length - 1) *
11698                                           (spacing == kSingle ? 1 : 2);
11699                                   TransferType transfer = kMultipleLanes;
11700                                   unsigned rn = (instr >> 16) & 0xf;
11701                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11702                                   vst2(CurrentCond(),
11703                                        dt,
11704                                        NeonRegisterList(DRegister(first),
11705                                                         DRegister(last),
11706                                                         spacing,
11707                                                         transfer),
11708                                        AlignedMemOperand(Register(rn),
11709                                                          align,
11710                                                          PostIndex));
11711                                   break;
11712                                 }
11713                                 case 0x00000900: {
11714                                   // 0xf900090d
11715                                   if (((instr & 0xe30) == 0x830)) {
11716                                     UnallocatedT32(instr);
11717                                     return;
11718                                   }
11719                                   DataType dt =
11720                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11721                                   if (dt.Is(kDataTypeValueInvalid)) {
11722                                     UnallocatedT32(instr);
11723                                     return;
11724                                   }
11725                                   Alignment align =
11726                                       Align_align_2_Decode((instr >> 4) & 0x3);
11727                                   if (dt.Is(kDataTypeValueInvalid) ||
11728                                       align.Is(kBadAlignment)) {
11729                                     UnallocatedT32(instr);
11730                                     return;
11731                                   }
11732                                   unsigned first =
11733                                       ExtractDRegister(instr, 22, 12);
11734                                   unsigned length;
11735                                   SpacingType spacing;
11736                                   switch ((instr >> 8) & 0xf) {
11737                                     default:
11738                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11739                                     case 0x8:
11740                                       length = 2;
11741                                       spacing = kSingle;
11742                                       break;
11743                                     case 0x9:
11744                                       length = 2;
11745                                       spacing = kDouble;
11746                                       break;
11747                                     case 0x3:
11748                                       length = 4;
11749                                       spacing = kSingle;
11750                                       break;
11751                                   }
11752                                   unsigned last =
11753                                       first +
11754                                       (length - 1) *
11755                                           (spacing == kSingle ? 1 : 2);
11756                                   TransferType transfer = kMultipleLanes;
11757                                   unsigned rn = (instr >> 16) & 0xf;
11758                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11759                                   vst2(CurrentCond(),
11760                                        dt,
11761                                        NeonRegisterList(DRegister(first),
11762                                                         DRegister(last),
11763                                                         spacing,
11764                                                         transfer),
11765                                        AlignedMemOperand(Register(rn),
11766                                                          align,
11767                                                          PostIndex));
11768                                   break;
11769                                 }
11770                                 case 0x00000a00: {
11771                                   // 0xf9000a0d
11772                                   if (((instr & 0xe20) == 0x620) ||
11773                                       ((instr & 0xf30) == 0xa30)) {
11774                                     UnallocatedT32(instr);
11775                                     return;
11776                                   }
11777                                   DataType dt =
11778                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11779                                   if (dt.Is(kDataTypeValueInvalid)) {
11780                                     UnallocatedT32(instr);
11781                                     return;
11782                                   }
11783                                   Alignment align =
11784                                       Align_align_5_Decode((instr >> 4) & 0x3);
11785                                   if (dt.Is(kDataTypeValueInvalid) ||
11786                                       align.Is(kBadAlignment)) {
11787                                     UnallocatedT32(instr);
11788                                     return;
11789                                   }
11790                                   unsigned first =
11791                                       ExtractDRegister(instr, 22, 12);
11792                                   unsigned length;
11793                                   SpacingType spacing = kSingle;
11794                                   switch ((instr >> 8) & 0xf) {
11795                                     default:
11796                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11797                                     case 0x7:
11798                                       length = 1;
11799                                       break;
11800                                     case 0xa:
11801                                       length = 2;
11802                                       break;
11803                                     case 0x6:
11804                                       length = 3;
11805                                       break;
11806                                     case 0x2:
11807                                       length = 4;
11808                                       break;
11809                                   }
11810                                   unsigned last = first + length - 1;
11811                                   TransferType transfer = kMultipleLanes;
11812                                   unsigned rn = (instr >> 16) & 0xf;
11813                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
11814                                   vst1(CurrentCond(),
11815                                        dt,
11816                                        NeonRegisterList(DRegister(first),
11817                                                         DRegister(last),
11818                                                         spacing,
11819                                                         transfer),
11820                                        AlignedMemOperand(Register(rn),
11821                                                          align,
11822                                                          PostIndex));
11823                                   break;
11824                                 }
11825                                 default:
11826                                   UnallocatedT32(instr);
11827                                   break;
11828                               }
11829                               break;
11830                             }
11831                             case 0x00000002: {
11832                               // 0xf900000f
11833                               switch (instr & 0x00000f00) {
11834                                 case 0x00000000: {
11835                                   // 0xf900000d
11836                                   DataType dt =
11837                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11838                                   if (dt.Is(kDataTypeValueInvalid)) {
11839                                     UnallocatedT32(instr);
11840                                     return;
11841                                   }
11842                                   Alignment align =
11843                                       Align_align_4_Decode((instr >> 4) & 0x3);
11844                                   if (dt.Is(kDataTypeValueInvalid) ||
11845                                       align.Is(kBadAlignment)) {
11846                                     UnallocatedT32(instr);
11847                                     return;
11848                                   }
11849                                   unsigned first =
11850                                       ExtractDRegister(instr, 22, 12);
11851                                   unsigned length;
11852                                   SpacingType spacing;
11853                                   switch ((instr >> 8) & 0xf) {
11854                                     default:
11855                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11856                                     case 0x0:
11857                                       length = 4;
11858                                       spacing = kSingle;
11859                                       break;
11860                                     case 0x1:
11861                                       length = 4;
11862                                       spacing = kDouble;
11863                                       break;
11864                                   }
11865                                   unsigned last =
11866                                       first +
11867                                       (length - 1) *
11868                                           (spacing == kSingle ? 1 : 2);
11869                                   TransferType transfer = kMultipleLanes;
11870                                   unsigned rn = (instr >> 16) & 0xf;
11871                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11872                                   vst4(CurrentCond(),
11873                                        dt,
11874                                        NeonRegisterList(DRegister(first),
11875                                                         DRegister(last),
11876                                                         spacing,
11877                                                         transfer),
11878                                        AlignedMemOperand(Register(rn),
11879                                                          align,
11880                                                          Offset));
11881                                   break;
11882                                 }
11883                                 case 0x00000100: {
11884                                   // 0xf900010d
11885                                   DataType dt =
11886                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11887                                   if (dt.Is(kDataTypeValueInvalid)) {
11888                                     UnallocatedT32(instr);
11889                                     return;
11890                                   }
11891                                   Alignment align =
11892                                       Align_align_4_Decode((instr >> 4) & 0x3);
11893                                   if (dt.Is(kDataTypeValueInvalid) ||
11894                                       align.Is(kBadAlignment)) {
11895                                     UnallocatedT32(instr);
11896                                     return;
11897                                   }
11898                                   unsigned first =
11899                                       ExtractDRegister(instr, 22, 12);
11900                                   unsigned length;
11901                                   SpacingType spacing;
11902                                   switch ((instr >> 8) & 0xf) {
11903                                     default:
11904                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11905                                     case 0x0:
11906                                       length = 4;
11907                                       spacing = kSingle;
11908                                       break;
11909                                     case 0x1:
11910                                       length = 4;
11911                                       spacing = kDouble;
11912                                       break;
11913                                   }
11914                                   unsigned last =
11915                                       first +
11916                                       (length - 1) *
11917                                           (spacing == kSingle ? 1 : 2);
11918                                   TransferType transfer = kMultipleLanes;
11919                                   unsigned rn = (instr >> 16) & 0xf;
11920                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11921                                   vst4(CurrentCond(),
11922                                        dt,
11923                                        NeonRegisterList(DRegister(first),
11924                                                         DRegister(last),
11925                                                         spacing,
11926                                                         transfer),
11927                                        AlignedMemOperand(Register(rn),
11928                                                          align,
11929                                                          Offset));
11930                                   break;
11931                                 }
11932                                 case 0x00000200: {
11933                                   // 0xf900020d
11934                                   if (((instr & 0xe20) == 0x620) ||
11935                                       ((instr & 0xf30) == 0xa30)) {
11936                                     UnallocatedT32(instr);
11937                                     return;
11938                                   }
11939                                   DataType dt =
11940                                       Dt_size_6_Decode((instr >> 6) & 0x3);
11941                                   if (dt.Is(kDataTypeValueInvalid)) {
11942                                     UnallocatedT32(instr);
11943                                     return;
11944                                   }
11945                                   Alignment align =
11946                                       Align_align_5_Decode((instr >> 4) & 0x3);
11947                                   if (dt.Is(kDataTypeValueInvalid) ||
11948                                       align.Is(kBadAlignment)) {
11949                                     UnallocatedT32(instr);
11950                                     return;
11951                                   }
11952                                   unsigned first =
11953                                       ExtractDRegister(instr, 22, 12);
11954                                   unsigned length;
11955                                   SpacingType spacing = kSingle;
11956                                   switch ((instr >> 8) & 0xf) {
11957                                     default:
11958                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
11959                                     case 0x7:
11960                                       length = 1;
11961                                       break;
11962                                     case 0xa:
11963                                       length = 2;
11964                                       break;
11965                                     case 0x6:
11966                                       length = 3;
11967                                       break;
11968                                     case 0x2:
11969                                       length = 4;
11970                                       break;
11971                                   }
11972                                   unsigned last = first + length - 1;
11973                                   TransferType transfer = kMultipleLanes;
11974                                   unsigned rn = (instr >> 16) & 0xf;
11975                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
11976                                   vst1(CurrentCond(),
11977                                        dt,
11978                                        NeonRegisterList(DRegister(first),
11979                                                         DRegister(last),
11980                                                         spacing,
11981                                                         transfer),
11982                                        AlignedMemOperand(Register(rn),
11983                                                          align,
11984                                                          Offset));
11985                                   break;
11986                                 }
11987                                 case 0x00000300: {
11988                                   // 0xf900030d
11989                                   if (((instr & 0xe30) == 0x830)) {
11990                                     UnallocatedT32(instr);
11991                                     return;
11992                                   }
11993                                   DataType dt =
11994                                       Dt_size_7_Decode((instr >> 6) & 0x3);
11995                                   if (dt.Is(kDataTypeValueInvalid)) {
11996                                     UnallocatedT32(instr);
11997                                     return;
11998                                   }
11999                                   Alignment align =
12000                                       Align_align_2_Decode((instr >> 4) & 0x3);
12001                                   if (dt.Is(kDataTypeValueInvalid) ||
12002                                       align.Is(kBadAlignment)) {
12003                                     UnallocatedT32(instr);
12004                                     return;
12005                                   }
12006                                   unsigned first =
12007                                       ExtractDRegister(instr, 22, 12);
12008                                   unsigned length;
12009                                   SpacingType spacing;
12010                                   switch ((instr >> 8) & 0xf) {
12011                                     default:
12012                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12013                                     case 0x8:
12014                                       length = 2;
12015                                       spacing = kSingle;
12016                                       break;
12017                                     case 0x9:
12018                                       length = 2;
12019                                       spacing = kDouble;
12020                                       break;
12021                                     case 0x3:
12022                                       length = 4;
12023                                       spacing = kSingle;
12024                                       break;
12025                                   }
12026                                   unsigned last =
12027                                       first +
12028                                       (length - 1) *
12029                                           (spacing == kSingle ? 1 : 2);
12030                                   TransferType transfer = kMultipleLanes;
12031                                   unsigned rn = (instr >> 16) & 0xf;
12032                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12033                                   vst2(CurrentCond(),
12034                                        dt,
12035                                        NeonRegisterList(DRegister(first),
12036                                                         DRegister(last),
12037                                                         spacing,
12038                                                         transfer),
12039                                        AlignedMemOperand(Register(rn),
12040                                                          align,
12041                                                          Offset));
12042                                   break;
12043                                 }
12044                                 case 0x00000400: {
12045                                   // 0xf900040d
12046                                   if (((instr & 0x20) == 0x20)) {
12047                                     UnallocatedT32(instr);
12048                                     return;
12049                                   }
12050                                   DataType dt =
12051                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12052                                   if (dt.Is(kDataTypeValueInvalid)) {
12053                                     UnallocatedT32(instr);
12054                                     return;
12055                                   }
12056                                   Alignment align =
12057                                       Align_align_3_Decode((instr >> 4) & 0x3);
12058                                   if (dt.Is(kDataTypeValueInvalid) ||
12059                                       align.Is(kBadAlignment)) {
12060                                     UnallocatedT32(instr);
12061                                     return;
12062                                   }
12063                                   unsigned first =
12064                                       ExtractDRegister(instr, 22, 12);
12065                                   unsigned length;
12066                                   SpacingType spacing;
12067                                   switch ((instr >> 8) & 0xf) {
12068                                     default:
12069                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12070                                     case 0x4:
12071                                       length = 3;
12072                                       spacing = kSingle;
12073                                       break;
12074                                     case 0x5:
12075                                       length = 3;
12076                                       spacing = kDouble;
12077                                       break;
12078                                   }
12079                                   unsigned last =
12080                                       first +
12081                                       (length - 1) *
12082                                           (spacing == kSingle ? 1 : 2);
12083                                   TransferType transfer = kMultipleLanes;
12084                                   unsigned rn = (instr >> 16) & 0xf;
12085                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12086                                   vst3(CurrentCond(),
12087                                        dt,
12088                                        NeonRegisterList(DRegister(first),
12089                                                         DRegister(last),
12090                                                         spacing,
12091                                                         transfer),
12092                                        AlignedMemOperand(Register(rn),
12093                                                          align,
12094                                                          Offset));
12095                                   break;
12096                                 }
12097                                 case 0x00000500: {
12098                                   // 0xf900050d
12099                                   if (((instr & 0x20) == 0x20)) {
12100                                     UnallocatedT32(instr);
12101                                     return;
12102                                   }
12103                                   DataType dt =
12104                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12105                                   if (dt.Is(kDataTypeValueInvalid)) {
12106                                     UnallocatedT32(instr);
12107                                     return;
12108                                   }
12109                                   Alignment align =
12110                                       Align_align_3_Decode((instr >> 4) & 0x3);
12111                                   if (dt.Is(kDataTypeValueInvalid) ||
12112                                       align.Is(kBadAlignment)) {
12113                                     UnallocatedT32(instr);
12114                                     return;
12115                                   }
12116                                   unsigned first =
12117                                       ExtractDRegister(instr, 22, 12);
12118                                   unsigned length;
12119                                   SpacingType spacing;
12120                                   switch ((instr >> 8) & 0xf) {
12121                                     default:
12122                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12123                                     case 0x4:
12124                                       length = 3;
12125                                       spacing = kSingle;
12126                                       break;
12127                                     case 0x5:
12128                                       length = 3;
12129                                       spacing = kDouble;
12130                                       break;
12131                                   }
12132                                   unsigned last =
12133                                       first +
12134                                       (length - 1) *
12135                                           (spacing == kSingle ? 1 : 2);
12136                                   TransferType transfer = kMultipleLanes;
12137                                   unsigned rn = (instr >> 16) & 0xf;
12138                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12139                                   vst3(CurrentCond(),
12140                                        dt,
12141                                        NeonRegisterList(DRegister(first),
12142                                                         DRegister(last),
12143                                                         spacing,
12144                                                         transfer),
12145                                        AlignedMemOperand(Register(rn),
12146                                                          align,
12147                                                          Offset));
12148                                   break;
12149                                 }
12150                                 case 0x00000600: {
12151                                   // 0xf900060d
12152                                   if (((instr & 0xe20) == 0x620) ||
12153                                       ((instr & 0xf30) == 0xa30)) {
12154                                     UnallocatedT32(instr);
12155                                     return;
12156                                   }
12157                                   DataType dt =
12158                                       Dt_size_6_Decode((instr >> 6) & 0x3);
12159                                   if (dt.Is(kDataTypeValueInvalid)) {
12160                                     UnallocatedT32(instr);
12161                                     return;
12162                                   }
12163                                   Alignment align =
12164                                       Align_align_5_Decode((instr >> 4) & 0x3);
12165                                   if (dt.Is(kDataTypeValueInvalid) ||
12166                                       align.Is(kBadAlignment)) {
12167                                     UnallocatedT32(instr);
12168                                     return;
12169                                   }
12170                                   unsigned first =
12171                                       ExtractDRegister(instr, 22, 12);
12172                                   unsigned length;
12173                                   SpacingType spacing = kSingle;
12174                                   switch ((instr >> 8) & 0xf) {
12175                                     default:
12176                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12177                                     case 0x7:
12178                                       length = 1;
12179                                       break;
12180                                     case 0xa:
12181                                       length = 2;
12182                                       break;
12183                                     case 0x6:
12184                                       length = 3;
12185                                       break;
12186                                     case 0x2:
12187                                       length = 4;
12188                                       break;
12189                                   }
12190                                   unsigned last = first + length - 1;
12191                                   TransferType transfer = kMultipleLanes;
12192                                   unsigned rn = (instr >> 16) & 0xf;
12193                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12194                                   vst1(CurrentCond(),
12195                                        dt,
12196                                        NeonRegisterList(DRegister(first),
12197                                                         DRegister(last),
12198                                                         spacing,
12199                                                         transfer),
12200                                        AlignedMemOperand(Register(rn),
12201                                                          align,
12202                                                          Offset));
12203                                   break;
12204                                 }
12205                                 case 0x00000700: {
12206                                   // 0xf900070d
12207                                   if (((instr & 0xe20) == 0x620) ||
12208                                       ((instr & 0xf30) == 0xa30)) {
12209                                     UnallocatedT32(instr);
12210                                     return;
12211                                   }
12212                                   DataType dt =
12213                                       Dt_size_6_Decode((instr >> 6) & 0x3);
12214                                   if (dt.Is(kDataTypeValueInvalid)) {
12215                                     UnallocatedT32(instr);
12216                                     return;
12217                                   }
12218                                   Alignment align =
12219                                       Align_align_5_Decode((instr >> 4) & 0x3);
12220                                   if (dt.Is(kDataTypeValueInvalid) ||
12221                                       align.Is(kBadAlignment)) {
12222                                     UnallocatedT32(instr);
12223                                     return;
12224                                   }
12225                                   unsigned first =
12226                                       ExtractDRegister(instr, 22, 12);
12227                                   unsigned length;
12228                                   SpacingType spacing = kSingle;
12229                                   switch ((instr >> 8) & 0xf) {
12230                                     default:
12231                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12232                                     case 0x7:
12233                                       length = 1;
12234                                       break;
12235                                     case 0xa:
12236                                       length = 2;
12237                                       break;
12238                                     case 0x6:
12239                                       length = 3;
12240                                       break;
12241                                     case 0x2:
12242                                       length = 4;
12243                                       break;
12244                                   }
12245                                   unsigned last = first + length - 1;
12246                                   TransferType transfer = kMultipleLanes;
12247                                   unsigned rn = (instr >> 16) & 0xf;
12248                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12249                                   vst1(CurrentCond(),
12250                                        dt,
12251                                        NeonRegisterList(DRegister(first),
12252                                                         DRegister(last),
12253                                                         spacing,
12254                                                         transfer),
12255                                        AlignedMemOperand(Register(rn),
12256                                                          align,
12257                                                          Offset));
12258                                   break;
12259                                 }
12260                                 case 0x00000800: {
12261                                   // 0xf900080d
12262                                   if (((instr & 0xe30) == 0x830)) {
12263                                     UnallocatedT32(instr);
12264                                     return;
12265                                   }
12266                                   DataType dt =
12267                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12268                                   if (dt.Is(kDataTypeValueInvalid)) {
12269                                     UnallocatedT32(instr);
12270                                     return;
12271                                   }
12272                                   Alignment align =
12273                                       Align_align_2_Decode((instr >> 4) & 0x3);
12274                                   if (dt.Is(kDataTypeValueInvalid) ||
12275                                       align.Is(kBadAlignment)) {
12276                                     UnallocatedT32(instr);
12277                                     return;
12278                                   }
12279                                   unsigned first =
12280                                       ExtractDRegister(instr, 22, 12);
12281                                   unsigned length;
12282                                   SpacingType spacing;
12283                                   switch ((instr >> 8) & 0xf) {
12284                                     default:
12285                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12286                                     case 0x8:
12287                                       length = 2;
12288                                       spacing = kSingle;
12289                                       break;
12290                                     case 0x9:
12291                                       length = 2;
12292                                       spacing = kDouble;
12293                                       break;
12294                                     case 0x3:
12295                                       length = 4;
12296                                       spacing = kSingle;
12297                                       break;
12298                                   }
12299                                   unsigned last =
12300                                       first +
12301                                       (length - 1) *
12302                                           (spacing == kSingle ? 1 : 2);
12303                                   TransferType transfer = kMultipleLanes;
12304                                   unsigned rn = (instr >> 16) & 0xf;
12305                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12306                                   vst2(CurrentCond(),
12307                                        dt,
12308                                        NeonRegisterList(DRegister(first),
12309                                                         DRegister(last),
12310                                                         spacing,
12311                                                         transfer),
12312                                        AlignedMemOperand(Register(rn),
12313                                                          align,
12314                                                          Offset));
12315                                   break;
12316                                 }
12317                                 case 0x00000900: {
12318                                   // 0xf900090d
12319                                   if (((instr & 0xe30) == 0x830)) {
12320                                     UnallocatedT32(instr);
12321                                     return;
12322                                   }
12323                                   DataType dt =
12324                                       Dt_size_7_Decode((instr >> 6) & 0x3);
12325                                   if (dt.Is(kDataTypeValueInvalid)) {
12326                                     UnallocatedT32(instr);
12327                                     return;
12328                                   }
12329                                   Alignment align =
12330                                       Align_align_2_Decode((instr >> 4) & 0x3);
12331                                   if (dt.Is(kDataTypeValueInvalid) ||
12332                                       align.Is(kBadAlignment)) {
12333                                     UnallocatedT32(instr);
12334                                     return;
12335                                   }
12336                                   unsigned first =
12337                                       ExtractDRegister(instr, 22, 12);
12338                                   unsigned length;
12339                                   SpacingType spacing;
12340                                   switch ((instr >> 8) & 0xf) {
12341                                     default:
12342                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12343                                     case 0x8:
12344                                       length = 2;
12345                                       spacing = kSingle;
12346                                       break;
12347                                     case 0x9:
12348                                       length = 2;
12349                                       spacing = kDouble;
12350                                       break;
12351                                     case 0x3:
12352                                       length = 4;
12353                                       spacing = kSingle;
12354                                       break;
12355                                   }
12356                                   unsigned last =
12357                                       first +
12358                                       (length - 1) *
12359                                           (spacing == kSingle ? 1 : 2);
12360                                   TransferType transfer = kMultipleLanes;
12361                                   unsigned rn = (instr >> 16) & 0xf;
12362                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12363                                   vst2(CurrentCond(),
12364                                        dt,
12365                                        NeonRegisterList(DRegister(first),
12366                                                         DRegister(last),
12367                                                         spacing,
12368                                                         transfer),
12369                                        AlignedMemOperand(Register(rn),
12370                                                          align,
12371                                                          Offset));
12372                                   break;
12373                                 }
12374                                 case 0x00000a00: {
12375                                   // 0xf9000a0d
12376                                   if (((instr & 0xe20) == 0x620) ||
12377                                       ((instr & 0xf30) == 0xa30)) {
12378                                     UnallocatedT32(instr);
12379                                     return;
12380                                   }
12381                                   DataType dt =
12382                                       Dt_size_6_Decode((instr >> 6) & 0x3);
12383                                   if (dt.Is(kDataTypeValueInvalid)) {
12384                                     UnallocatedT32(instr);
12385                                     return;
12386                                   }
12387                                   Alignment align =
12388                                       Align_align_5_Decode((instr >> 4) & 0x3);
12389                                   if (dt.Is(kDataTypeValueInvalid) ||
12390                                       align.Is(kBadAlignment)) {
12391                                     UnallocatedT32(instr);
12392                                     return;
12393                                   }
12394                                   unsigned first =
12395                                       ExtractDRegister(instr, 22, 12);
12396                                   unsigned length;
12397                                   SpacingType spacing = kSingle;
12398                                   switch ((instr >> 8) & 0xf) {
12399                                     default:
12400                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
12401                                     case 0x7:
12402                                       length = 1;
12403                                       break;
12404                                     case 0xa:
12405                                       length = 2;
12406                                       break;
12407                                     case 0x6:
12408                                       length = 3;
12409                                       break;
12410                                     case 0x2:
12411                                       length = 4;
12412                                       break;
12413                                   }
12414                                   unsigned last = first + length - 1;
12415                                   TransferType transfer = kMultipleLanes;
12416                                   unsigned rn = (instr >> 16) & 0xf;
12417                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
12418                                   vst1(CurrentCond(),
12419                                        dt,
12420                                        NeonRegisterList(DRegister(first),
12421                                                         DRegister(last),
12422                                                         spacing,
12423                                                         transfer),
12424                                        AlignedMemOperand(Register(rn),
12425                                                          align,
12426                                                          Offset));
12427                                   break;
12428                                 }
12429                                 default:
12430                                   UnallocatedT32(instr);
12431                                   break;
12432                               }
12433                               break;
12434                             }
12435                           }
12436                           break;
12437                         }
12438                         default: {
12439                           switch (instr & 0x00000f00) {
12440                             case 0x00000000: {
12441                               // 0xf9000000
12442                               if (((instr & 0xd) == 0xd)) {
12443                                 UnallocatedT32(instr);
12444                                 return;
12445                               }
12446                               DataType dt =
12447                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12448                               if (dt.Is(kDataTypeValueInvalid)) {
12449                                 UnallocatedT32(instr);
12450                                 return;
12451                               }
12452                               Alignment align =
12453                                   Align_align_4_Decode((instr >> 4) & 0x3);
12454                               if (dt.Is(kDataTypeValueInvalid) ||
12455                                   align.Is(kBadAlignment)) {
12456                                 UnallocatedT32(instr);
12457                                 return;
12458                               }
12459                               unsigned first = ExtractDRegister(instr, 22, 12);
12460                               unsigned length;
12461                               SpacingType spacing;
12462                               switch ((instr >> 8) & 0xf) {
12463                                 default:
12464                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12465                                 case 0x0:
12466                                   length = 4;
12467                                   spacing = kSingle;
12468                                   break;
12469                                 case 0x1:
12470                                   length = 4;
12471                                   spacing = kDouble;
12472                                   break;
12473                               }
12474                               unsigned last =
12475                                   first +
12476                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12477                               TransferType transfer = kMultipleLanes;
12478                               unsigned rn = (instr >> 16) & 0xf;
12479                               unsigned rm = instr & 0xf;
12480                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12481                               vst4(CurrentCond(),
12482                                    dt,
12483                                    NeonRegisterList(DRegister(first),
12484                                                     DRegister(last),
12485                                                     spacing,
12486                                                     transfer),
12487                                    AlignedMemOperand(Register(rn),
12488                                                      align,
12489                                                      Register(rm),
12490                                                      PostIndex));
12491                               break;
12492                             }
12493                             case 0x00000100: {
12494                               // 0xf9000100
12495                               if (((instr & 0xd) == 0xd)) {
12496                                 UnallocatedT32(instr);
12497                                 return;
12498                               }
12499                               DataType dt =
12500                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12501                               if (dt.Is(kDataTypeValueInvalid)) {
12502                                 UnallocatedT32(instr);
12503                                 return;
12504                               }
12505                               Alignment align =
12506                                   Align_align_4_Decode((instr >> 4) & 0x3);
12507                               if (dt.Is(kDataTypeValueInvalid) ||
12508                                   align.Is(kBadAlignment)) {
12509                                 UnallocatedT32(instr);
12510                                 return;
12511                               }
12512                               unsigned first = ExtractDRegister(instr, 22, 12);
12513                               unsigned length;
12514                               SpacingType spacing;
12515                               switch ((instr >> 8) & 0xf) {
12516                                 default:
12517                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12518                                 case 0x0:
12519                                   length = 4;
12520                                   spacing = kSingle;
12521                                   break;
12522                                 case 0x1:
12523                                   length = 4;
12524                                   spacing = kDouble;
12525                                   break;
12526                               }
12527                               unsigned last =
12528                                   first +
12529                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12530                               TransferType transfer = kMultipleLanes;
12531                               unsigned rn = (instr >> 16) & 0xf;
12532                               unsigned rm = instr & 0xf;
12533                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12534                               vst4(CurrentCond(),
12535                                    dt,
12536                                    NeonRegisterList(DRegister(first),
12537                                                     DRegister(last),
12538                                                     spacing,
12539                                                     transfer),
12540                                    AlignedMemOperand(Register(rn),
12541                                                      align,
12542                                                      Register(rm),
12543                                                      PostIndex));
12544                               break;
12545                             }
12546                             case 0x00000200: {
12547                               // 0xf9000200
12548                               if (((instr & 0xd) == 0xd) ||
12549                                   ((instr & 0xe20) == 0x620) ||
12550                                   ((instr & 0xf30) == 0xa30)) {
12551                                 UnallocatedT32(instr);
12552                                 return;
12553                               }
12554                               DataType dt =
12555                                   Dt_size_6_Decode((instr >> 6) & 0x3);
12556                               if (dt.Is(kDataTypeValueInvalid)) {
12557                                 UnallocatedT32(instr);
12558                                 return;
12559                               }
12560                               Alignment align =
12561                                   Align_align_5_Decode((instr >> 4) & 0x3);
12562                               if (dt.Is(kDataTypeValueInvalid) ||
12563                                   align.Is(kBadAlignment)) {
12564                                 UnallocatedT32(instr);
12565                                 return;
12566                               }
12567                               unsigned first = ExtractDRegister(instr, 22, 12);
12568                               unsigned length;
12569                               SpacingType spacing = kSingle;
12570                               switch ((instr >> 8) & 0xf) {
12571                                 default:
12572                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12573                                 case 0x7:
12574                                   length = 1;
12575                                   break;
12576                                 case 0xa:
12577                                   length = 2;
12578                                   break;
12579                                 case 0x6:
12580                                   length = 3;
12581                                   break;
12582                                 case 0x2:
12583                                   length = 4;
12584                                   break;
12585                               }
12586                               unsigned last = first + length - 1;
12587                               TransferType transfer = kMultipleLanes;
12588                               unsigned rn = (instr >> 16) & 0xf;
12589                               unsigned rm = instr & 0xf;
12590                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12591                               vst1(CurrentCond(),
12592                                    dt,
12593                                    NeonRegisterList(DRegister(first),
12594                                                     DRegister(last),
12595                                                     spacing,
12596                                                     transfer),
12597                                    AlignedMemOperand(Register(rn),
12598                                                      align,
12599                                                      Register(rm),
12600                                                      PostIndex));
12601                               break;
12602                             }
12603                             case 0x00000300: {
12604                               // 0xf9000300
12605                               if (((instr & 0xd) == 0xd) ||
12606                                   ((instr & 0xe30) == 0x830)) {
12607                                 UnallocatedT32(instr);
12608                                 return;
12609                               }
12610                               DataType dt =
12611                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12612                               if (dt.Is(kDataTypeValueInvalid)) {
12613                                 UnallocatedT32(instr);
12614                                 return;
12615                               }
12616                               Alignment align =
12617                                   Align_align_2_Decode((instr >> 4) & 0x3);
12618                               if (dt.Is(kDataTypeValueInvalid) ||
12619                                   align.Is(kBadAlignment)) {
12620                                 UnallocatedT32(instr);
12621                                 return;
12622                               }
12623                               unsigned first = ExtractDRegister(instr, 22, 12);
12624                               unsigned length;
12625                               SpacingType spacing;
12626                               switch ((instr >> 8) & 0xf) {
12627                                 default:
12628                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12629                                 case 0x8:
12630                                   length = 2;
12631                                   spacing = kSingle;
12632                                   break;
12633                                 case 0x9:
12634                                   length = 2;
12635                                   spacing = kDouble;
12636                                   break;
12637                                 case 0x3:
12638                                   length = 4;
12639                                   spacing = kSingle;
12640                                   break;
12641                               }
12642                               unsigned last =
12643                                   first +
12644                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12645                               TransferType transfer = kMultipleLanes;
12646                               unsigned rn = (instr >> 16) & 0xf;
12647                               unsigned rm = instr & 0xf;
12648                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12649                               vst2(CurrentCond(),
12650                                    dt,
12651                                    NeonRegisterList(DRegister(first),
12652                                                     DRegister(last),
12653                                                     spacing,
12654                                                     transfer),
12655                                    AlignedMemOperand(Register(rn),
12656                                                      align,
12657                                                      Register(rm),
12658                                                      PostIndex));
12659                               break;
12660                             }
12661                             case 0x00000400: {
12662                               // 0xf9000400
12663                               if (((instr & 0xd) == 0xd) ||
12664                                   ((instr & 0x20) == 0x20)) {
12665                                 UnallocatedT32(instr);
12666                                 return;
12667                               }
12668                               DataType dt =
12669                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12670                               if (dt.Is(kDataTypeValueInvalid)) {
12671                                 UnallocatedT32(instr);
12672                                 return;
12673                               }
12674                               Alignment align =
12675                                   Align_align_3_Decode((instr >> 4) & 0x3);
12676                               if (dt.Is(kDataTypeValueInvalid) ||
12677                                   align.Is(kBadAlignment)) {
12678                                 UnallocatedT32(instr);
12679                                 return;
12680                               }
12681                               unsigned first = ExtractDRegister(instr, 22, 12);
12682                               unsigned length;
12683                               SpacingType spacing;
12684                               switch ((instr >> 8) & 0xf) {
12685                                 default:
12686                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12687                                 case 0x4:
12688                                   length = 3;
12689                                   spacing = kSingle;
12690                                   break;
12691                                 case 0x5:
12692                                   length = 3;
12693                                   spacing = kDouble;
12694                                   break;
12695                               }
12696                               unsigned last =
12697                                   first +
12698                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12699                               TransferType transfer = kMultipleLanes;
12700                               unsigned rn = (instr >> 16) & 0xf;
12701                               unsigned rm = instr & 0xf;
12702                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12703                               vst3(CurrentCond(),
12704                                    dt,
12705                                    NeonRegisterList(DRegister(first),
12706                                                     DRegister(last),
12707                                                     spacing,
12708                                                     transfer),
12709                                    AlignedMemOperand(Register(rn),
12710                                                      align,
12711                                                      Register(rm),
12712                                                      PostIndex));
12713                               break;
12714                             }
12715                             case 0x00000500: {
12716                               // 0xf9000500
12717                               if (((instr & 0xd) == 0xd) ||
12718                                   ((instr & 0x20) == 0x20)) {
12719                                 UnallocatedT32(instr);
12720                                 return;
12721                               }
12722                               DataType dt =
12723                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12724                               if (dt.Is(kDataTypeValueInvalid)) {
12725                                 UnallocatedT32(instr);
12726                                 return;
12727                               }
12728                               Alignment align =
12729                                   Align_align_3_Decode((instr >> 4) & 0x3);
12730                               if (dt.Is(kDataTypeValueInvalid) ||
12731                                   align.Is(kBadAlignment)) {
12732                                 UnallocatedT32(instr);
12733                                 return;
12734                               }
12735                               unsigned first = ExtractDRegister(instr, 22, 12);
12736                               unsigned length;
12737                               SpacingType spacing;
12738                               switch ((instr >> 8) & 0xf) {
12739                                 default:
12740                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12741                                 case 0x4:
12742                                   length = 3;
12743                                   spacing = kSingle;
12744                                   break;
12745                                 case 0x5:
12746                                   length = 3;
12747                                   spacing = kDouble;
12748                                   break;
12749                               }
12750                               unsigned last =
12751                                   first +
12752                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12753                               TransferType transfer = kMultipleLanes;
12754                               unsigned rn = (instr >> 16) & 0xf;
12755                               unsigned rm = instr & 0xf;
12756                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12757                               vst3(CurrentCond(),
12758                                    dt,
12759                                    NeonRegisterList(DRegister(first),
12760                                                     DRegister(last),
12761                                                     spacing,
12762                                                     transfer),
12763                                    AlignedMemOperand(Register(rn),
12764                                                      align,
12765                                                      Register(rm),
12766                                                      PostIndex));
12767                               break;
12768                             }
12769                             case 0x00000600: {
12770                               // 0xf9000600
12771                               if (((instr & 0xd) == 0xd) ||
12772                                   ((instr & 0xe20) == 0x620) ||
12773                                   ((instr & 0xf30) == 0xa30)) {
12774                                 UnallocatedT32(instr);
12775                                 return;
12776                               }
12777                               DataType dt =
12778                                   Dt_size_6_Decode((instr >> 6) & 0x3);
12779                               if (dt.Is(kDataTypeValueInvalid)) {
12780                                 UnallocatedT32(instr);
12781                                 return;
12782                               }
12783                               Alignment align =
12784                                   Align_align_5_Decode((instr >> 4) & 0x3);
12785                               if (dt.Is(kDataTypeValueInvalid) ||
12786                                   align.Is(kBadAlignment)) {
12787                                 UnallocatedT32(instr);
12788                                 return;
12789                               }
12790                               unsigned first = ExtractDRegister(instr, 22, 12);
12791                               unsigned length;
12792                               SpacingType spacing = kSingle;
12793                               switch ((instr >> 8) & 0xf) {
12794                                 default:
12795                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12796                                 case 0x7:
12797                                   length = 1;
12798                                   break;
12799                                 case 0xa:
12800                                   length = 2;
12801                                   break;
12802                                 case 0x6:
12803                                   length = 3;
12804                                   break;
12805                                 case 0x2:
12806                                   length = 4;
12807                                   break;
12808                               }
12809                               unsigned last = first + length - 1;
12810                               TransferType transfer = kMultipleLanes;
12811                               unsigned rn = (instr >> 16) & 0xf;
12812                               unsigned rm = instr & 0xf;
12813                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12814                               vst1(CurrentCond(),
12815                                    dt,
12816                                    NeonRegisterList(DRegister(first),
12817                                                     DRegister(last),
12818                                                     spacing,
12819                                                     transfer),
12820                                    AlignedMemOperand(Register(rn),
12821                                                      align,
12822                                                      Register(rm),
12823                                                      PostIndex));
12824                               break;
12825                             }
12826                             case 0x00000700: {
12827                               // 0xf9000700
12828                               if (((instr & 0xd) == 0xd) ||
12829                                   ((instr & 0xe20) == 0x620) ||
12830                                   ((instr & 0xf30) == 0xa30)) {
12831                                 UnallocatedT32(instr);
12832                                 return;
12833                               }
12834                               DataType dt =
12835                                   Dt_size_6_Decode((instr >> 6) & 0x3);
12836                               if (dt.Is(kDataTypeValueInvalid)) {
12837                                 UnallocatedT32(instr);
12838                                 return;
12839                               }
12840                               Alignment align =
12841                                   Align_align_5_Decode((instr >> 4) & 0x3);
12842                               if (dt.Is(kDataTypeValueInvalid) ||
12843                                   align.Is(kBadAlignment)) {
12844                                 UnallocatedT32(instr);
12845                                 return;
12846                               }
12847                               unsigned first = ExtractDRegister(instr, 22, 12);
12848                               unsigned length;
12849                               SpacingType spacing = kSingle;
12850                               switch ((instr >> 8) & 0xf) {
12851                                 default:
12852                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12853                                 case 0x7:
12854                                   length = 1;
12855                                   break;
12856                                 case 0xa:
12857                                   length = 2;
12858                                   break;
12859                                 case 0x6:
12860                                   length = 3;
12861                                   break;
12862                                 case 0x2:
12863                                   length = 4;
12864                                   break;
12865                               }
12866                               unsigned last = first + length - 1;
12867                               TransferType transfer = kMultipleLanes;
12868                               unsigned rn = (instr >> 16) & 0xf;
12869                               unsigned rm = instr & 0xf;
12870                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12871                               vst1(CurrentCond(),
12872                                    dt,
12873                                    NeonRegisterList(DRegister(first),
12874                                                     DRegister(last),
12875                                                     spacing,
12876                                                     transfer),
12877                                    AlignedMemOperand(Register(rn),
12878                                                      align,
12879                                                      Register(rm),
12880                                                      PostIndex));
12881                               break;
12882                             }
12883                             case 0x00000800: {
12884                               // 0xf9000800
12885                               if (((instr & 0xd) == 0xd) ||
12886                                   ((instr & 0xe30) == 0x830)) {
12887                                 UnallocatedT32(instr);
12888                                 return;
12889                               }
12890                               DataType dt =
12891                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12892                               if (dt.Is(kDataTypeValueInvalid)) {
12893                                 UnallocatedT32(instr);
12894                                 return;
12895                               }
12896                               Alignment align =
12897                                   Align_align_2_Decode((instr >> 4) & 0x3);
12898                               if (dt.Is(kDataTypeValueInvalid) ||
12899                                   align.Is(kBadAlignment)) {
12900                                 UnallocatedT32(instr);
12901                                 return;
12902                               }
12903                               unsigned first = ExtractDRegister(instr, 22, 12);
12904                               unsigned length;
12905                               SpacingType spacing;
12906                               switch ((instr >> 8) & 0xf) {
12907                                 default:
12908                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12909                                 case 0x8:
12910                                   length = 2;
12911                                   spacing = kSingle;
12912                                   break;
12913                                 case 0x9:
12914                                   length = 2;
12915                                   spacing = kDouble;
12916                                   break;
12917                                 case 0x3:
12918                                   length = 4;
12919                                   spacing = kSingle;
12920                                   break;
12921                               }
12922                               unsigned last =
12923                                   first +
12924                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12925                               TransferType transfer = kMultipleLanes;
12926                               unsigned rn = (instr >> 16) & 0xf;
12927                               unsigned rm = instr & 0xf;
12928                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12929                               vst2(CurrentCond(),
12930                                    dt,
12931                                    NeonRegisterList(DRegister(first),
12932                                                     DRegister(last),
12933                                                     spacing,
12934                                                     transfer),
12935                                    AlignedMemOperand(Register(rn),
12936                                                      align,
12937                                                      Register(rm),
12938                                                      PostIndex));
12939                               break;
12940                             }
12941                             case 0x00000900: {
12942                               // 0xf9000900
12943                               if (((instr & 0xd) == 0xd) ||
12944                                   ((instr & 0xe30) == 0x830)) {
12945                                 UnallocatedT32(instr);
12946                                 return;
12947                               }
12948                               DataType dt =
12949                                   Dt_size_7_Decode((instr >> 6) & 0x3);
12950                               if (dt.Is(kDataTypeValueInvalid)) {
12951                                 UnallocatedT32(instr);
12952                                 return;
12953                               }
12954                               Alignment align =
12955                                   Align_align_2_Decode((instr >> 4) & 0x3);
12956                               if (dt.Is(kDataTypeValueInvalid) ||
12957                                   align.Is(kBadAlignment)) {
12958                                 UnallocatedT32(instr);
12959                                 return;
12960                               }
12961                               unsigned first = ExtractDRegister(instr, 22, 12);
12962                               unsigned length;
12963                               SpacingType spacing;
12964                               switch ((instr >> 8) & 0xf) {
12965                                 default:
12966                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
12967                                 case 0x8:
12968                                   length = 2;
12969                                   spacing = kSingle;
12970                                   break;
12971                                 case 0x9:
12972                                   length = 2;
12973                                   spacing = kDouble;
12974                                   break;
12975                                 case 0x3:
12976                                   length = 4;
12977                                   spacing = kSingle;
12978                                   break;
12979                               }
12980                               unsigned last =
12981                                   first +
12982                                   (length - 1) * (spacing == kSingle ? 1 : 2);
12983                               TransferType transfer = kMultipleLanes;
12984                               unsigned rn = (instr >> 16) & 0xf;
12985                               unsigned rm = instr & 0xf;
12986                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
12987                               vst2(CurrentCond(),
12988                                    dt,
12989                                    NeonRegisterList(DRegister(first),
12990                                                     DRegister(last),
12991                                                     spacing,
12992                                                     transfer),
12993                                    AlignedMemOperand(Register(rn),
12994                                                      align,
12995                                                      Register(rm),
12996                                                      PostIndex));
12997                               break;
12998                             }
12999                             case 0x00000a00: {
13000                               // 0xf9000a00
13001                               if (((instr & 0xd) == 0xd) ||
13002                                   ((instr & 0xe20) == 0x620) ||
13003                                   ((instr & 0xf30) == 0xa30)) {
13004                                 UnallocatedT32(instr);
13005                                 return;
13006                               }
13007                               DataType dt =
13008                                   Dt_size_6_Decode((instr >> 6) & 0x3);
13009                               if (dt.Is(kDataTypeValueInvalid)) {
13010                                 UnallocatedT32(instr);
13011                                 return;
13012                               }
13013                               Alignment align =
13014                                   Align_align_5_Decode((instr >> 4) & 0x3);
13015                               if (dt.Is(kDataTypeValueInvalid) ||
13016                                   align.Is(kBadAlignment)) {
13017                                 UnallocatedT32(instr);
13018                                 return;
13019                               }
13020                               unsigned first = ExtractDRegister(instr, 22, 12);
13021                               unsigned length;
13022                               SpacingType spacing = kSingle;
13023                               switch ((instr >> 8) & 0xf) {
13024                                 default:
13025                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
13026                                 case 0x7:
13027                                   length = 1;
13028                                   break;
13029                                 case 0xa:
13030                                   length = 2;
13031                                   break;
13032                                 case 0x6:
13033                                   length = 3;
13034                                   break;
13035                                 case 0x2:
13036                                   length = 4;
13037                                   break;
13038                               }
13039                               unsigned last = first + length - 1;
13040                               TransferType transfer = kMultipleLanes;
13041                               unsigned rn = (instr >> 16) & 0xf;
13042                               unsigned rm = instr & 0xf;
13043                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
13044                               vst1(CurrentCond(),
13045                                    dt,
13046                                    NeonRegisterList(DRegister(first),
13047                                                     DRegister(last),
13048                                                     spacing,
13049                                                     transfer),
13050                                    AlignedMemOperand(Register(rn),
13051                                                      align,
13052                                                      Register(rm),
13053                                                      PostIndex));
13054                               break;
13055                             }
13056                             default:
13057                               UnallocatedT32(instr);
13058                               break;
13059                           }
13060                           break;
13061                         }
13062                       }
13063                       break;
13064                     }
13065                     case 0x01200000: {
13066                       // 0xf9200000
13067                       switch (instr & 0x0000000d) {
13068                         case 0x0000000d: {
13069                           // 0xf920000d
13070                           switch (instr & 0x00000002) {
13071                             case 0x00000000: {
13072                               // 0xf920000d
13073                               switch (instr & 0x00000f00) {
13074                                 case 0x00000000: {
13075                                   // 0xf920000d
13076                                   DataType dt =
13077                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13078                                   if (dt.Is(kDataTypeValueInvalid)) {
13079                                     UnallocatedT32(instr);
13080                                     return;
13081                                   }
13082                                   Alignment align =
13083                                       Align_align_4_Decode((instr >> 4) & 0x3);
13084                                   if (dt.Is(kDataTypeValueInvalid) ||
13085                                       align.Is(kBadAlignment)) {
13086                                     UnallocatedT32(instr);
13087                                     return;
13088                                   }
13089                                   unsigned first =
13090                                       ExtractDRegister(instr, 22, 12);
13091                                   unsigned length;
13092                                   SpacingType spacing;
13093                                   switch ((instr >> 8) & 0xf) {
13094                                     default:
13095                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13096                                     case 0x0:
13097                                       length = 4;
13098                                       spacing = kSingle;
13099                                       break;
13100                                     case 0x1:
13101                                       length = 4;
13102                                       spacing = kDouble;
13103                                       break;
13104                                   }
13105                                   unsigned last =
13106                                       first +
13107                                       (length - 1) *
13108                                           (spacing == kSingle ? 1 : 2);
13109                                   TransferType transfer = kMultipleLanes;
13110                                   unsigned rn = (instr >> 16) & 0xf;
13111                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13112                                   vld4(CurrentCond(),
13113                                        dt,
13114                                        NeonRegisterList(DRegister(first),
13115                                                         DRegister(last),
13116                                                         spacing,
13117                                                         transfer),
13118                                        AlignedMemOperand(Register(rn),
13119                                                          align,
13120                                                          PostIndex));
13121                                   break;
13122                                 }
13123                                 case 0x00000100: {
13124                                   // 0xf920010d
13125                                   DataType dt =
13126                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13127                                   if (dt.Is(kDataTypeValueInvalid)) {
13128                                     UnallocatedT32(instr);
13129                                     return;
13130                                   }
13131                                   Alignment align =
13132                                       Align_align_4_Decode((instr >> 4) & 0x3);
13133                                   if (dt.Is(kDataTypeValueInvalid) ||
13134                                       align.Is(kBadAlignment)) {
13135                                     UnallocatedT32(instr);
13136                                     return;
13137                                   }
13138                                   unsigned first =
13139                                       ExtractDRegister(instr, 22, 12);
13140                                   unsigned length;
13141                                   SpacingType spacing;
13142                                   switch ((instr >> 8) & 0xf) {
13143                                     default:
13144                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13145                                     case 0x0:
13146                                       length = 4;
13147                                       spacing = kSingle;
13148                                       break;
13149                                     case 0x1:
13150                                       length = 4;
13151                                       spacing = kDouble;
13152                                       break;
13153                                   }
13154                                   unsigned last =
13155                                       first +
13156                                       (length - 1) *
13157                                           (spacing == kSingle ? 1 : 2);
13158                                   TransferType transfer = kMultipleLanes;
13159                                   unsigned rn = (instr >> 16) & 0xf;
13160                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13161                                   vld4(CurrentCond(),
13162                                        dt,
13163                                        NeonRegisterList(DRegister(first),
13164                                                         DRegister(last),
13165                                                         spacing,
13166                                                         transfer),
13167                                        AlignedMemOperand(Register(rn),
13168                                                          align,
13169                                                          PostIndex));
13170                                   break;
13171                                 }
13172                                 case 0x00000200: {
13173                                   // 0xf920020d
13174                                   if (((instr & 0xe20) == 0x620) ||
13175                                       ((instr & 0xf30) == 0xa30)) {
13176                                     UnallocatedT32(instr);
13177                                     return;
13178                                   }
13179                                   DataType dt =
13180                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13181                                   if (dt.Is(kDataTypeValueInvalid)) {
13182                                     UnallocatedT32(instr);
13183                                     return;
13184                                   }
13185                                   Alignment align =
13186                                       Align_align_1_Decode((instr >> 4) & 0x3);
13187                                   if (dt.Is(kDataTypeValueInvalid) ||
13188                                       align.Is(kBadAlignment)) {
13189                                     UnallocatedT32(instr);
13190                                     return;
13191                                   }
13192                                   unsigned first =
13193                                       ExtractDRegister(instr, 22, 12);
13194                                   unsigned length;
13195                                   SpacingType spacing = kSingle;
13196                                   switch ((instr >> 8) & 0xf) {
13197                                     default:
13198                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13199                                     case 0x7:
13200                                       length = 1;
13201                                       break;
13202                                     case 0xa:
13203                                       length = 2;
13204                                       break;
13205                                     case 0x6:
13206                                       length = 3;
13207                                       break;
13208                                     case 0x2:
13209                                       length = 4;
13210                                       break;
13211                                   }
13212                                   unsigned last = first + length - 1;
13213                                   TransferType transfer = kMultipleLanes;
13214                                   unsigned rn = (instr >> 16) & 0xf;
13215                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13216                                   vld1(CurrentCond(),
13217                                        dt,
13218                                        NeonRegisterList(DRegister(first),
13219                                                         DRegister(last),
13220                                                         spacing,
13221                                                         transfer),
13222                                        AlignedMemOperand(Register(rn),
13223                                                          align,
13224                                                          PostIndex));
13225                                   break;
13226                                 }
13227                                 case 0x00000300: {
13228                                   // 0xf920030d
13229                                   if (((instr & 0xe30) == 0x830)) {
13230                                     UnallocatedT32(instr);
13231                                     return;
13232                                   }
13233                                   DataType dt =
13234                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13235                                   if (dt.Is(kDataTypeValueInvalid)) {
13236                                     UnallocatedT32(instr);
13237                                     return;
13238                                   }
13239                                   Alignment align =
13240                                       Align_align_2_Decode((instr >> 4) & 0x3);
13241                                   if (dt.Is(kDataTypeValueInvalid) ||
13242                                       align.Is(kBadAlignment)) {
13243                                     UnallocatedT32(instr);
13244                                     return;
13245                                   }
13246                                   unsigned first =
13247                                       ExtractDRegister(instr, 22, 12);
13248                                   unsigned length;
13249                                   SpacingType spacing;
13250                                   switch ((instr >> 8) & 0xf) {
13251                                     default:
13252                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13253                                     case 0x8:
13254                                       length = 2;
13255                                       spacing = kSingle;
13256                                       break;
13257                                     case 0x9:
13258                                       length = 2;
13259                                       spacing = kDouble;
13260                                       break;
13261                                     case 0x3:
13262                                       length = 4;
13263                                       spacing = kSingle;
13264                                       break;
13265                                   }
13266                                   unsigned last =
13267                                       first +
13268                                       (length - 1) *
13269                                           (spacing == kSingle ? 1 : 2);
13270                                   TransferType transfer = kMultipleLanes;
13271                                   unsigned rn = (instr >> 16) & 0xf;
13272                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13273                                   vld2(CurrentCond(),
13274                                        dt,
13275                                        NeonRegisterList(DRegister(first),
13276                                                         DRegister(last),
13277                                                         spacing,
13278                                                         transfer),
13279                                        AlignedMemOperand(Register(rn),
13280                                                          align,
13281                                                          PostIndex));
13282                                   break;
13283                                 }
13284                                 case 0x00000400: {
13285                                   // 0xf920040d
13286                                   DataType dt =
13287                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13288                                   if (dt.Is(kDataTypeValueInvalid)) {
13289                                     UnallocatedT32(instr);
13290                                     return;
13291                                   }
13292                                   Alignment align =
13293                                       Align_align_3_Decode((instr >> 4) & 0x3);
13294                                   if (dt.Is(kDataTypeValueInvalid) ||
13295                                       align.Is(kBadAlignment)) {
13296                                     UnallocatedT32(instr);
13297                                     return;
13298                                   }
13299                                   unsigned first =
13300                                       ExtractDRegister(instr, 22, 12);
13301                                   unsigned length;
13302                                   SpacingType spacing;
13303                                   switch ((instr >> 8) & 0xf) {
13304                                     default:
13305                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13306                                     case 0x4:
13307                                       length = 3;
13308                                       spacing = kSingle;
13309                                       break;
13310                                     case 0x5:
13311                                       length = 3;
13312                                       spacing = kDouble;
13313                                       break;
13314                                   }
13315                                   unsigned last =
13316                                       first +
13317                                       (length - 1) *
13318                                           (spacing == kSingle ? 1 : 2);
13319                                   TransferType transfer = kMultipleLanes;
13320                                   unsigned rn = (instr >> 16) & 0xf;
13321                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13322                                   vld3(CurrentCond(),
13323                                        dt,
13324                                        NeonRegisterList(DRegister(first),
13325                                                         DRegister(last),
13326                                                         spacing,
13327                                                         transfer),
13328                                        AlignedMemOperand(Register(rn),
13329                                                          align,
13330                                                          PostIndex));
13331                                   break;
13332                                 }
13333                                 case 0x00000500: {
13334                                   // 0xf920050d
13335                                   DataType dt =
13336                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13337                                   if (dt.Is(kDataTypeValueInvalid)) {
13338                                     UnallocatedT32(instr);
13339                                     return;
13340                                   }
13341                                   Alignment align =
13342                                       Align_align_3_Decode((instr >> 4) & 0x3);
13343                                   if (dt.Is(kDataTypeValueInvalid) ||
13344                                       align.Is(kBadAlignment)) {
13345                                     UnallocatedT32(instr);
13346                                     return;
13347                                   }
13348                                   unsigned first =
13349                                       ExtractDRegister(instr, 22, 12);
13350                                   unsigned length;
13351                                   SpacingType spacing;
13352                                   switch ((instr >> 8) & 0xf) {
13353                                     default:
13354                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13355                                     case 0x4:
13356                                       length = 3;
13357                                       spacing = kSingle;
13358                                       break;
13359                                     case 0x5:
13360                                       length = 3;
13361                                       spacing = kDouble;
13362                                       break;
13363                                   }
13364                                   unsigned last =
13365                                       first +
13366                                       (length - 1) *
13367                                           (spacing == kSingle ? 1 : 2);
13368                                   TransferType transfer = kMultipleLanes;
13369                                   unsigned rn = (instr >> 16) & 0xf;
13370                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13371                                   vld3(CurrentCond(),
13372                                        dt,
13373                                        NeonRegisterList(DRegister(first),
13374                                                         DRegister(last),
13375                                                         spacing,
13376                                                         transfer),
13377                                        AlignedMemOperand(Register(rn),
13378                                                          align,
13379                                                          PostIndex));
13380                                   break;
13381                                 }
13382                                 case 0x00000600: {
13383                                   // 0xf920060d
13384                                   if (((instr & 0xe20) == 0x620) ||
13385                                       ((instr & 0xf30) == 0xa30)) {
13386                                     UnallocatedT32(instr);
13387                                     return;
13388                                   }
13389                                   DataType dt =
13390                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13391                                   if (dt.Is(kDataTypeValueInvalid)) {
13392                                     UnallocatedT32(instr);
13393                                     return;
13394                                   }
13395                                   Alignment align =
13396                                       Align_align_1_Decode((instr >> 4) & 0x3);
13397                                   if (dt.Is(kDataTypeValueInvalid) ||
13398                                       align.Is(kBadAlignment)) {
13399                                     UnallocatedT32(instr);
13400                                     return;
13401                                   }
13402                                   unsigned first =
13403                                       ExtractDRegister(instr, 22, 12);
13404                                   unsigned length;
13405                                   SpacingType spacing = kSingle;
13406                                   switch ((instr >> 8) & 0xf) {
13407                                     default:
13408                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13409                                     case 0x7:
13410                                       length = 1;
13411                                       break;
13412                                     case 0xa:
13413                                       length = 2;
13414                                       break;
13415                                     case 0x6:
13416                                       length = 3;
13417                                       break;
13418                                     case 0x2:
13419                                       length = 4;
13420                                       break;
13421                                   }
13422                                   unsigned last = first + length - 1;
13423                                   TransferType transfer = kMultipleLanes;
13424                                   unsigned rn = (instr >> 16) & 0xf;
13425                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13426                                   vld1(CurrentCond(),
13427                                        dt,
13428                                        NeonRegisterList(DRegister(first),
13429                                                         DRegister(last),
13430                                                         spacing,
13431                                                         transfer),
13432                                        AlignedMemOperand(Register(rn),
13433                                                          align,
13434                                                          PostIndex));
13435                                   break;
13436                                 }
13437                                 case 0x00000700: {
13438                                   // 0xf920070d
13439                                   if (((instr & 0xe20) == 0x620) ||
13440                                       ((instr & 0xf30) == 0xa30)) {
13441                                     UnallocatedT32(instr);
13442                                     return;
13443                                   }
13444                                   DataType dt =
13445                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13446                                   if (dt.Is(kDataTypeValueInvalid)) {
13447                                     UnallocatedT32(instr);
13448                                     return;
13449                                   }
13450                                   Alignment align =
13451                                       Align_align_1_Decode((instr >> 4) & 0x3);
13452                                   if (dt.Is(kDataTypeValueInvalid) ||
13453                                       align.Is(kBadAlignment)) {
13454                                     UnallocatedT32(instr);
13455                                     return;
13456                                   }
13457                                   unsigned first =
13458                                       ExtractDRegister(instr, 22, 12);
13459                                   unsigned length;
13460                                   SpacingType spacing = kSingle;
13461                                   switch ((instr >> 8) & 0xf) {
13462                                     default:
13463                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13464                                     case 0x7:
13465                                       length = 1;
13466                                       break;
13467                                     case 0xa:
13468                                       length = 2;
13469                                       break;
13470                                     case 0x6:
13471                                       length = 3;
13472                                       break;
13473                                     case 0x2:
13474                                       length = 4;
13475                                       break;
13476                                   }
13477                                   unsigned last = first + length - 1;
13478                                   TransferType transfer = kMultipleLanes;
13479                                   unsigned rn = (instr >> 16) & 0xf;
13480                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13481                                   vld1(CurrentCond(),
13482                                        dt,
13483                                        NeonRegisterList(DRegister(first),
13484                                                         DRegister(last),
13485                                                         spacing,
13486                                                         transfer),
13487                                        AlignedMemOperand(Register(rn),
13488                                                          align,
13489                                                          PostIndex));
13490                                   break;
13491                                 }
13492                                 case 0x00000800: {
13493                                   // 0xf920080d
13494                                   if (((instr & 0xe30) == 0x830)) {
13495                                     UnallocatedT32(instr);
13496                                     return;
13497                                   }
13498                                   DataType dt =
13499                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13500                                   if (dt.Is(kDataTypeValueInvalid)) {
13501                                     UnallocatedT32(instr);
13502                                     return;
13503                                   }
13504                                   Alignment align =
13505                                       Align_align_2_Decode((instr >> 4) & 0x3);
13506                                   if (dt.Is(kDataTypeValueInvalid) ||
13507                                       align.Is(kBadAlignment)) {
13508                                     UnallocatedT32(instr);
13509                                     return;
13510                                   }
13511                                   unsigned first =
13512                                       ExtractDRegister(instr, 22, 12);
13513                                   unsigned length;
13514                                   SpacingType spacing;
13515                                   switch ((instr >> 8) & 0xf) {
13516                                     default:
13517                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13518                                     case 0x8:
13519                                       length = 2;
13520                                       spacing = kSingle;
13521                                       break;
13522                                     case 0x9:
13523                                       length = 2;
13524                                       spacing = kDouble;
13525                                       break;
13526                                     case 0x3:
13527                                       length = 4;
13528                                       spacing = kSingle;
13529                                       break;
13530                                   }
13531                                   unsigned last =
13532                                       first +
13533                                       (length - 1) *
13534                                           (spacing == kSingle ? 1 : 2);
13535                                   TransferType transfer = kMultipleLanes;
13536                                   unsigned rn = (instr >> 16) & 0xf;
13537                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13538                                   vld2(CurrentCond(),
13539                                        dt,
13540                                        NeonRegisterList(DRegister(first),
13541                                                         DRegister(last),
13542                                                         spacing,
13543                                                         transfer),
13544                                        AlignedMemOperand(Register(rn),
13545                                                          align,
13546                                                          PostIndex));
13547                                   break;
13548                                 }
13549                                 case 0x00000900: {
13550                                   // 0xf920090d
13551                                   if (((instr & 0xe30) == 0x830)) {
13552                                     UnallocatedT32(instr);
13553                                     return;
13554                                   }
13555                                   DataType dt =
13556                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13557                                   if (dt.Is(kDataTypeValueInvalid)) {
13558                                     UnallocatedT32(instr);
13559                                     return;
13560                                   }
13561                                   Alignment align =
13562                                       Align_align_2_Decode((instr >> 4) & 0x3);
13563                                   if (dt.Is(kDataTypeValueInvalid) ||
13564                                       align.Is(kBadAlignment)) {
13565                                     UnallocatedT32(instr);
13566                                     return;
13567                                   }
13568                                   unsigned first =
13569                                       ExtractDRegister(instr, 22, 12);
13570                                   unsigned length;
13571                                   SpacingType spacing;
13572                                   switch ((instr >> 8) & 0xf) {
13573                                     default:
13574                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13575                                     case 0x8:
13576                                       length = 2;
13577                                       spacing = kSingle;
13578                                       break;
13579                                     case 0x9:
13580                                       length = 2;
13581                                       spacing = kDouble;
13582                                       break;
13583                                     case 0x3:
13584                                       length = 4;
13585                                       spacing = kSingle;
13586                                       break;
13587                                   }
13588                                   unsigned last =
13589                                       first +
13590                                       (length - 1) *
13591                                           (spacing == kSingle ? 1 : 2);
13592                                   TransferType transfer = kMultipleLanes;
13593                                   unsigned rn = (instr >> 16) & 0xf;
13594                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13595                                   vld2(CurrentCond(),
13596                                        dt,
13597                                        NeonRegisterList(DRegister(first),
13598                                                         DRegister(last),
13599                                                         spacing,
13600                                                         transfer),
13601                                        AlignedMemOperand(Register(rn),
13602                                                          align,
13603                                                          PostIndex));
13604                                   break;
13605                                 }
13606                                 case 0x00000a00: {
13607                                   // 0xf9200a0d
13608                                   if (((instr & 0xe20) == 0x620) ||
13609                                       ((instr & 0xf30) == 0xa30)) {
13610                                     UnallocatedT32(instr);
13611                                     return;
13612                                   }
13613                                   DataType dt =
13614                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13615                                   if (dt.Is(kDataTypeValueInvalid)) {
13616                                     UnallocatedT32(instr);
13617                                     return;
13618                                   }
13619                                   Alignment align =
13620                                       Align_align_1_Decode((instr >> 4) & 0x3);
13621                                   if (dt.Is(kDataTypeValueInvalid) ||
13622                                       align.Is(kBadAlignment)) {
13623                                     UnallocatedT32(instr);
13624                                     return;
13625                                   }
13626                                   unsigned first =
13627                                       ExtractDRegister(instr, 22, 12);
13628                                   unsigned length;
13629                                   SpacingType spacing = kSingle;
13630                                   switch ((instr >> 8) & 0xf) {
13631                                     default:
13632                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13633                                     case 0x7:
13634                                       length = 1;
13635                                       break;
13636                                     case 0xa:
13637                                       length = 2;
13638                                       break;
13639                                     case 0x6:
13640                                       length = 3;
13641                                       break;
13642                                     case 0x2:
13643                                       length = 4;
13644                                       break;
13645                                   }
13646                                   unsigned last = first + length - 1;
13647                                   TransferType transfer = kMultipleLanes;
13648                                   unsigned rn = (instr >> 16) & 0xf;
13649                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
13650                                   vld1(CurrentCond(),
13651                                        dt,
13652                                        NeonRegisterList(DRegister(first),
13653                                                         DRegister(last),
13654                                                         spacing,
13655                                                         transfer),
13656                                        AlignedMemOperand(Register(rn),
13657                                                          align,
13658                                                          PostIndex));
13659                                   break;
13660                                 }
13661                                 default:
13662                                   UnallocatedT32(instr);
13663                                   break;
13664                               }
13665                               break;
13666                             }
13667                             case 0x00000002: {
13668                               // 0xf920000f
13669                               switch (instr & 0x00000f00) {
13670                                 case 0x00000000: {
13671                                   // 0xf920000d
13672                                   DataType dt =
13673                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13674                                   if (dt.Is(kDataTypeValueInvalid)) {
13675                                     UnallocatedT32(instr);
13676                                     return;
13677                                   }
13678                                   Alignment align =
13679                                       Align_align_4_Decode((instr >> 4) & 0x3);
13680                                   if (dt.Is(kDataTypeValueInvalid) ||
13681                                       align.Is(kBadAlignment)) {
13682                                     UnallocatedT32(instr);
13683                                     return;
13684                                   }
13685                                   unsigned first =
13686                                       ExtractDRegister(instr, 22, 12);
13687                                   unsigned length;
13688                                   SpacingType spacing;
13689                                   switch ((instr >> 8) & 0xf) {
13690                                     default:
13691                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13692                                     case 0x0:
13693                                       length = 4;
13694                                       spacing = kSingle;
13695                                       break;
13696                                     case 0x1:
13697                                       length = 4;
13698                                       spacing = kDouble;
13699                                       break;
13700                                   }
13701                                   unsigned last =
13702                                       first +
13703                                       (length - 1) *
13704                                           (spacing == kSingle ? 1 : 2);
13705                                   TransferType transfer = kMultipleLanes;
13706                                   unsigned rn = (instr >> 16) & 0xf;
13707                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13708                                   vld4(CurrentCond(),
13709                                        dt,
13710                                        NeonRegisterList(DRegister(first),
13711                                                         DRegister(last),
13712                                                         spacing,
13713                                                         transfer),
13714                                        AlignedMemOperand(Register(rn),
13715                                                          align,
13716                                                          Offset));
13717                                   break;
13718                                 }
13719                                 case 0x00000100: {
13720                                   // 0xf920010d
13721                                   DataType dt =
13722                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13723                                   if (dt.Is(kDataTypeValueInvalid)) {
13724                                     UnallocatedT32(instr);
13725                                     return;
13726                                   }
13727                                   Alignment align =
13728                                       Align_align_4_Decode((instr >> 4) & 0x3);
13729                                   if (dt.Is(kDataTypeValueInvalid) ||
13730                                       align.Is(kBadAlignment)) {
13731                                     UnallocatedT32(instr);
13732                                     return;
13733                                   }
13734                                   unsigned first =
13735                                       ExtractDRegister(instr, 22, 12);
13736                                   unsigned length;
13737                                   SpacingType spacing;
13738                                   switch ((instr >> 8) & 0xf) {
13739                                     default:
13740                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13741                                     case 0x0:
13742                                       length = 4;
13743                                       spacing = kSingle;
13744                                       break;
13745                                     case 0x1:
13746                                       length = 4;
13747                                       spacing = kDouble;
13748                                       break;
13749                                   }
13750                                   unsigned last =
13751                                       first +
13752                                       (length - 1) *
13753                                           (spacing == kSingle ? 1 : 2);
13754                                   TransferType transfer = kMultipleLanes;
13755                                   unsigned rn = (instr >> 16) & 0xf;
13756                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13757                                   vld4(CurrentCond(),
13758                                        dt,
13759                                        NeonRegisterList(DRegister(first),
13760                                                         DRegister(last),
13761                                                         spacing,
13762                                                         transfer),
13763                                        AlignedMemOperand(Register(rn),
13764                                                          align,
13765                                                          Offset));
13766                                   break;
13767                                 }
13768                                 case 0x00000200: {
13769                                   // 0xf920020d
13770                                   if (((instr & 0xe20) == 0x620) ||
13771                                       ((instr & 0xf30) == 0xa30)) {
13772                                     UnallocatedT32(instr);
13773                                     return;
13774                                   }
13775                                   DataType dt =
13776                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13777                                   if (dt.Is(kDataTypeValueInvalid)) {
13778                                     UnallocatedT32(instr);
13779                                     return;
13780                                   }
13781                                   Alignment align =
13782                                       Align_align_1_Decode((instr >> 4) & 0x3);
13783                                   if (dt.Is(kDataTypeValueInvalid) ||
13784                                       align.Is(kBadAlignment)) {
13785                                     UnallocatedT32(instr);
13786                                     return;
13787                                   }
13788                                   unsigned first =
13789                                       ExtractDRegister(instr, 22, 12);
13790                                   unsigned length;
13791                                   SpacingType spacing = kSingle;
13792                                   switch ((instr >> 8) & 0xf) {
13793                                     default:
13794                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13795                                     case 0x7:
13796                                       length = 1;
13797                                       break;
13798                                     case 0xa:
13799                                       length = 2;
13800                                       break;
13801                                     case 0x6:
13802                                       length = 3;
13803                                       break;
13804                                     case 0x2:
13805                                       length = 4;
13806                                       break;
13807                                   }
13808                                   unsigned last = first + length - 1;
13809                                   TransferType transfer = kMultipleLanes;
13810                                   unsigned rn = (instr >> 16) & 0xf;
13811                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13812                                   vld1(CurrentCond(),
13813                                        dt,
13814                                        NeonRegisterList(DRegister(first),
13815                                                         DRegister(last),
13816                                                         spacing,
13817                                                         transfer),
13818                                        AlignedMemOperand(Register(rn),
13819                                                          align,
13820                                                          Offset));
13821                                   break;
13822                                 }
13823                                 case 0x00000300: {
13824                                   // 0xf920030d
13825                                   if (((instr & 0xe30) == 0x830)) {
13826                                     UnallocatedT32(instr);
13827                                     return;
13828                                   }
13829                                   DataType dt =
13830                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13831                                   if (dt.Is(kDataTypeValueInvalid)) {
13832                                     UnallocatedT32(instr);
13833                                     return;
13834                                   }
13835                                   Alignment align =
13836                                       Align_align_2_Decode((instr >> 4) & 0x3);
13837                                   if (dt.Is(kDataTypeValueInvalid) ||
13838                                       align.Is(kBadAlignment)) {
13839                                     UnallocatedT32(instr);
13840                                     return;
13841                                   }
13842                                   unsigned first =
13843                                       ExtractDRegister(instr, 22, 12);
13844                                   unsigned length;
13845                                   SpacingType spacing;
13846                                   switch ((instr >> 8) & 0xf) {
13847                                     default:
13848                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13849                                     case 0x8:
13850                                       length = 2;
13851                                       spacing = kSingle;
13852                                       break;
13853                                     case 0x9:
13854                                       length = 2;
13855                                       spacing = kDouble;
13856                                       break;
13857                                     case 0x3:
13858                                       length = 4;
13859                                       spacing = kSingle;
13860                                       break;
13861                                   }
13862                                   unsigned last =
13863                                       first +
13864                                       (length - 1) *
13865                                           (spacing == kSingle ? 1 : 2);
13866                                   TransferType transfer = kMultipleLanes;
13867                                   unsigned rn = (instr >> 16) & 0xf;
13868                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13869                                   vld2(CurrentCond(),
13870                                        dt,
13871                                        NeonRegisterList(DRegister(first),
13872                                                         DRegister(last),
13873                                                         spacing,
13874                                                         transfer),
13875                                        AlignedMemOperand(Register(rn),
13876                                                          align,
13877                                                          Offset));
13878                                   break;
13879                                 }
13880                                 case 0x00000400: {
13881                                   // 0xf920040d
13882                                   DataType dt =
13883                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13884                                   if (dt.Is(kDataTypeValueInvalid)) {
13885                                     UnallocatedT32(instr);
13886                                     return;
13887                                   }
13888                                   Alignment align =
13889                                       Align_align_3_Decode((instr >> 4) & 0x3);
13890                                   if (dt.Is(kDataTypeValueInvalid) ||
13891                                       align.Is(kBadAlignment)) {
13892                                     UnallocatedT32(instr);
13893                                     return;
13894                                   }
13895                                   unsigned first =
13896                                       ExtractDRegister(instr, 22, 12);
13897                                   unsigned length;
13898                                   SpacingType spacing;
13899                                   switch ((instr >> 8) & 0xf) {
13900                                     default:
13901                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13902                                     case 0x4:
13903                                       length = 3;
13904                                       spacing = kSingle;
13905                                       break;
13906                                     case 0x5:
13907                                       length = 3;
13908                                       spacing = kDouble;
13909                                       break;
13910                                   }
13911                                   unsigned last =
13912                                       first +
13913                                       (length - 1) *
13914                                           (spacing == kSingle ? 1 : 2);
13915                                   TransferType transfer = kMultipleLanes;
13916                                   unsigned rn = (instr >> 16) & 0xf;
13917                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13918                                   vld3(CurrentCond(),
13919                                        dt,
13920                                        NeonRegisterList(DRegister(first),
13921                                                         DRegister(last),
13922                                                         spacing,
13923                                                         transfer),
13924                                        AlignedMemOperand(Register(rn),
13925                                                          align,
13926                                                          Offset));
13927                                   break;
13928                                 }
13929                                 case 0x00000500: {
13930                                   // 0xf920050d
13931                                   DataType dt =
13932                                       Dt_size_7_Decode((instr >> 6) & 0x3);
13933                                   if (dt.Is(kDataTypeValueInvalid)) {
13934                                     UnallocatedT32(instr);
13935                                     return;
13936                                   }
13937                                   Alignment align =
13938                                       Align_align_3_Decode((instr >> 4) & 0x3);
13939                                   if (dt.Is(kDataTypeValueInvalid) ||
13940                                       align.Is(kBadAlignment)) {
13941                                     UnallocatedT32(instr);
13942                                     return;
13943                                   }
13944                                   unsigned first =
13945                                       ExtractDRegister(instr, 22, 12);
13946                                   unsigned length;
13947                                   SpacingType spacing;
13948                                   switch ((instr >> 8) & 0xf) {
13949                                     default:
13950                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
13951                                     case 0x4:
13952                                       length = 3;
13953                                       spacing = kSingle;
13954                                       break;
13955                                     case 0x5:
13956                                       length = 3;
13957                                       spacing = kDouble;
13958                                       break;
13959                                   }
13960                                   unsigned last =
13961                                       first +
13962                                       (length - 1) *
13963                                           (spacing == kSingle ? 1 : 2);
13964                                   TransferType transfer = kMultipleLanes;
13965                                   unsigned rn = (instr >> 16) & 0xf;
13966                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
13967                                   vld3(CurrentCond(),
13968                                        dt,
13969                                        NeonRegisterList(DRegister(first),
13970                                                         DRegister(last),
13971                                                         spacing,
13972                                                         transfer),
13973                                        AlignedMemOperand(Register(rn),
13974                                                          align,
13975                                                          Offset));
13976                                   break;
13977                                 }
13978                                 case 0x00000600: {
13979                                   // 0xf920060d
13980                                   if (((instr & 0xe20) == 0x620) ||
13981                                       ((instr & 0xf30) == 0xa30)) {
13982                                     UnallocatedT32(instr);
13983                                     return;
13984                                   }
13985                                   DataType dt =
13986                                       Dt_size_6_Decode((instr >> 6) & 0x3);
13987                                   if (dt.Is(kDataTypeValueInvalid)) {
13988                                     UnallocatedT32(instr);
13989                                     return;
13990                                   }
13991                                   Alignment align =
13992                                       Align_align_1_Decode((instr >> 4) & 0x3);
13993                                   if (dt.Is(kDataTypeValueInvalid) ||
13994                                       align.Is(kBadAlignment)) {
13995                                     UnallocatedT32(instr);
13996                                     return;
13997                                   }
13998                                   unsigned first =
13999                                       ExtractDRegister(instr, 22, 12);
14000                                   unsigned length;
14001                                   SpacingType spacing = kSingle;
14002                                   switch ((instr >> 8) & 0xf) {
14003                                     default:
14004                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14005                                     case 0x7:
14006                                       length = 1;
14007                                       break;
14008                                     case 0xa:
14009                                       length = 2;
14010                                       break;
14011                                     case 0x6:
14012                                       length = 3;
14013                                       break;
14014                                     case 0x2:
14015                                       length = 4;
14016                                       break;
14017                                   }
14018                                   unsigned last = first + length - 1;
14019                                   TransferType transfer = kMultipleLanes;
14020                                   unsigned rn = (instr >> 16) & 0xf;
14021                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14022                                   vld1(CurrentCond(),
14023                                        dt,
14024                                        NeonRegisterList(DRegister(first),
14025                                                         DRegister(last),
14026                                                         spacing,
14027                                                         transfer),
14028                                        AlignedMemOperand(Register(rn),
14029                                                          align,
14030                                                          Offset));
14031                                   break;
14032                                 }
14033                                 case 0x00000700: {
14034                                   // 0xf920070d
14035                                   if (((instr & 0xe20) == 0x620) ||
14036                                       ((instr & 0xf30) == 0xa30)) {
14037                                     UnallocatedT32(instr);
14038                                     return;
14039                                   }
14040                                   DataType dt =
14041                                       Dt_size_6_Decode((instr >> 6) & 0x3);
14042                                   if (dt.Is(kDataTypeValueInvalid)) {
14043                                     UnallocatedT32(instr);
14044                                     return;
14045                                   }
14046                                   Alignment align =
14047                                       Align_align_1_Decode((instr >> 4) & 0x3);
14048                                   if (dt.Is(kDataTypeValueInvalid) ||
14049                                       align.Is(kBadAlignment)) {
14050                                     UnallocatedT32(instr);
14051                                     return;
14052                                   }
14053                                   unsigned first =
14054                                       ExtractDRegister(instr, 22, 12);
14055                                   unsigned length;
14056                                   SpacingType spacing = kSingle;
14057                                   switch ((instr >> 8) & 0xf) {
14058                                     default:
14059                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14060                                     case 0x7:
14061                                       length = 1;
14062                                       break;
14063                                     case 0xa:
14064                                       length = 2;
14065                                       break;
14066                                     case 0x6:
14067                                       length = 3;
14068                                       break;
14069                                     case 0x2:
14070                                       length = 4;
14071                                       break;
14072                                   }
14073                                   unsigned last = first + length - 1;
14074                                   TransferType transfer = kMultipleLanes;
14075                                   unsigned rn = (instr >> 16) & 0xf;
14076                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14077                                   vld1(CurrentCond(),
14078                                        dt,
14079                                        NeonRegisterList(DRegister(first),
14080                                                         DRegister(last),
14081                                                         spacing,
14082                                                         transfer),
14083                                        AlignedMemOperand(Register(rn),
14084                                                          align,
14085                                                          Offset));
14086                                   break;
14087                                 }
14088                                 case 0x00000800: {
14089                                   // 0xf920080d
14090                                   if (((instr & 0xe30) == 0x830)) {
14091                                     UnallocatedT32(instr);
14092                                     return;
14093                                   }
14094                                   DataType dt =
14095                                       Dt_size_7_Decode((instr >> 6) & 0x3);
14096                                   if (dt.Is(kDataTypeValueInvalid)) {
14097                                     UnallocatedT32(instr);
14098                                     return;
14099                                   }
14100                                   Alignment align =
14101                                       Align_align_2_Decode((instr >> 4) & 0x3);
14102                                   if (dt.Is(kDataTypeValueInvalid) ||
14103                                       align.Is(kBadAlignment)) {
14104                                     UnallocatedT32(instr);
14105                                     return;
14106                                   }
14107                                   unsigned first =
14108                                       ExtractDRegister(instr, 22, 12);
14109                                   unsigned length;
14110                                   SpacingType spacing;
14111                                   switch ((instr >> 8) & 0xf) {
14112                                     default:
14113                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14114                                     case 0x8:
14115                                       length = 2;
14116                                       spacing = kSingle;
14117                                       break;
14118                                     case 0x9:
14119                                       length = 2;
14120                                       spacing = kDouble;
14121                                       break;
14122                                     case 0x3:
14123                                       length = 4;
14124                                       spacing = kSingle;
14125                                       break;
14126                                   }
14127                                   unsigned last =
14128                                       first +
14129                                       (length - 1) *
14130                                           (spacing == kSingle ? 1 : 2);
14131                                   TransferType transfer = kMultipleLanes;
14132                                   unsigned rn = (instr >> 16) & 0xf;
14133                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14134                                   vld2(CurrentCond(),
14135                                        dt,
14136                                        NeonRegisterList(DRegister(first),
14137                                                         DRegister(last),
14138                                                         spacing,
14139                                                         transfer),
14140                                        AlignedMemOperand(Register(rn),
14141                                                          align,
14142                                                          Offset));
14143                                   break;
14144                                 }
14145                                 case 0x00000900: {
14146                                   // 0xf920090d
14147                                   if (((instr & 0xe30) == 0x830)) {
14148                                     UnallocatedT32(instr);
14149                                     return;
14150                                   }
14151                                   DataType dt =
14152                                       Dt_size_7_Decode((instr >> 6) & 0x3);
14153                                   if (dt.Is(kDataTypeValueInvalid)) {
14154                                     UnallocatedT32(instr);
14155                                     return;
14156                                   }
14157                                   Alignment align =
14158                                       Align_align_2_Decode((instr >> 4) & 0x3);
14159                                   if (dt.Is(kDataTypeValueInvalid) ||
14160                                       align.Is(kBadAlignment)) {
14161                                     UnallocatedT32(instr);
14162                                     return;
14163                                   }
14164                                   unsigned first =
14165                                       ExtractDRegister(instr, 22, 12);
14166                                   unsigned length;
14167                                   SpacingType spacing;
14168                                   switch ((instr >> 8) & 0xf) {
14169                                     default:
14170                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14171                                     case 0x8:
14172                                       length = 2;
14173                                       spacing = kSingle;
14174                                       break;
14175                                     case 0x9:
14176                                       length = 2;
14177                                       spacing = kDouble;
14178                                       break;
14179                                     case 0x3:
14180                                       length = 4;
14181                                       spacing = kSingle;
14182                                       break;
14183                                   }
14184                                   unsigned last =
14185                                       first +
14186                                       (length - 1) *
14187                                           (spacing == kSingle ? 1 : 2);
14188                                   TransferType transfer = kMultipleLanes;
14189                                   unsigned rn = (instr >> 16) & 0xf;
14190                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14191                                   vld2(CurrentCond(),
14192                                        dt,
14193                                        NeonRegisterList(DRegister(first),
14194                                                         DRegister(last),
14195                                                         spacing,
14196                                                         transfer),
14197                                        AlignedMemOperand(Register(rn),
14198                                                          align,
14199                                                          Offset));
14200                                   break;
14201                                 }
14202                                 case 0x00000a00: {
14203                                   // 0xf9200a0d
14204                                   if (((instr & 0xe20) == 0x620) ||
14205                                       ((instr & 0xf30) == 0xa30)) {
14206                                     UnallocatedT32(instr);
14207                                     return;
14208                                   }
14209                                   DataType dt =
14210                                       Dt_size_6_Decode((instr >> 6) & 0x3);
14211                                   if (dt.Is(kDataTypeValueInvalid)) {
14212                                     UnallocatedT32(instr);
14213                                     return;
14214                                   }
14215                                   Alignment align =
14216                                       Align_align_1_Decode((instr >> 4) & 0x3);
14217                                   if (dt.Is(kDataTypeValueInvalid) ||
14218                                       align.Is(kBadAlignment)) {
14219                                     UnallocatedT32(instr);
14220                                     return;
14221                                   }
14222                                   unsigned first =
14223                                       ExtractDRegister(instr, 22, 12);
14224                                   unsigned length;
14225                                   SpacingType spacing = kSingle;
14226                                   switch ((instr >> 8) & 0xf) {
14227                                     default:
14228                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
14229                                     case 0x7:
14230                                       length = 1;
14231                                       break;
14232                                     case 0xa:
14233                                       length = 2;
14234                                       break;
14235                                     case 0x6:
14236                                       length = 3;
14237                                       break;
14238                                     case 0x2:
14239                                       length = 4;
14240                                       break;
14241                                   }
14242                                   unsigned last = first + length - 1;
14243                                   TransferType transfer = kMultipleLanes;
14244                                   unsigned rn = (instr >> 16) & 0xf;
14245                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14246                                   vld1(CurrentCond(),
14247                                        dt,
14248                                        NeonRegisterList(DRegister(first),
14249                                                         DRegister(last),
14250                                                         spacing,
14251                                                         transfer),
14252                                        AlignedMemOperand(Register(rn),
14253                                                          align,
14254                                                          Offset));
14255                                   break;
14256                                 }
14257                                 default:
14258                                   UnallocatedT32(instr);
14259                                   break;
14260                               }
14261                               break;
14262                             }
14263                           }
14264                           break;
14265                         }
14266                         default: {
14267                           switch (instr & 0x00000f00) {
14268                             case 0x00000000: {
14269                               // 0xf9200000
14270                               if (((instr & 0xd) == 0xd)) {
14271                                 UnallocatedT32(instr);
14272                                 return;
14273                               }
14274                               DataType dt =
14275                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14276                               if (dt.Is(kDataTypeValueInvalid)) {
14277                                 UnallocatedT32(instr);
14278                                 return;
14279                               }
14280                               Alignment align =
14281                                   Align_align_4_Decode((instr >> 4) & 0x3);
14282                               if (dt.Is(kDataTypeValueInvalid) ||
14283                                   align.Is(kBadAlignment)) {
14284                                 UnallocatedT32(instr);
14285                                 return;
14286                               }
14287                               unsigned first = ExtractDRegister(instr, 22, 12);
14288                               unsigned length;
14289                               SpacingType spacing;
14290                               switch ((instr >> 8) & 0xf) {
14291                                 default:
14292                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14293                                 case 0x0:
14294                                   length = 4;
14295                                   spacing = kSingle;
14296                                   break;
14297                                 case 0x1:
14298                                   length = 4;
14299                                   spacing = kDouble;
14300                                   break;
14301                               }
14302                               unsigned last =
14303                                   first +
14304                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14305                               TransferType transfer = kMultipleLanes;
14306                               unsigned rn = (instr >> 16) & 0xf;
14307                               unsigned rm = instr & 0xf;
14308                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14309                               vld4(CurrentCond(),
14310                                    dt,
14311                                    NeonRegisterList(DRegister(first),
14312                                                     DRegister(last),
14313                                                     spacing,
14314                                                     transfer),
14315                                    AlignedMemOperand(Register(rn),
14316                                                      align,
14317                                                      Register(rm),
14318                                                      PostIndex));
14319                               break;
14320                             }
14321                             case 0x00000100: {
14322                               // 0xf9200100
14323                               if (((instr & 0xd) == 0xd)) {
14324                                 UnallocatedT32(instr);
14325                                 return;
14326                               }
14327                               DataType dt =
14328                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14329                               if (dt.Is(kDataTypeValueInvalid)) {
14330                                 UnallocatedT32(instr);
14331                                 return;
14332                               }
14333                               Alignment align =
14334                                   Align_align_4_Decode((instr >> 4) & 0x3);
14335                               if (dt.Is(kDataTypeValueInvalid) ||
14336                                   align.Is(kBadAlignment)) {
14337                                 UnallocatedT32(instr);
14338                                 return;
14339                               }
14340                               unsigned first = ExtractDRegister(instr, 22, 12);
14341                               unsigned length;
14342                               SpacingType spacing;
14343                               switch ((instr >> 8) & 0xf) {
14344                                 default:
14345                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14346                                 case 0x0:
14347                                   length = 4;
14348                                   spacing = kSingle;
14349                                   break;
14350                                 case 0x1:
14351                                   length = 4;
14352                                   spacing = kDouble;
14353                                   break;
14354                               }
14355                               unsigned last =
14356                                   first +
14357                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14358                               TransferType transfer = kMultipleLanes;
14359                               unsigned rn = (instr >> 16) & 0xf;
14360                               unsigned rm = instr & 0xf;
14361                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14362                               vld4(CurrentCond(),
14363                                    dt,
14364                                    NeonRegisterList(DRegister(first),
14365                                                     DRegister(last),
14366                                                     spacing,
14367                                                     transfer),
14368                                    AlignedMemOperand(Register(rn),
14369                                                      align,
14370                                                      Register(rm),
14371                                                      PostIndex));
14372                               break;
14373                             }
14374                             case 0x00000200: {
14375                               // 0xf9200200
14376                               if (((instr & 0xd) == 0xd) ||
14377                                   ((instr & 0xe20) == 0x620) ||
14378                                   ((instr & 0xf30) == 0xa30)) {
14379                                 UnallocatedT32(instr);
14380                                 return;
14381                               }
14382                               DataType dt =
14383                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14384                               if (dt.Is(kDataTypeValueInvalid)) {
14385                                 UnallocatedT32(instr);
14386                                 return;
14387                               }
14388                               Alignment align =
14389                                   Align_align_1_Decode((instr >> 4) & 0x3);
14390                               if (dt.Is(kDataTypeValueInvalid) ||
14391                                   align.Is(kBadAlignment)) {
14392                                 UnallocatedT32(instr);
14393                                 return;
14394                               }
14395                               unsigned first = ExtractDRegister(instr, 22, 12);
14396                               unsigned length;
14397                               SpacingType spacing = kSingle;
14398                               switch ((instr >> 8) & 0xf) {
14399                                 default:
14400                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14401                                 case 0x7:
14402                                   length = 1;
14403                                   break;
14404                                 case 0xa:
14405                                   length = 2;
14406                                   break;
14407                                 case 0x6:
14408                                   length = 3;
14409                                   break;
14410                                 case 0x2:
14411                                   length = 4;
14412                                   break;
14413                               }
14414                               unsigned last = first + length - 1;
14415                               TransferType transfer = kMultipleLanes;
14416                               unsigned rn = (instr >> 16) & 0xf;
14417                               unsigned rm = instr & 0xf;
14418                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14419                               vld1(CurrentCond(),
14420                                    dt,
14421                                    NeonRegisterList(DRegister(first),
14422                                                     DRegister(last),
14423                                                     spacing,
14424                                                     transfer),
14425                                    AlignedMemOperand(Register(rn),
14426                                                      align,
14427                                                      Register(rm),
14428                                                      PostIndex));
14429                               break;
14430                             }
14431                             case 0x00000300: {
14432                               // 0xf9200300
14433                               if (((instr & 0xd) == 0xd) ||
14434                                   ((instr & 0xe30) == 0x830)) {
14435                                 UnallocatedT32(instr);
14436                                 return;
14437                               }
14438                               DataType dt =
14439                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14440                               if (dt.Is(kDataTypeValueInvalid)) {
14441                                 UnallocatedT32(instr);
14442                                 return;
14443                               }
14444                               Alignment align =
14445                                   Align_align_2_Decode((instr >> 4) & 0x3);
14446                               if (dt.Is(kDataTypeValueInvalid) ||
14447                                   align.Is(kBadAlignment)) {
14448                                 UnallocatedT32(instr);
14449                                 return;
14450                               }
14451                               unsigned first = ExtractDRegister(instr, 22, 12);
14452                               unsigned length;
14453                               SpacingType spacing;
14454                               switch ((instr >> 8) & 0xf) {
14455                                 default:
14456                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14457                                 case 0x8:
14458                                   length = 2;
14459                                   spacing = kSingle;
14460                                   break;
14461                                 case 0x9:
14462                                   length = 2;
14463                                   spacing = kDouble;
14464                                   break;
14465                                 case 0x3:
14466                                   length = 4;
14467                                   spacing = kSingle;
14468                                   break;
14469                               }
14470                               unsigned last =
14471                                   first +
14472                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14473                               TransferType transfer = kMultipleLanes;
14474                               unsigned rn = (instr >> 16) & 0xf;
14475                               unsigned rm = instr & 0xf;
14476                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14477                               vld2(CurrentCond(),
14478                                    dt,
14479                                    NeonRegisterList(DRegister(first),
14480                                                     DRegister(last),
14481                                                     spacing,
14482                                                     transfer),
14483                                    AlignedMemOperand(Register(rn),
14484                                                      align,
14485                                                      Register(rm),
14486                                                      PostIndex));
14487                               break;
14488                             }
14489                             case 0x00000400: {
14490                               // 0xf9200400
14491                               if (((instr & 0xd) == 0xd)) {
14492                                 UnallocatedT32(instr);
14493                                 return;
14494                               }
14495                               DataType dt =
14496                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14497                               if (dt.Is(kDataTypeValueInvalid)) {
14498                                 UnallocatedT32(instr);
14499                                 return;
14500                               }
14501                               Alignment align =
14502                                   Align_align_3_Decode((instr >> 4) & 0x3);
14503                               if (dt.Is(kDataTypeValueInvalid) ||
14504                                   align.Is(kBadAlignment)) {
14505                                 UnallocatedT32(instr);
14506                                 return;
14507                               }
14508                               unsigned first = ExtractDRegister(instr, 22, 12);
14509                               unsigned length;
14510                               SpacingType spacing;
14511                               switch ((instr >> 8) & 0xf) {
14512                                 default:
14513                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14514                                 case 0x4:
14515                                   length = 3;
14516                                   spacing = kSingle;
14517                                   break;
14518                                 case 0x5:
14519                                   length = 3;
14520                                   spacing = kDouble;
14521                                   break;
14522                               }
14523                               unsigned last =
14524                                   first +
14525                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14526                               TransferType transfer = kMultipleLanes;
14527                               unsigned rn = (instr >> 16) & 0xf;
14528                               unsigned rm = instr & 0xf;
14529                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14530                               vld3(CurrentCond(),
14531                                    dt,
14532                                    NeonRegisterList(DRegister(first),
14533                                                     DRegister(last),
14534                                                     spacing,
14535                                                     transfer),
14536                                    AlignedMemOperand(Register(rn),
14537                                                      align,
14538                                                      Register(rm),
14539                                                      PostIndex));
14540                               break;
14541                             }
14542                             case 0x00000500: {
14543                               // 0xf9200500
14544                               if (((instr & 0xd) == 0xd)) {
14545                                 UnallocatedT32(instr);
14546                                 return;
14547                               }
14548                               DataType dt =
14549                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14550                               if (dt.Is(kDataTypeValueInvalid)) {
14551                                 UnallocatedT32(instr);
14552                                 return;
14553                               }
14554                               Alignment align =
14555                                   Align_align_3_Decode((instr >> 4) & 0x3);
14556                               if (dt.Is(kDataTypeValueInvalid) ||
14557                                   align.Is(kBadAlignment)) {
14558                                 UnallocatedT32(instr);
14559                                 return;
14560                               }
14561                               unsigned first = ExtractDRegister(instr, 22, 12);
14562                               unsigned length;
14563                               SpacingType spacing;
14564                               switch ((instr >> 8) & 0xf) {
14565                                 default:
14566                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14567                                 case 0x4:
14568                                   length = 3;
14569                                   spacing = kSingle;
14570                                   break;
14571                                 case 0x5:
14572                                   length = 3;
14573                                   spacing = kDouble;
14574                                   break;
14575                               }
14576                               unsigned last =
14577                                   first +
14578                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14579                               TransferType transfer = kMultipleLanes;
14580                               unsigned rn = (instr >> 16) & 0xf;
14581                               unsigned rm = instr & 0xf;
14582                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14583                               vld3(CurrentCond(),
14584                                    dt,
14585                                    NeonRegisterList(DRegister(first),
14586                                                     DRegister(last),
14587                                                     spacing,
14588                                                     transfer),
14589                                    AlignedMemOperand(Register(rn),
14590                                                      align,
14591                                                      Register(rm),
14592                                                      PostIndex));
14593                               break;
14594                             }
14595                             case 0x00000600: {
14596                               // 0xf9200600
14597                               if (((instr & 0xd) == 0xd) ||
14598                                   ((instr & 0xe20) == 0x620) ||
14599                                   ((instr & 0xf30) == 0xa30)) {
14600                                 UnallocatedT32(instr);
14601                                 return;
14602                               }
14603                               DataType dt =
14604                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14605                               if (dt.Is(kDataTypeValueInvalid)) {
14606                                 UnallocatedT32(instr);
14607                                 return;
14608                               }
14609                               Alignment align =
14610                                   Align_align_1_Decode((instr >> 4) & 0x3);
14611                               if (dt.Is(kDataTypeValueInvalid) ||
14612                                   align.Is(kBadAlignment)) {
14613                                 UnallocatedT32(instr);
14614                                 return;
14615                               }
14616                               unsigned first = ExtractDRegister(instr, 22, 12);
14617                               unsigned length;
14618                               SpacingType spacing = kSingle;
14619                               switch ((instr >> 8) & 0xf) {
14620                                 default:
14621                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14622                                 case 0x7:
14623                                   length = 1;
14624                                   break;
14625                                 case 0xa:
14626                                   length = 2;
14627                                   break;
14628                                 case 0x6:
14629                                   length = 3;
14630                                   break;
14631                                 case 0x2:
14632                                   length = 4;
14633                                   break;
14634                               }
14635                               unsigned last = first + length - 1;
14636                               TransferType transfer = kMultipleLanes;
14637                               unsigned rn = (instr >> 16) & 0xf;
14638                               unsigned rm = instr & 0xf;
14639                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14640                               vld1(CurrentCond(),
14641                                    dt,
14642                                    NeonRegisterList(DRegister(first),
14643                                                     DRegister(last),
14644                                                     spacing,
14645                                                     transfer),
14646                                    AlignedMemOperand(Register(rn),
14647                                                      align,
14648                                                      Register(rm),
14649                                                      PostIndex));
14650                               break;
14651                             }
14652                             case 0x00000700: {
14653                               // 0xf9200700
14654                               if (((instr & 0xd) == 0xd) ||
14655                                   ((instr & 0xe20) == 0x620) ||
14656                                   ((instr & 0xf30) == 0xa30)) {
14657                                 UnallocatedT32(instr);
14658                                 return;
14659                               }
14660                               DataType dt =
14661                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14662                               if (dt.Is(kDataTypeValueInvalid)) {
14663                                 UnallocatedT32(instr);
14664                                 return;
14665                               }
14666                               Alignment align =
14667                                   Align_align_1_Decode((instr >> 4) & 0x3);
14668                               if (dt.Is(kDataTypeValueInvalid) ||
14669                                   align.Is(kBadAlignment)) {
14670                                 UnallocatedT32(instr);
14671                                 return;
14672                               }
14673                               unsigned first = ExtractDRegister(instr, 22, 12);
14674                               unsigned length;
14675                               SpacingType spacing = kSingle;
14676                               switch ((instr >> 8) & 0xf) {
14677                                 default:
14678                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14679                                 case 0x7:
14680                                   length = 1;
14681                                   break;
14682                                 case 0xa:
14683                                   length = 2;
14684                                   break;
14685                                 case 0x6:
14686                                   length = 3;
14687                                   break;
14688                                 case 0x2:
14689                                   length = 4;
14690                                   break;
14691                               }
14692                               unsigned last = first + length - 1;
14693                               TransferType transfer = kMultipleLanes;
14694                               unsigned rn = (instr >> 16) & 0xf;
14695                               unsigned rm = instr & 0xf;
14696                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14697                               vld1(CurrentCond(),
14698                                    dt,
14699                                    NeonRegisterList(DRegister(first),
14700                                                     DRegister(last),
14701                                                     spacing,
14702                                                     transfer),
14703                                    AlignedMemOperand(Register(rn),
14704                                                      align,
14705                                                      Register(rm),
14706                                                      PostIndex));
14707                               break;
14708                             }
14709                             case 0x00000800: {
14710                               // 0xf9200800
14711                               if (((instr & 0xd) == 0xd) ||
14712                                   ((instr & 0xe30) == 0x830)) {
14713                                 UnallocatedT32(instr);
14714                                 return;
14715                               }
14716                               DataType dt =
14717                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14718                               if (dt.Is(kDataTypeValueInvalid)) {
14719                                 UnallocatedT32(instr);
14720                                 return;
14721                               }
14722                               Alignment align =
14723                                   Align_align_2_Decode((instr >> 4) & 0x3);
14724                               if (dt.Is(kDataTypeValueInvalid) ||
14725                                   align.Is(kBadAlignment)) {
14726                                 UnallocatedT32(instr);
14727                                 return;
14728                               }
14729                               unsigned first = ExtractDRegister(instr, 22, 12);
14730                               unsigned length;
14731                               SpacingType spacing;
14732                               switch ((instr >> 8) & 0xf) {
14733                                 default:
14734                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14735                                 case 0x8:
14736                                   length = 2;
14737                                   spacing = kSingle;
14738                                   break;
14739                                 case 0x9:
14740                                   length = 2;
14741                                   spacing = kDouble;
14742                                   break;
14743                                 case 0x3:
14744                                   length = 4;
14745                                   spacing = kSingle;
14746                                   break;
14747                               }
14748                               unsigned last =
14749                                   first +
14750                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14751                               TransferType transfer = kMultipleLanes;
14752                               unsigned rn = (instr >> 16) & 0xf;
14753                               unsigned rm = instr & 0xf;
14754                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14755                               vld2(CurrentCond(),
14756                                    dt,
14757                                    NeonRegisterList(DRegister(first),
14758                                                     DRegister(last),
14759                                                     spacing,
14760                                                     transfer),
14761                                    AlignedMemOperand(Register(rn),
14762                                                      align,
14763                                                      Register(rm),
14764                                                      PostIndex));
14765                               break;
14766                             }
14767                             case 0x00000900: {
14768                               // 0xf9200900
14769                               if (((instr & 0xd) == 0xd) ||
14770                                   ((instr & 0xe30) == 0x830)) {
14771                                 UnallocatedT32(instr);
14772                                 return;
14773                               }
14774                               DataType dt =
14775                                   Dt_size_7_Decode((instr >> 6) & 0x3);
14776                               if (dt.Is(kDataTypeValueInvalid)) {
14777                                 UnallocatedT32(instr);
14778                                 return;
14779                               }
14780                               Alignment align =
14781                                   Align_align_2_Decode((instr >> 4) & 0x3);
14782                               if (dt.Is(kDataTypeValueInvalid) ||
14783                                   align.Is(kBadAlignment)) {
14784                                 UnallocatedT32(instr);
14785                                 return;
14786                               }
14787                               unsigned first = ExtractDRegister(instr, 22, 12);
14788                               unsigned length;
14789                               SpacingType spacing;
14790                               switch ((instr >> 8) & 0xf) {
14791                                 default:
14792                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14793                                 case 0x8:
14794                                   length = 2;
14795                                   spacing = kSingle;
14796                                   break;
14797                                 case 0x9:
14798                                   length = 2;
14799                                   spacing = kDouble;
14800                                   break;
14801                                 case 0x3:
14802                                   length = 4;
14803                                   spacing = kSingle;
14804                                   break;
14805                               }
14806                               unsigned last =
14807                                   first +
14808                                   (length - 1) * (spacing == kSingle ? 1 : 2);
14809                               TransferType transfer = kMultipleLanes;
14810                               unsigned rn = (instr >> 16) & 0xf;
14811                               unsigned rm = instr & 0xf;
14812                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14813                               vld2(CurrentCond(),
14814                                    dt,
14815                                    NeonRegisterList(DRegister(first),
14816                                                     DRegister(last),
14817                                                     spacing,
14818                                                     transfer),
14819                                    AlignedMemOperand(Register(rn),
14820                                                      align,
14821                                                      Register(rm),
14822                                                      PostIndex));
14823                               break;
14824                             }
14825                             case 0x00000a00: {
14826                               // 0xf9200a00
14827                               if (((instr & 0xd) == 0xd) ||
14828                                   ((instr & 0xe20) == 0x620) ||
14829                                   ((instr & 0xf30) == 0xa30)) {
14830                                 UnallocatedT32(instr);
14831                                 return;
14832                               }
14833                               DataType dt =
14834                                   Dt_size_6_Decode((instr >> 6) & 0x3);
14835                               if (dt.Is(kDataTypeValueInvalid)) {
14836                                 UnallocatedT32(instr);
14837                                 return;
14838                               }
14839                               Alignment align =
14840                                   Align_align_1_Decode((instr >> 4) & 0x3);
14841                               if (dt.Is(kDataTypeValueInvalid) ||
14842                                   align.Is(kBadAlignment)) {
14843                                 UnallocatedT32(instr);
14844                                 return;
14845                               }
14846                               unsigned first = ExtractDRegister(instr, 22, 12);
14847                               unsigned length;
14848                               SpacingType spacing = kSingle;
14849                               switch ((instr >> 8) & 0xf) {
14850                                 default:
14851                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
14852                                 case 0x7:
14853                                   length = 1;
14854                                   break;
14855                                 case 0xa:
14856                                   length = 2;
14857                                   break;
14858                                 case 0x6:
14859                                   length = 3;
14860                                   break;
14861                                 case 0x2:
14862                                   length = 4;
14863                                   break;
14864                               }
14865                               unsigned last = first + length - 1;
14866                               TransferType transfer = kMultipleLanes;
14867                               unsigned rn = (instr >> 16) & 0xf;
14868                               unsigned rm = instr & 0xf;
14869                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
14870                               vld1(CurrentCond(),
14871                                    dt,
14872                                    NeonRegisterList(DRegister(first),
14873                                                     DRegister(last),
14874                                                     spacing,
14875                                                     transfer),
14876                                    AlignedMemOperand(Register(rn),
14877                                                      align,
14878                                                      Register(rm),
14879                                                      PostIndex));
14880                               break;
14881                             }
14882                             default:
14883                               UnallocatedT32(instr);
14884                               break;
14885                           }
14886                           break;
14887                         }
14888                       }
14889                       break;
14890                     }
14891                     case 0x01800000: {
14892                       // 0xf9800000
14893                       switch (instr & 0x00000300) {
14894                         case 0x00000000: {
14895                           // 0xf9800000
14896                           switch (instr & 0x00000c00) {
14897                             case 0x00000c00: {
14898                               // 0xf9800c00
14899                               UnallocatedT32(instr);
14900                               break;
14901                             }
14902                             default: {
14903                               switch (instr & 0x0000000d) {
14904                                 case 0x0000000d: {
14905                                   // 0xf980000d
14906                                   switch (instr & 0x00000002) {
14907                                     case 0x00000000: {
14908                                       // 0xf980000d
14909                                       if (((instr & 0xc00) == 0xc00)) {
14910                                         UnallocatedT32(instr);
14911                                         return;
14912                                       }
14913                                       DataType dt =
14914                                           Dt_size_7_Decode((instr >> 10) & 0x3);
14915                                       if (dt.Is(kDataTypeValueInvalid)) {
14916                                         UnallocatedT32(instr);
14917                                         return;
14918                                       }
14919                                       DecodeNeonAndAlign decode_neon =
14920                                           Align_index_align_1_Decode((instr >>
14921                                                                       4) &
14922                                                                          0xf,
14923                                                                      dt);
14924                                       if (!decode_neon.IsValid()) {
14925                                         UnallocatedT32(instr);
14926                                         return;
14927                                       }
14928                                       Alignment align = decode_neon.GetAlign();
14929                                       int lane = decode_neon.GetLane();
14930                                       SpacingType spacing =
14931                                           decode_neon.GetSpacing();
14932                                       unsigned first =
14933                                           ExtractDRegister(instr, 22, 12);
14934                                       unsigned length = 1;
14935                                       unsigned last = first + length - 1;
14936                                       unsigned rn = (instr >> 16) & 0xf;
14937                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
14938                                       vst1(CurrentCond(),
14939                                            dt,
14940                                            NeonRegisterList(DRegister(first),
14941                                                             DRegister(last),
14942                                                             spacing,
14943                                                             lane),
14944                                            AlignedMemOperand(Register(rn),
14945                                                              align,
14946                                                              PostIndex));
14947                                       break;
14948                                     }
14949                                     case 0x00000002: {
14950                                       // 0xf980000f
14951                                       if (((instr & 0xc00) == 0xc00)) {
14952                                         UnallocatedT32(instr);
14953                                         return;
14954                                       }
14955                                       DataType dt =
14956                                           Dt_size_7_Decode((instr >> 10) & 0x3);
14957                                       if (dt.Is(kDataTypeValueInvalid)) {
14958                                         UnallocatedT32(instr);
14959                                         return;
14960                                       }
14961                                       DecodeNeonAndAlign decode_neon =
14962                                           Align_index_align_1_Decode((instr >>
14963                                                                       4) &
14964                                                                          0xf,
14965                                                                      dt);
14966                                       if (!decode_neon.IsValid()) {
14967                                         UnallocatedT32(instr);
14968                                         return;
14969                                       }
14970                                       Alignment align = decode_neon.GetAlign();
14971                                       int lane = decode_neon.GetLane();
14972                                       SpacingType spacing =
14973                                           decode_neon.GetSpacing();
14974                                       unsigned first =
14975                                           ExtractDRegister(instr, 22, 12);
14976                                       unsigned length = 1;
14977                                       unsigned last = first + length - 1;
14978                                       unsigned rn = (instr >> 16) & 0xf;
14979                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
14980                                       vst1(CurrentCond(),
14981                                            dt,
14982                                            NeonRegisterList(DRegister(first),
14983                                                             DRegister(last),
14984                                                             spacing,
14985                                                             lane),
14986                                            AlignedMemOperand(Register(rn),
14987                                                              align,
14988                                                              Offset));
14989                                       break;
14990                                     }
14991                                   }
14992                                   break;
14993                                 }
14994                                 default: {
14995                                   if (((instr & 0xc00) == 0xc00) ||
14996                                       ((instr & 0xd) == 0xd)) {
14997                                     UnallocatedT32(instr);
14998                                     return;
14999                                   }
15000                                   DataType dt =
15001                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15002                                   if (dt.Is(kDataTypeValueInvalid)) {
15003                                     UnallocatedT32(instr);
15004                                     return;
15005                                   }
15006                                   DecodeNeonAndAlign decode_neon =
15007                                       Align_index_align_1_Decode((instr >> 4) &
15008                                                                      0xf,
15009                                                                  dt);
15010                                   if (!decode_neon.IsValid()) {
15011                                     UnallocatedT32(instr);
15012                                     return;
15013                                   }
15014                                   Alignment align = decode_neon.GetAlign();
15015                                   int lane = decode_neon.GetLane();
15016                                   SpacingType spacing =
15017                                       decode_neon.GetSpacing();
15018                                   unsigned first =
15019                                       ExtractDRegister(instr, 22, 12);
15020                                   unsigned length = 1;
15021                                   unsigned last = first + length - 1;
15022                                   unsigned rn = (instr >> 16) & 0xf;
15023                                   unsigned rm = instr & 0xf;
15024                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15025                                   vst1(CurrentCond(),
15026                                        dt,
15027                                        NeonRegisterList(DRegister(first),
15028                                                         DRegister(last),
15029                                                         spacing,
15030                                                         lane),
15031                                        AlignedMemOperand(Register(rn),
15032                                                          align,
15033                                                          Register(rm),
15034                                                          PostIndex));
15035                                   break;
15036                                 }
15037                               }
15038                               break;
15039                             }
15040                           }
15041                           break;
15042                         }
15043                         case 0x00000100: {
15044                           // 0xf9800100
15045                           switch (instr & 0x00000c00) {
15046                             case 0x00000c00: {
15047                               // 0xf9800d00
15048                               UnallocatedT32(instr);
15049                               break;
15050                             }
15051                             default: {
15052                               switch (instr & 0x0000000d) {
15053                                 case 0x0000000d: {
15054                                   // 0xf980010d
15055                                   switch (instr & 0x00000002) {
15056                                     case 0x00000000: {
15057                                       // 0xf980010d
15058                                       if (((instr & 0xc00) == 0xc00)) {
15059                                         UnallocatedT32(instr);
15060                                         return;
15061                                       }
15062                                       DataType dt =
15063                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15064                                       if (dt.Is(kDataTypeValueInvalid)) {
15065                                         UnallocatedT32(instr);
15066                                         return;
15067                                       }
15068                                       DecodeNeonAndAlign decode_neon =
15069                                           Align_index_align_2_Decode((instr >>
15070                                                                       4) &
15071                                                                          0xf,
15072                                                                      dt);
15073                                       if (!decode_neon.IsValid()) {
15074                                         UnallocatedT32(instr);
15075                                         return;
15076                                       }
15077                                       Alignment align = decode_neon.GetAlign();
15078                                       int lane = decode_neon.GetLane();
15079                                       SpacingType spacing =
15080                                           decode_neon.GetSpacing();
15081                                       unsigned first =
15082                                           ExtractDRegister(instr, 22, 12);
15083                                       unsigned length = 2;
15084                                       unsigned last =
15085                                           first +
15086                                           (length - 1) *
15087                                               (spacing == kSingle ? 1 : 2);
15088                                       unsigned rn = (instr >> 16) & 0xf;
15089                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15090                                       vst2(CurrentCond(),
15091                                            dt,
15092                                            NeonRegisterList(DRegister(first),
15093                                                             DRegister(last),
15094                                                             spacing,
15095                                                             lane),
15096                                            AlignedMemOperand(Register(rn),
15097                                                              align,
15098                                                              PostIndex));
15099                                       break;
15100                                     }
15101                                     case 0x00000002: {
15102                                       // 0xf980010f
15103                                       if (((instr & 0xc00) == 0xc00)) {
15104                                         UnallocatedT32(instr);
15105                                         return;
15106                                       }
15107                                       DataType dt =
15108                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15109                                       if (dt.Is(kDataTypeValueInvalid)) {
15110                                         UnallocatedT32(instr);
15111                                         return;
15112                                       }
15113                                       DecodeNeonAndAlign decode_neon =
15114                                           Align_index_align_2_Decode((instr >>
15115                                                                       4) &
15116                                                                          0xf,
15117                                                                      dt);
15118                                       if (!decode_neon.IsValid()) {
15119                                         UnallocatedT32(instr);
15120                                         return;
15121                                       }
15122                                       Alignment align = decode_neon.GetAlign();
15123                                       int lane = decode_neon.GetLane();
15124                                       SpacingType spacing =
15125                                           decode_neon.GetSpacing();
15126                                       unsigned first =
15127                                           ExtractDRegister(instr, 22, 12);
15128                                       unsigned length = 2;
15129                                       unsigned last =
15130                                           first +
15131                                           (length - 1) *
15132                                               (spacing == kSingle ? 1 : 2);
15133                                       unsigned rn = (instr >> 16) & 0xf;
15134                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15135                                       vst2(CurrentCond(),
15136                                            dt,
15137                                            NeonRegisterList(DRegister(first),
15138                                                             DRegister(last),
15139                                                             spacing,
15140                                                             lane),
15141                                            AlignedMemOperand(Register(rn),
15142                                                              align,
15143                                                              Offset));
15144                                       break;
15145                                     }
15146                                   }
15147                                   break;
15148                                 }
15149                                 default: {
15150                                   if (((instr & 0xc00) == 0xc00) ||
15151                                       ((instr & 0xd) == 0xd)) {
15152                                     UnallocatedT32(instr);
15153                                     return;
15154                                   }
15155                                   DataType dt =
15156                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15157                                   if (dt.Is(kDataTypeValueInvalid)) {
15158                                     UnallocatedT32(instr);
15159                                     return;
15160                                   }
15161                                   DecodeNeonAndAlign decode_neon =
15162                                       Align_index_align_2_Decode((instr >> 4) &
15163                                                                      0xf,
15164                                                                  dt);
15165                                   if (!decode_neon.IsValid()) {
15166                                     UnallocatedT32(instr);
15167                                     return;
15168                                   }
15169                                   Alignment align = decode_neon.GetAlign();
15170                                   int lane = decode_neon.GetLane();
15171                                   SpacingType spacing =
15172                                       decode_neon.GetSpacing();
15173                                   unsigned first =
15174                                       ExtractDRegister(instr, 22, 12);
15175                                   unsigned length = 2;
15176                                   unsigned last =
15177                                       first +
15178                                       (length - 1) *
15179                                           (spacing == kSingle ? 1 : 2);
15180                                   unsigned rn = (instr >> 16) & 0xf;
15181                                   unsigned rm = instr & 0xf;
15182                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15183                                   vst2(CurrentCond(),
15184                                        dt,
15185                                        NeonRegisterList(DRegister(first),
15186                                                         DRegister(last),
15187                                                         spacing,
15188                                                         lane),
15189                                        AlignedMemOperand(Register(rn),
15190                                                          align,
15191                                                          Register(rm),
15192                                                          PostIndex));
15193                                   break;
15194                                 }
15195                               }
15196                               break;
15197                             }
15198                           }
15199                           break;
15200                         }
15201                         case 0x00000200: {
15202                           // 0xf9800200
15203                           switch (instr & 0x00000c30) {
15204                             case 0x00000010: {
15205                               // 0xf9800210
15206                               UnallocatedT32(instr);
15207                               break;
15208                             }
15209                             case 0x00000030: {
15210                               // 0xf9800230
15211                               UnallocatedT32(instr);
15212                               break;
15213                             }
15214                             case 0x00000410: {
15215                               // 0xf9800610
15216                               UnallocatedT32(instr);
15217                               break;
15218                             }
15219                             case 0x00000430: {
15220                               // 0xf9800630
15221                               UnallocatedT32(instr);
15222                               break;
15223                             }
15224                             case 0x00000810: {
15225                               // 0xf9800a10
15226                               UnallocatedT32(instr);
15227                               break;
15228                             }
15229                             case 0x00000820: {
15230                               // 0xf9800a20
15231                               UnallocatedT32(instr);
15232                               break;
15233                             }
15234                             case 0x00000830: {
15235                               // 0xf9800a30
15236                               UnallocatedT32(instr);
15237                               break;
15238                             }
15239                             case 0x00000c00: {
15240                               // 0xf9800e00
15241                               UnallocatedT32(instr);
15242                               break;
15243                             }
15244                             case 0x00000c10: {
15245                               // 0xf9800e10
15246                               UnallocatedT32(instr);
15247                               break;
15248                             }
15249                             case 0x00000c20: {
15250                               // 0xf9800e20
15251                               UnallocatedT32(instr);
15252                               break;
15253                             }
15254                             case 0x00000c30: {
15255                               // 0xf9800e30
15256                               UnallocatedT32(instr);
15257                               break;
15258                             }
15259                             default: {
15260                               switch (instr & 0x0000000d) {
15261                                 case 0x0000000d: {
15262                                   // 0xf980020d
15263                                   switch (instr & 0x00000002) {
15264                                     case 0x00000000: {
15265                                       // 0xf980020d
15266                                       if (((instr & 0xc00) == 0xc00) ||
15267                                           ((instr & 0x810) == 0x10) ||
15268                                           ((instr & 0xc30) == 0x810) ||
15269                                           ((instr & 0xc30) == 0x820) ||
15270                                           ((instr & 0xc30) == 0x830)) {
15271                                         UnallocatedT32(instr);
15272                                         return;
15273                                       }
15274                                       DataType dt =
15275                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15276                                       if (dt.Is(kDataTypeValueInvalid)) {
15277                                         UnallocatedT32(instr);
15278                                         return;
15279                                       }
15280                                       DecodeNeon decode_neon =
15281                                           Index_1_Decode((instr >> 4) & 0xf,
15282                                                          dt);
15283                                       if (!decode_neon.IsValid()) {
15284                                         UnallocatedT32(instr);
15285                                         return;
15286                                       }
15287                                       int lane = decode_neon.GetLane();
15288                                       SpacingType spacing =
15289                                           decode_neon.GetSpacing();
15290                                       unsigned first =
15291                                           ExtractDRegister(instr, 22, 12);
15292                                       unsigned length = 3;
15293                                       unsigned last =
15294                                           first +
15295                                           (length - 1) *
15296                                               (spacing == kSingle ? 1 : 2);
15297                                       unsigned rn = (instr >> 16) & 0xf;
15298                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
15299                                       vst3(CurrentCond(),
15300                                            dt,
15301                                            NeonRegisterList(DRegister(first),
15302                                                             DRegister(last),
15303                                                             spacing,
15304                                                             lane),
15305                                            MemOperand(Register(rn), PreIndex));
15306                                       break;
15307                                     }
15308                                     case 0x00000002: {
15309                                       // 0xf980020f
15310                                       if (((instr & 0xc00) == 0xc00) ||
15311                                           ((instr & 0x810) == 0x10) ||
15312                                           ((instr & 0xc30) == 0x810) ||
15313                                           ((instr & 0xc30) == 0x820) ||
15314                                           ((instr & 0xc30) == 0x830)) {
15315                                         UnallocatedT32(instr);
15316                                         return;
15317                                       }
15318                                       DataType dt =
15319                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15320                                       if (dt.Is(kDataTypeValueInvalid)) {
15321                                         UnallocatedT32(instr);
15322                                         return;
15323                                       }
15324                                       DecodeNeon decode_neon =
15325                                           Index_1_Decode((instr >> 4) & 0xf,
15326                                                          dt);
15327                                       if (!decode_neon.IsValid()) {
15328                                         UnallocatedT32(instr);
15329                                         return;
15330                                       }
15331                                       int lane = decode_neon.GetLane();
15332                                       SpacingType spacing =
15333                                           decode_neon.GetSpacing();
15334                                       unsigned first =
15335                                           ExtractDRegister(instr, 22, 12);
15336                                       unsigned length = 3;
15337                                       unsigned last =
15338                                           first +
15339                                           (length - 1) *
15340                                               (spacing == kSingle ? 1 : 2);
15341                                       unsigned rn = (instr >> 16) & 0xf;
15342                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
15343                                       vst3(CurrentCond(),
15344                                            dt,
15345                                            NeonRegisterList(DRegister(first),
15346                                                             DRegister(last),
15347                                                             spacing,
15348                                                             lane),
15349                                            MemOperand(Register(rn), Offset));
15350                                       break;
15351                                     }
15352                                   }
15353                                   break;
15354                                 }
15355                                 default: {
15356                                   if (((instr & 0xc00) == 0xc00) ||
15357                                       ((instr & 0xd) == 0xd) ||
15358                                       ((instr & 0x810) == 0x10) ||
15359                                       ((instr & 0xc30) == 0x810) ||
15360                                       ((instr & 0xc30) == 0x820) ||
15361                                       ((instr & 0xc30) == 0x830)) {
15362                                     UnallocatedT32(instr);
15363                                     return;
15364                                   }
15365                                   DataType dt =
15366                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15367                                   if (dt.Is(kDataTypeValueInvalid)) {
15368                                     UnallocatedT32(instr);
15369                                     return;
15370                                   }
15371                                   DecodeNeon decode_neon =
15372                                       Index_1_Decode((instr >> 4) & 0xf, dt);
15373                                   if (!decode_neon.IsValid()) {
15374                                     UnallocatedT32(instr);
15375                                     return;
15376                                   }
15377                                   int lane = decode_neon.GetLane();
15378                                   SpacingType spacing =
15379                                       decode_neon.GetSpacing();
15380                                   unsigned first =
15381                                       ExtractDRegister(instr, 22, 12);
15382                                   unsigned length = 3;
15383                                   unsigned last =
15384                                       first +
15385                                       (length - 1) *
15386                                           (spacing == kSingle ? 1 : 2);
15387                                   unsigned rn = (instr >> 16) & 0xf;
15388                                   Sign sign(plus);
15389                                   unsigned rm = instr & 0xf;
15390                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
15391                                   vst3(CurrentCond(),
15392                                        dt,
15393                                        NeonRegisterList(DRegister(first),
15394                                                         DRegister(last),
15395                                                         spacing,
15396                                                         lane),
15397                                        MemOperand(Register(rn),
15398                                                   sign,
15399                                                   Register(rm),
15400                                                   PostIndex));
15401                                   break;
15402                                 }
15403                               }
15404                               break;
15405                             }
15406                           }
15407                           break;
15408                         }
15409                         case 0x00000300: {
15410                           // 0xf9800300
15411                           switch (instr & 0x00000c00) {
15412                             case 0x00000c00: {
15413                               // 0xf9800f00
15414                               UnallocatedT32(instr);
15415                               break;
15416                             }
15417                             default: {
15418                               switch (instr & 0x0000000d) {
15419                                 case 0x0000000d: {
15420                                   // 0xf980030d
15421                                   switch (instr & 0x00000002) {
15422                                     case 0x00000000: {
15423                                       // 0xf980030d
15424                                       if (((instr & 0xc00) == 0xc00)) {
15425                                         UnallocatedT32(instr);
15426                                         return;
15427                                       }
15428                                       DataType dt =
15429                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15430                                       if (dt.Is(kDataTypeValueInvalid)) {
15431                                         UnallocatedT32(instr);
15432                                         return;
15433                                       }
15434                                       DecodeNeonAndAlign decode_neon =
15435                                           Align_index_align_3_Decode((instr >>
15436                                                                       4) &
15437                                                                          0xf,
15438                                                                      dt);
15439                                       if (!decode_neon.IsValid()) {
15440                                         UnallocatedT32(instr);
15441                                         return;
15442                                       }
15443                                       Alignment align = decode_neon.GetAlign();
15444                                       int lane = decode_neon.GetLane();
15445                                       SpacingType spacing =
15446                                           decode_neon.GetSpacing();
15447                                       unsigned first =
15448                                           ExtractDRegister(instr, 22, 12);
15449                                       unsigned length = 4;
15450                                       unsigned last =
15451                                           first +
15452                                           (length - 1) *
15453                                               (spacing == kSingle ? 1 : 2);
15454                                       unsigned rn = (instr >> 16) & 0xf;
15455                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15456                                       vst4(CurrentCond(),
15457                                            dt,
15458                                            NeonRegisterList(DRegister(first),
15459                                                             DRegister(last),
15460                                                             spacing,
15461                                                             lane),
15462                                            AlignedMemOperand(Register(rn),
15463                                                              align,
15464                                                              PostIndex));
15465                                       break;
15466                                     }
15467                                     case 0x00000002: {
15468                                       // 0xf980030f
15469                                       if (((instr & 0xc00) == 0xc00)) {
15470                                         UnallocatedT32(instr);
15471                                         return;
15472                                       }
15473                                       DataType dt =
15474                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15475                                       if (dt.Is(kDataTypeValueInvalid)) {
15476                                         UnallocatedT32(instr);
15477                                         return;
15478                                       }
15479                                       DecodeNeonAndAlign decode_neon =
15480                                           Align_index_align_3_Decode((instr >>
15481                                                                       4) &
15482                                                                          0xf,
15483                                                                      dt);
15484                                       if (!decode_neon.IsValid()) {
15485                                         UnallocatedT32(instr);
15486                                         return;
15487                                       }
15488                                       Alignment align = decode_neon.GetAlign();
15489                                       int lane = decode_neon.GetLane();
15490                                       SpacingType spacing =
15491                                           decode_neon.GetSpacing();
15492                                       unsigned first =
15493                                           ExtractDRegister(instr, 22, 12);
15494                                       unsigned length = 4;
15495                                       unsigned last =
15496                                           first +
15497                                           (length - 1) *
15498                                               (spacing == kSingle ? 1 : 2);
15499                                       unsigned rn = (instr >> 16) & 0xf;
15500                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15501                                       vst4(CurrentCond(),
15502                                            dt,
15503                                            NeonRegisterList(DRegister(first),
15504                                                             DRegister(last),
15505                                                             spacing,
15506                                                             lane),
15507                                            AlignedMemOperand(Register(rn),
15508                                                              align,
15509                                                              Offset));
15510                                       break;
15511                                     }
15512                                   }
15513                                   break;
15514                                 }
15515                                 default: {
15516                                   if (((instr & 0xc00) == 0xc00) ||
15517                                       ((instr & 0xd) == 0xd)) {
15518                                     UnallocatedT32(instr);
15519                                     return;
15520                                   }
15521                                   DataType dt =
15522                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15523                                   if (dt.Is(kDataTypeValueInvalid)) {
15524                                     UnallocatedT32(instr);
15525                                     return;
15526                                   }
15527                                   DecodeNeonAndAlign decode_neon =
15528                                       Align_index_align_3_Decode((instr >> 4) &
15529                                                                      0xf,
15530                                                                  dt);
15531                                   if (!decode_neon.IsValid()) {
15532                                     UnallocatedT32(instr);
15533                                     return;
15534                                   }
15535                                   Alignment align = decode_neon.GetAlign();
15536                                   int lane = decode_neon.GetLane();
15537                                   SpacingType spacing =
15538                                       decode_neon.GetSpacing();
15539                                   unsigned first =
15540                                       ExtractDRegister(instr, 22, 12);
15541                                   unsigned length = 4;
15542                                   unsigned last =
15543                                       first +
15544                                       (length - 1) *
15545                                           (spacing == kSingle ? 1 : 2);
15546                                   unsigned rn = (instr >> 16) & 0xf;
15547                                   unsigned rm = instr & 0xf;
15548                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15549                                   vst4(CurrentCond(),
15550                                        dt,
15551                                        NeonRegisterList(DRegister(first),
15552                                                         DRegister(last),
15553                                                         spacing,
15554                                                         lane),
15555                                        AlignedMemOperand(Register(rn),
15556                                                          align,
15557                                                          Register(rm),
15558                                                          PostIndex));
15559                                   break;
15560                                 }
15561                               }
15562                               break;
15563                             }
15564                           }
15565                           break;
15566                         }
15567                       }
15568                       break;
15569                     }
15570                     case 0x01a00000: {
15571                       // 0xf9a00000
15572                       switch (instr & 0x00000300) {
15573                         case 0x00000000: {
15574                           // 0xf9a00000
15575                           switch (instr & 0x00000c00) {
15576                             case 0x00000c00: {
15577                               // 0xf9a00c00
15578                               switch (instr & 0x0000000d) {
15579                                 case 0x0000000d: {
15580                                   // 0xf9a00c0d
15581                                   switch (instr & 0x00000002) {
15582                                     case 0x00000000: {
15583                                       // 0xf9a00c0d
15584                                       DataType dt =
15585                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15586                                       if (dt.Is(kDataTypeValueInvalid)) {
15587                                         UnallocatedT32(instr);
15588                                         return;
15589                                       }
15590                                       Alignment align =
15591                                           Align_a_1_Decode((instr >> 4) & 0x1,
15592                                                            dt);
15593                                       if (dt.Is(kDataTypeValueInvalid) ||
15594                                           align.Is(kBadAlignment)) {
15595                                         UnallocatedT32(instr);
15596                                         return;
15597                                       }
15598                                       unsigned first =
15599                                           ExtractDRegister(instr, 22, 12);
15600                                       unsigned length;
15601                                       SpacingType spacing = kSingle;
15602                                       switch ((instr >> 5) & 0x1) {
15603                                         default:
15604                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15605                                         case 0x0:
15606                                           length = 1;
15607                                           break;
15608                                         case 0x1:
15609                                           length = 2;
15610                                           break;
15611                                       }
15612                                       unsigned last = first + length - 1;
15613                                       TransferType transfer = kAllLanes;
15614                                       unsigned rn = (instr >> 16) & 0xf;
15615                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15616                                       vld1(CurrentCond(),
15617                                            dt,
15618                                            NeonRegisterList(DRegister(first),
15619                                                             DRegister(last),
15620                                                             spacing,
15621                                                             transfer),
15622                                            AlignedMemOperand(Register(rn),
15623                                                              align,
15624                                                              PostIndex));
15625                                       break;
15626                                     }
15627                                     case 0x00000002: {
15628                                       // 0xf9a00c0f
15629                                       DataType dt =
15630                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15631                                       if (dt.Is(kDataTypeValueInvalid)) {
15632                                         UnallocatedT32(instr);
15633                                         return;
15634                                       }
15635                                       Alignment align =
15636                                           Align_a_1_Decode((instr >> 4) & 0x1,
15637                                                            dt);
15638                                       if (dt.Is(kDataTypeValueInvalid) ||
15639                                           align.Is(kBadAlignment)) {
15640                                         UnallocatedT32(instr);
15641                                         return;
15642                                       }
15643                                       unsigned first =
15644                                           ExtractDRegister(instr, 22, 12);
15645                                       unsigned length;
15646                                       SpacingType spacing = kSingle;
15647                                       switch ((instr >> 5) & 0x1) {
15648                                         default:
15649                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15650                                         case 0x0:
15651                                           length = 1;
15652                                           break;
15653                                         case 0x1:
15654                                           length = 2;
15655                                           break;
15656                                       }
15657                                       unsigned last = first + length - 1;
15658                                       TransferType transfer = kAllLanes;
15659                                       unsigned rn = (instr >> 16) & 0xf;
15660                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15661                                       vld1(CurrentCond(),
15662                                            dt,
15663                                            NeonRegisterList(DRegister(first),
15664                                                             DRegister(last),
15665                                                             spacing,
15666                                                             transfer),
15667                                            AlignedMemOperand(Register(rn),
15668                                                              align,
15669                                                              Offset));
15670                                       break;
15671                                     }
15672                                   }
15673                                   break;
15674                                 }
15675                                 default: {
15676                                   if (((instr & 0xd) == 0xd)) {
15677                                     UnallocatedT32(instr);
15678                                     return;
15679                                   }
15680                                   DataType dt =
15681                                       Dt_size_7_Decode((instr >> 6) & 0x3);
15682                                   if (dt.Is(kDataTypeValueInvalid)) {
15683                                     UnallocatedT32(instr);
15684                                     return;
15685                                   }
15686                                   Alignment align =
15687                                       Align_a_1_Decode((instr >> 4) & 0x1, dt);
15688                                   if (dt.Is(kDataTypeValueInvalid) ||
15689                                       align.Is(kBadAlignment)) {
15690                                     UnallocatedT32(instr);
15691                                     return;
15692                                   }
15693                                   unsigned first =
15694                                       ExtractDRegister(instr, 22, 12);
15695                                   unsigned length;
15696                                   SpacingType spacing = kSingle;
15697                                   switch ((instr >> 5) & 0x1) {
15698                                     default:
15699                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
15700                                     case 0x0:
15701                                       length = 1;
15702                                       break;
15703                                     case 0x1:
15704                                       length = 2;
15705                                       break;
15706                                   }
15707                                   unsigned last = first + length - 1;
15708                                   TransferType transfer = kAllLanes;
15709                                   unsigned rn = (instr >> 16) & 0xf;
15710                                   unsigned rm = instr & 0xf;
15711                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15712                                   vld1(CurrentCond(),
15713                                        dt,
15714                                        NeonRegisterList(DRegister(first),
15715                                                         DRegister(last),
15716                                                         spacing,
15717                                                         transfer),
15718                                        AlignedMemOperand(Register(rn),
15719                                                          align,
15720                                                          Register(rm),
15721                                                          PostIndex));
15722                                   break;
15723                                 }
15724                               }
15725                               break;
15726                             }
15727                             default: {
15728                               switch (instr & 0x0000000d) {
15729                                 case 0x0000000d: {
15730                                   // 0xf9a0000d
15731                                   switch (instr & 0x00000002) {
15732                                     case 0x00000000: {
15733                                       // 0xf9a0000d
15734                                       if (((instr & 0xc00) == 0xc00)) {
15735                                         UnallocatedT32(instr);
15736                                         return;
15737                                       }
15738                                       DataType dt =
15739                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15740                                       if (dt.Is(kDataTypeValueInvalid)) {
15741                                         UnallocatedT32(instr);
15742                                         return;
15743                                       }
15744                                       DecodeNeonAndAlign decode_neon =
15745                                           Align_index_align_1_Decode((instr >>
15746                                                                       4) &
15747                                                                          0xf,
15748                                                                      dt);
15749                                       if (!decode_neon.IsValid()) {
15750                                         UnallocatedT32(instr);
15751                                         return;
15752                                       }
15753                                       Alignment align = decode_neon.GetAlign();
15754                                       int lane = decode_neon.GetLane();
15755                                       SpacingType spacing =
15756                                           decode_neon.GetSpacing();
15757                                       unsigned first =
15758                                           ExtractDRegister(instr, 22, 12);
15759                                       unsigned length = 1;
15760                                       unsigned last = first + length - 1;
15761                                       unsigned rn = (instr >> 16) & 0xf;
15762                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15763                                       vld1(CurrentCond(),
15764                                            dt,
15765                                            NeonRegisterList(DRegister(first),
15766                                                             DRegister(last),
15767                                                             spacing,
15768                                                             lane),
15769                                            AlignedMemOperand(Register(rn),
15770                                                              align,
15771                                                              PostIndex));
15772                                       break;
15773                                     }
15774                                     case 0x00000002: {
15775                                       // 0xf9a0000f
15776                                       if (((instr & 0xc00) == 0xc00)) {
15777                                         UnallocatedT32(instr);
15778                                         return;
15779                                       }
15780                                       DataType dt =
15781                                           Dt_size_7_Decode((instr >> 10) & 0x3);
15782                                       if (dt.Is(kDataTypeValueInvalid)) {
15783                                         UnallocatedT32(instr);
15784                                         return;
15785                                       }
15786                                       DecodeNeonAndAlign decode_neon =
15787                                           Align_index_align_1_Decode((instr >>
15788                                                                       4) &
15789                                                                          0xf,
15790                                                                      dt);
15791                                       if (!decode_neon.IsValid()) {
15792                                         UnallocatedT32(instr);
15793                                         return;
15794                                       }
15795                                       Alignment align = decode_neon.GetAlign();
15796                                       int lane = decode_neon.GetLane();
15797                                       SpacingType spacing =
15798                                           decode_neon.GetSpacing();
15799                                       unsigned first =
15800                                           ExtractDRegister(instr, 22, 12);
15801                                       unsigned length = 1;
15802                                       unsigned last = first + length - 1;
15803                                       unsigned rn = (instr >> 16) & 0xf;
15804                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15805                                       vld1(CurrentCond(),
15806                                            dt,
15807                                            NeonRegisterList(DRegister(first),
15808                                                             DRegister(last),
15809                                                             spacing,
15810                                                             lane),
15811                                            AlignedMemOperand(Register(rn),
15812                                                              align,
15813                                                              Offset));
15814                                       break;
15815                                     }
15816                                   }
15817                                   break;
15818                                 }
15819                                 default: {
15820                                   if (((instr & 0xc00) == 0xc00) ||
15821                                       ((instr & 0xd) == 0xd)) {
15822                                     UnallocatedT32(instr);
15823                                     return;
15824                                   }
15825                                   DataType dt =
15826                                       Dt_size_7_Decode((instr >> 10) & 0x3);
15827                                   if (dt.Is(kDataTypeValueInvalid)) {
15828                                     UnallocatedT32(instr);
15829                                     return;
15830                                   }
15831                                   DecodeNeonAndAlign decode_neon =
15832                                       Align_index_align_1_Decode((instr >> 4) &
15833                                                                      0xf,
15834                                                                  dt);
15835                                   if (!decode_neon.IsValid()) {
15836                                     UnallocatedT32(instr);
15837                                     return;
15838                                   }
15839                                   Alignment align = decode_neon.GetAlign();
15840                                   int lane = decode_neon.GetLane();
15841                                   SpacingType spacing =
15842                                       decode_neon.GetSpacing();
15843                                   unsigned first =
15844                                       ExtractDRegister(instr, 22, 12);
15845                                   unsigned length = 1;
15846                                   unsigned last = first + length - 1;
15847                                   unsigned rn = (instr >> 16) & 0xf;
15848                                   unsigned rm = instr & 0xf;
15849                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
15850                                   vld1(CurrentCond(),
15851                                        dt,
15852                                        NeonRegisterList(DRegister(first),
15853                                                         DRegister(last),
15854                                                         spacing,
15855                                                         lane),
15856                                        AlignedMemOperand(Register(rn),
15857                                                          align,
15858                                                          Register(rm),
15859                                                          PostIndex));
15860                                   break;
15861                                 }
15862                               }
15863                               break;
15864                             }
15865                           }
15866                           break;
15867                         }
15868                         case 0x00000100: {
15869                           // 0xf9a00100
15870                           switch (instr & 0x00000c00) {
15871                             case 0x00000c00: {
15872                               // 0xf9a00d00
15873                               switch (instr & 0x0000000d) {
15874                                 case 0x0000000d: {
15875                                   // 0xf9a00d0d
15876                                   switch (instr & 0x00000002) {
15877                                     case 0x00000000: {
15878                                       // 0xf9a00d0d
15879                                       DataType dt =
15880                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15881                                       if (dt.Is(kDataTypeValueInvalid)) {
15882                                         UnallocatedT32(instr);
15883                                         return;
15884                                       }
15885                                       Alignment align =
15886                                           Align_a_2_Decode((instr >> 4) & 0x1,
15887                                                            dt);
15888                                       if (dt.Is(kDataTypeValueInvalid) ||
15889                                           align.Is(kBadAlignment)) {
15890                                         UnallocatedT32(instr);
15891                                         return;
15892                                       }
15893                                       unsigned first =
15894                                           ExtractDRegister(instr, 22, 12);
15895                                       unsigned length;
15896                                       SpacingType spacing;
15897                                       switch ((instr >> 5) & 0x1) {
15898                                         default:
15899                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15900                                         case 0x0:
15901                                           length = 2;
15902                                           spacing = kSingle;
15903                                           break;
15904                                         case 0x1:
15905                                           length = 2;
15906                                           spacing = kDouble;
15907                                           break;
15908                                       }
15909                                       unsigned last =
15910                                           first +
15911                                           (length - 1) *
15912                                               (spacing == kSingle ? 1 : 2);
15913                                       TransferType transfer = kAllLanes;
15914                                       unsigned rn = (instr >> 16) & 0xf;
15915                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
15916                                       vld2(CurrentCond(),
15917                                            dt,
15918                                            NeonRegisterList(DRegister(first),
15919                                                             DRegister(last),
15920                                                             spacing,
15921                                                             transfer),
15922                                            AlignedMemOperand(Register(rn),
15923                                                              align,
15924                                                              PostIndex));
15925                                       break;
15926                                     }
15927                                     case 0x00000002: {
15928                                       // 0xf9a00d0f
15929                                       DataType dt =
15930                                           Dt_size_7_Decode((instr >> 6) & 0x3);
15931                                       if (dt.Is(kDataTypeValueInvalid)) {
15932                                         UnallocatedT32(instr);
15933                                         return;
15934                                       }
15935                                       Alignment align =
15936                                           Align_a_2_Decode((instr >> 4) & 0x1,
15937                                                            dt);
15938                                       if (dt.Is(kDataTypeValueInvalid) ||
15939                                           align.Is(kBadAlignment)) {
15940                                         UnallocatedT32(instr);
15941                                         return;
15942                                       }
15943                                       unsigned first =
15944                                           ExtractDRegister(instr, 22, 12);
15945                                       unsigned length;
15946                                       SpacingType spacing;
15947                                       switch ((instr >> 5) & 0x1) {
15948                                         default:
15949                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
15950                                         case 0x0:
15951                                           length = 2;
15952                                           spacing = kSingle;
15953                                           break;
15954                                         case 0x1:
15955                                           length = 2;
15956                                           spacing = kDouble;
15957                                           break;
15958                                       }
15959                                       unsigned last =
15960                                           first +
15961                                           (length - 1) *
15962                                               (spacing == kSingle ? 1 : 2);
15963                                       TransferType transfer = kAllLanes;
15964                                       unsigned rn = (instr >> 16) & 0xf;
15965                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
15966                                       vld2(CurrentCond(),
15967                                            dt,
15968                                            NeonRegisterList(DRegister(first),
15969                                                             DRegister(last),
15970                                                             spacing,
15971                                                             transfer),
15972                                            AlignedMemOperand(Register(rn),
15973                                                              align,
15974                                                              Offset));
15975                                       break;
15976                                     }
15977                                   }
15978                                   break;
15979                                 }
15980                                 default: {
15981                                   if (((instr & 0xd) == 0xd)) {
15982                                     UnallocatedT32(instr);
15983                                     return;
15984                                   }
15985                                   DataType dt =
15986                                       Dt_size_7_Decode((instr >> 6) & 0x3);
15987                                   if (dt.Is(kDataTypeValueInvalid)) {
15988                                     UnallocatedT32(instr);
15989                                     return;
15990                                   }
15991                                   Alignment align =
15992                                       Align_a_2_Decode((instr >> 4) & 0x1, dt);
15993                                   if (dt.Is(kDataTypeValueInvalid) ||
15994                                       align.Is(kBadAlignment)) {
15995                                     UnallocatedT32(instr);
15996                                     return;
15997                                   }
15998                                   unsigned first =
15999                                       ExtractDRegister(instr, 22, 12);
16000                                   unsigned length;
16001                                   SpacingType spacing;
16002                                   switch ((instr >> 5) & 0x1) {
16003                                     default:
16004                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
16005                                     case 0x0:
16006                                       length = 2;
16007                                       spacing = kSingle;
16008                                       break;
16009                                     case 0x1:
16010                                       length = 2;
16011                                       spacing = kDouble;
16012                                       break;
16013                                   }
16014                                   unsigned last =
16015                                       first +
16016                                       (length - 1) *
16017                                           (spacing == kSingle ? 1 : 2);
16018                                   TransferType transfer = kAllLanes;
16019                                   unsigned rn = (instr >> 16) & 0xf;
16020                                   unsigned rm = instr & 0xf;
16021                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16022                                   vld2(CurrentCond(),
16023                                        dt,
16024                                        NeonRegisterList(DRegister(first),
16025                                                         DRegister(last),
16026                                                         spacing,
16027                                                         transfer),
16028                                        AlignedMemOperand(Register(rn),
16029                                                          align,
16030                                                          Register(rm),
16031                                                          PostIndex));
16032                                   break;
16033                                 }
16034                               }
16035                               break;
16036                             }
16037                             default: {
16038                               switch (instr & 0x0000000d) {
16039                                 case 0x0000000d: {
16040                                   // 0xf9a0010d
16041                                   switch (instr & 0x00000002) {
16042                                     case 0x00000000: {
16043                                       // 0xf9a0010d
16044                                       if (((instr & 0xc00) == 0xc00)) {
16045                                         UnallocatedT32(instr);
16046                                         return;
16047                                       }
16048                                       DataType dt =
16049                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16050                                       if (dt.Is(kDataTypeValueInvalid)) {
16051                                         UnallocatedT32(instr);
16052                                         return;
16053                                       }
16054                                       DecodeNeonAndAlign decode_neon =
16055                                           Align_index_align_2_Decode((instr >>
16056                                                                       4) &
16057                                                                          0xf,
16058                                                                      dt);
16059                                       if (!decode_neon.IsValid()) {
16060                                         UnallocatedT32(instr);
16061                                         return;
16062                                       }
16063                                       Alignment align = decode_neon.GetAlign();
16064                                       int lane = decode_neon.GetLane();
16065                                       SpacingType spacing =
16066                                           decode_neon.GetSpacing();
16067                                       unsigned first =
16068                                           ExtractDRegister(instr, 22, 12);
16069                                       unsigned length = 2;
16070                                       unsigned last =
16071                                           first +
16072                                           (length - 1) *
16073                                               (spacing == kSingle ? 1 : 2);
16074                                       unsigned rn = (instr >> 16) & 0xf;
16075                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16076                                       vld2(CurrentCond(),
16077                                            dt,
16078                                            NeonRegisterList(DRegister(first),
16079                                                             DRegister(last),
16080                                                             spacing,
16081                                                             lane),
16082                                            AlignedMemOperand(Register(rn),
16083                                                              align,
16084                                                              PostIndex));
16085                                       break;
16086                                     }
16087                                     case 0x00000002: {
16088                                       // 0xf9a0010f
16089                                       if (((instr & 0xc00) == 0xc00)) {
16090                                         UnallocatedT32(instr);
16091                                         return;
16092                                       }
16093                                       DataType dt =
16094                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16095                                       if (dt.Is(kDataTypeValueInvalid)) {
16096                                         UnallocatedT32(instr);
16097                                         return;
16098                                       }
16099                                       DecodeNeonAndAlign decode_neon =
16100                                           Align_index_align_2_Decode((instr >>
16101                                                                       4) &
16102                                                                          0xf,
16103                                                                      dt);
16104                                       if (!decode_neon.IsValid()) {
16105                                         UnallocatedT32(instr);
16106                                         return;
16107                                       }
16108                                       Alignment align = decode_neon.GetAlign();
16109                                       int lane = decode_neon.GetLane();
16110                                       SpacingType spacing =
16111                                           decode_neon.GetSpacing();
16112                                       unsigned first =
16113                                           ExtractDRegister(instr, 22, 12);
16114                                       unsigned length = 2;
16115                                       unsigned last =
16116                                           first +
16117                                           (length - 1) *
16118                                               (spacing == kSingle ? 1 : 2);
16119                                       unsigned rn = (instr >> 16) & 0xf;
16120                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16121                                       vld2(CurrentCond(),
16122                                            dt,
16123                                            NeonRegisterList(DRegister(first),
16124                                                             DRegister(last),
16125                                                             spacing,
16126                                                             lane),
16127                                            AlignedMemOperand(Register(rn),
16128                                                              align,
16129                                                              Offset));
16130                                       break;
16131                                     }
16132                                   }
16133                                   break;
16134                                 }
16135                                 default: {
16136                                   if (((instr & 0xc00) == 0xc00) ||
16137                                       ((instr & 0xd) == 0xd)) {
16138                                     UnallocatedT32(instr);
16139                                     return;
16140                                   }
16141                                   DataType dt =
16142                                       Dt_size_7_Decode((instr >> 10) & 0x3);
16143                                   if (dt.Is(kDataTypeValueInvalid)) {
16144                                     UnallocatedT32(instr);
16145                                     return;
16146                                   }
16147                                   DecodeNeonAndAlign decode_neon =
16148                                       Align_index_align_2_Decode((instr >> 4) &
16149                                                                      0xf,
16150                                                                  dt);
16151                                   if (!decode_neon.IsValid()) {
16152                                     UnallocatedT32(instr);
16153                                     return;
16154                                   }
16155                                   Alignment align = decode_neon.GetAlign();
16156                                   int lane = decode_neon.GetLane();
16157                                   SpacingType spacing =
16158                                       decode_neon.GetSpacing();
16159                                   unsigned first =
16160                                       ExtractDRegister(instr, 22, 12);
16161                                   unsigned length = 2;
16162                                   unsigned last =
16163                                       first +
16164                                       (length - 1) *
16165                                           (spacing == kSingle ? 1 : 2);
16166                                   unsigned rn = (instr >> 16) & 0xf;
16167                                   unsigned rm = instr & 0xf;
16168                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16169                                   vld2(CurrentCond(),
16170                                        dt,
16171                                        NeonRegisterList(DRegister(first),
16172                                                         DRegister(last),
16173                                                         spacing,
16174                                                         lane),
16175                                        AlignedMemOperand(Register(rn),
16176                                                          align,
16177                                                          Register(rm),
16178                                                          PostIndex));
16179                                   break;
16180                                 }
16181                               }
16182                               break;
16183                             }
16184                           }
16185                           break;
16186                         }
16187                         case 0x00000200: {
16188                           // 0xf9a00200
16189                           switch (instr & 0x00000c00) {
16190                             case 0x00000c00: {
16191                               // 0xf9a00e00
16192                               switch (instr & 0x00000010) {
16193                                 case 0x00000000: {
16194                                   // 0xf9a00e00
16195                                   switch (instr & 0x0000000d) {
16196                                     case 0x0000000d: {
16197                                       // 0xf9a00e0d
16198                                       switch (instr & 0x00000002) {
16199                                         case 0x00000000: {
16200                                           // 0xf9a00e0d
16201                                           DataType dt = Dt_size_7_Decode(
16202                                               (instr >> 6) & 0x3);
16203                                           if (dt.Is(kDataTypeValueInvalid)) {
16204                                             UnallocatedT32(instr);
16205                                             return;
16206                                           }
16207                                           unsigned first =
16208                                               ExtractDRegister(instr, 22, 12);
16209                                           unsigned length;
16210                                           SpacingType spacing;
16211                                           switch ((instr >> 5) & 0x1) {
16212                                             default:
16213                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
16214                                             case 0x0:
16215                                               length = 3;
16216                                               spacing = kSingle;
16217                                               break;
16218                                             case 0x1:
16219                                               length = 3;
16220                                               spacing = kDouble;
16221                                               break;
16222                                           }
16223                                           unsigned last =
16224                                               first +
16225                                               (length - 1) *
16226                                                   (spacing == kSingle ? 1 : 2);
16227                                           TransferType transfer = kAllLanes;
16228                                           unsigned rn = (instr >> 16) & 0xf;
16229                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16230                                           vld3(CurrentCond(),
16231                                                dt,
16232                                                NeonRegisterList(DRegister(
16233                                                                     first),
16234                                                                 DRegister(last),
16235                                                                 spacing,
16236                                                                 transfer),
16237                                                MemOperand(Register(rn),
16238                                                           PreIndex));
16239                                           break;
16240                                         }
16241                                         case 0x00000002: {
16242                                           // 0xf9a00e0f
16243                                           DataType dt = Dt_size_7_Decode(
16244                                               (instr >> 6) & 0x3);
16245                                           if (dt.Is(kDataTypeValueInvalid)) {
16246                                             UnallocatedT32(instr);
16247                                             return;
16248                                           }
16249                                           unsigned first =
16250                                               ExtractDRegister(instr, 22, 12);
16251                                           unsigned length;
16252                                           SpacingType spacing;
16253                                           switch ((instr >> 5) & 0x1) {
16254                                             default:
16255                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
16256                                             case 0x0:
16257                                               length = 3;
16258                                               spacing = kSingle;
16259                                               break;
16260                                             case 0x1:
16261                                               length = 3;
16262                                               spacing = kDouble;
16263                                               break;
16264                                           }
16265                                           unsigned last =
16266                                               first +
16267                                               (length - 1) *
16268                                                   (spacing == kSingle ? 1 : 2);
16269                                           TransferType transfer = kAllLanes;
16270                                           unsigned rn = (instr >> 16) & 0xf;
16271                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
16272                                           vld3(CurrentCond(),
16273                                                dt,
16274                                                NeonRegisterList(DRegister(
16275                                                                     first),
16276                                                                 DRegister(last),
16277                                                                 spacing,
16278                                                                 transfer),
16279                                                MemOperand(Register(rn),
16280                                                           Offset));
16281                                           break;
16282                                         }
16283                                       }
16284                                       break;
16285                                     }
16286                                     default: {
16287                                       if (((instr & 0xd) == 0xd)) {
16288                                         UnallocatedT32(instr);
16289                                         return;
16290                                       }
16291                                       DataType dt =
16292                                           Dt_size_7_Decode((instr >> 6) & 0x3);
16293                                       if (dt.Is(kDataTypeValueInvalid)) {
16294                                         UnallocatedT32(instr);
16295                                         return;
16296                                       }
16297                                       unsigned first =
16298                                           ExtractDRegister(instr, 22, 12);
16299                                       unsigned length;
16300                                       SpacingType spacing;
16301                                       switch ((instr >> 5) & 0x1) {
16302                                         default:
16303                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
16304                                         case 0x0:
16305                                           length = 3;
16306                                           spacing = kSingle;
16307                                           break;
16308                                         case 0x1:
16309                                           length = 3;
16310                                           spacing = kDouble;
16311                                           break;
16312                                       }
16313                                       unsigned last =
16314                                           first +
16315                                           (length - 1) *
16316                                               (spacing == kSingle ? 1 : 2);
16317                                       TransferType transfer = kAllLanes;
16318                                       unsigned rn = (instr >> 16) & 0xf;
16319                                       Sign sign(plus);
16320                                       unsigned rm = instr & 0xf;
16321                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16322                                       vld3(CurrentCond(),
16323                                            dt,
16324                                            NeonRegisterList(DRegister(first),
16325                                                             DRegister(last),
16326                                                             spacing,
16327                                                             transfer),
16328                                            MemOperand(Register(rn),
16329                                                       sign,
16330                                                       Register(rm),
16331                                                       PostIndex));
16332                                       break;
16333                                     }
16334                                   }
16335                                   break;
16336                                 }
16337                                 default:
16338                                   UnallocatedT32(instr);
16339                                   break;
16340                               }
16341                               break;
16342                             }
16343                             default: {
16344                               switch (instr & 0x0000000d) {
16345                                 case 0x0000000d: {
16346                                   // 0xf9a0020d
16347                                   switch (instr & 0x00000002) {
16348                                     case 0x00000000: {
16349                                       // 0xf9a0020d
16350                                       if (((instr & 0xc00) == 0xc00)) {
16351                                         UnallocatedT32(instr);
16352                                         return;
16353                                       }
16354                                       DataType dt =
16355                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16356                                       if (dt.Is(kDataTypeValueInvalid)) {
16357                                         UnallocatedT32(instr);
16358                                         return;
16359                                       }
16360                                       DecodeNeon decode_neon =
16361                                           Index_1_Decode((instr >> 4) & 0xf,
16362                                                          dt);
16363                                       if (!decode_neon.IsValid()) {
16364                                         UnallocatedT32(instr);
16365                                         return;
16366                                       }
16367                                       int lane = decode_neon.GetLane();
16368                                       SpacingType spacing =
16369                                           decode_neon.GetSpacing();
16370                                       unsigned first =
16371                                           ExtractDRegister(instr, 22, 12);
16372                                       unsigned length = 3;
16373                                       unsigned last =
16374                                           first +
16375                                           (length - 1) *
16376                                               (spacing == kSingle ? 1 : 2);
16377                                       unsigned rn = (instr >> 16) & 0xf;
16378                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
16379                                       vld3(CurrentCond(),
16380                                            dt,
16381                                            NeonRegisterList(DRegister(first),
16382                                                             DRegister(last),
16383                                                             spacing,
16384                                                             lane),
16385                                            MemOperand(Register(rn), PreIndex));
16386                                       break;
16387                                     }
16388                                     case 0x00000002: {
16389                                       // 0xf9a0020f
16390                                       if (((instr & 0xc00) == 0xc00)) {
16391                                         UnallocatedT32(instr);
16392                                         return;
16393                                       }
16394                                       DataType dt =
16395                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16396                                       if (dt.Is(kDataTypeValueInvalid)) {
16397                                         UnallocatedT32(instr);
16398                                         return;
16399                                       }
16400                                       DecodeNeon decode_neon =
16401                                           Index_1_Decode((instr >> 4) & 0xf,
16402                                                          dt);
16403                                       if (!decode_neon.IsValid()) {
16404                                         UnallocatedT32(instr);
16405                                         return;
16406                                       }
16407                                       int lane = decode_neon.GetLane();
16408                                       SpacingType spacing =
16409                                           decode_neon.GetSpacing();
16410                                       unsigned first =
16411                                           ExtractDRegister(instr, 22, 12);
16412                                       unsigned length = 3;
16413                                       unsigned last =
16414                                           first +
16415                                           (length - 1) *
16416                                               (spacing == kSingle ? 1 : 2);
16417                                       unsigned rn = (instr >> 16) & 0xf;
16418                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
16419                                       vld3(CurrentCond(),
16420                                            dt,
16421                                            NeonRegisterList(DRegister(first),
16422                                                             DRegister(last),
16423                                                             spacing,
16424                                                             lane),
16425                                            MemOperand(Register(rn), Offset));
16426                                       break;
16427                                     }
16428                                   }
16429                                   break;
16430                                 }
16431                                 default: {
16432                                   if (((instr & 0xc00) == 0xc00) ||
16433                                       ((instr & 0xd) == 0xd)) {
16434                                     UnallocatedT32(instr);
16435                                     return;
16436                                   }
16437                                   DataType dt =
16438                                       Dt_size_7_Decode((instr >> 10) & 0x3);
16439                                   if (dt.Is(kDataTypeValueInvalid)) {
16440                                     UnallocatedT32(instr);
16441                                     return;
16442                                   }
16443                                   DecodeNeon decode_neon =
16444                                       Index_1_Decode((instr >> 4) & 0xf, dt);
16445                                   if (!decode_neon.IsValid()) {
16446                                     UnallocatedT32(instr);
16447                                     return;
16448                                   }
16449                                   int lane = decode_neon.GetLane();
16450                                   SpacingType spacing =
16451                                       decode_neon.GetSpacing();
16452                                   unsigned first =
16453                                       ExtractDRegister(instr, 22, 12);
16454                                   unsigned length = 3;
16455                                   unsigned last =
16456                                       first +
16457                                       (length - 1) *
16458                                           (spacing == kSingle ? 1 : 2);
16459                                   unsigned rn = (instr >> 16) & 0xf;
16460                                   Sign sign(plus);
16461                                   unsigned rm = instr & 0xf;
16462                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
16463                                   vld3(CurrentCond(),
16464                                        dt,
16465                                        NeonRegisterList(DRegister(first),
16466                                                         DRegister(last),
16467                                                         spacing,
16468                                                         lane),
16469                                        MemOperand(Register(rn),
16470                                                   sign,
16471                                                   Register(rm),
16472                                                   PostIndex));
16473                                   break;
16474                                 }
16475                               }
16476                               break;
16477                             }
16478                           }
16479                           break;
16480                         }
16481                         case 0x00000300: {
16482                           // 0xf9a00300
16483                           switch (instr & 0x00000c00) {
16484                             case 0x00000c00: {
16485                               // 0xf9a00f00
16486                               switch (instr & 0x0000000d) {
16487                                 case 0x0000000d: {
16488                                   // 0xf9a00f0d
16489                                   switch (instr & 0x00000002) {
16490                                     case 0x00000000: {
16491                                       // 0xf9a00f0d
16492                                       DataType dt =
16493                                           Dt_size_8_Decode((instr >> 6) & 0x3);
16494                                       if (dt.Is(kDataTypeValueInvalid)) {
16495                                         UnallocatedT32(instr);
16496                                         return;
16497                                       }
16498                                       Alignment align =
16499                                           Align_a_3_Decode((instr >> 4) & 0x1,
16500                                                            dt,
16501                                                            (instr >> 6) & 0x3);
16502                                       if (dt.Is(kDataTypeValueInvalid) ||
16503                                           align.Is(kBadAlignment)) {
16504                                         UnallocatedT32(instr);
16505                                         return;
16506                                       }
16507                                       unsigned first =
16508                                           ExtractDRegister(instr, 22, 12);
16509                                       unsigned length;
16510                                       SpacingType spacing;
16511                                       switch ((instr >> 5) & 0x1) {
16512                                         default:
16513                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
16514                                         case 0x0:
16515                                           length = 4;
16516                                           spacing = kSingle;
16517                                           break;
16518                                         case 0x1:
16519                                           length = 4;
16520                                           spacing = kDouble;
16521                                           break;
16522                                       }
16523                                       unsigned last =
16524                                           first +
16525                                           (length - 1) *
16526                                               (spacing == kSingle ? 1 : 2);
16527                                       TransferType transfer = kAllLanes;
16528                                       unsigned rn = (instr >> 16) & 0xf;
16529                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16530                                       vld4(CurrentCond(),
16531                                            dt,
16532                                            NeonRegisterList(DRegister(first),
16533                                                             DRegister(last),
16534                                                             spacing,
16535                                                             transfer),
16536                                            AlignedMemOperand(Register(rn),
16537                                                              align,
16538                                                              PostIndex));
16539                                       break;
16540                                     }
16541                                     case 0x00000002: {
16542                                       // 0xf9a00f0f
16543                                       DataType dt =
16544                                           Dt_size_8_Decode((instr >> 6) & 0x3);
16545                                       if (dt.Is(kDataTypeValueInvalid)) {
16546                                         UnallocatedT32(instr);
16547                                         return;
16548                                       }
16549                                       Alignment align =
16550                                           Align_a_3_Decode((instr >> 4) & 0x1,
16551                                                            dt,
16552                                                            (instr >> 6) & 0x3);
16553                                       if (dt.Is(kDataTypeValueInvalid) ||
16554                                           align.Is(kBadAlignment)) {
16555                                         UnallocatedT32(instr);
16556                                         return;
16557                                       }
16558                                       unsigned first =
16559                                           ExtractDRegister(instr, 22, 12);
16560                                       unsigned length;
16561                                       SpacingType spacing;
16562                                       switch ((instr >> 5) & 0x1) {
16563                                         default:
16564                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
16565                                         case 0x0:
16566                                           length = 4;
16567                                           spacing = kSingle;
16568                                           break;
16569                                         case 0x1:
16570                                           length = 4;
16571                                           spacing = kDouble;
16572                                           break;
16573                                       }
16574                                       unsigned last =
16575                                           first +
16576                                           (length - 1) *
16577                                               (spacing == kSingle ? 1 : 2);
16578                                       TransferType transfer = kAllLanes;
16579                                       unsigned rn = (instr >> 16) & 0xf;
16580                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16581                                       vld4(CurrentCond(),
16582                                            dt,
16583                                            NeonRegisterList(DRegister(first),
16584                                                             DRegister(last),
16585                                                             spacing,
16586                                                             transfer),
16587                                            AlignedMemOperand(Register(rn),
16588                                                              align,
16589                                                              Offset));
16590                                       break;
16591                                     }
16592                                   }
16593                                   break;
16594                                 }
16595                                 default: {
16596                                   if (((instr & 0xd) == 0xd)) {
16597                                     UnallocatedT32(instr);
16598                                     return;
16599                                   }
16600                                   DataType dt =
16601                                       Dt_size_8_Decode((instr >> 6) & 0x3);
16602                                   if (dt.Is(kDataTypeValueInvalid)) {
16603                                     UnallocatedT32(instr);
16604                                     return;
16605                                   }
16606                                   Alignment align =
16607                                       Align_a_3_Decode((instr >> 4) & 0x1,
16608                                                        dt,
16609                                                        (instr >> 6) & 0x3);
16610                                   if (dt.Is(kDataTypeValueInvalid) ||
16611                                       align.Is(kBadAlignment)) {
16612                                     UnallocatedT32(instr);
16613                                     return;
16614                                   }
16615                                   unsigned first =
16616                                       ExtractDRegister(instr, 22, 12);
16617                                   unsigned length;
16618                                   SpacingType spacing;
16619                                   switch ((instr >> 5) & 0x1) {
16620                                     default:
16621                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
16622                                     case 0x0:
16623                                       length = 4;
16624                                       spacing = kSingle;
16625                                       break;
16626                                     case 0x1:
16627                                       length = 4;
16628                                       spacing = kDouble;
16629                                       break;
16630                                   }
16631                                   unsigned last =
16632                                       first +
16633                                       (length - 1) *
16634                                           (spacing == kSingle ? 1 : 2);
16635                                   TransferType transfer = kAllLanes;
16636                                   unsigned rn = (instr >> 16) & 0xf;
16637                                   unsigned rm = instr & 0xf;
16638                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16639                                   vld4(CurrentCond(),
16640                                        dt,
16641                                        NeonRegisterList(DRegister(first),
16642                                                         DRegister(last),
16643                                                         spacing,
16644                                                         transfer),
16645                                        AlignedMemOperand(Register(rn),
16646                                                          align,
16647                                                          Register(rm),
16648                                                          PostIndex));
16649                                   break;
16650                                 }
16651                               }
16652                               break;
16653                             }
16654                             default: {
16655                               switch (instr & 0x0000000d) {
16656                                 case 0x0000000d: {
16657                                   // 0xf9a0030d
16658                                   switch (instr & 0x00000002) {
16659                                     case 0x00000000: {
16660                                       // 0xf9a0030d
16661                                       if (((instr & 0xc00) == 0xc00)) {
16662                                         UnallocatedT32(instr);
16663                                         return;
16664                                       }
16665                                       DataType dt =
16666                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16667                                       if (dt.Is(kDataTypeValueInvalid)) {
16668                                         UnallocatedT32(instr);
16669                                         return;
16670                                       }
16671                                       DecodeNeonAndAlign decode_neon =
16672                                           Align_index_align_3_Decode((instr >>
16673                                                                       4) &
16674                                                                          0xf,
16675                                                                      dt);
16676                                       if (!decode_neon.IsValid()) {
16677                                         UnallocatedT32(instr);
16678                                         return;
16679                                       }
16680                                       Alignment align = decode_neon.GetAlign();
16681                                       int lane = decode_neon.GetLane();
16682                                       SpacingType spacing =
16683                                           decode_neon.GetSpacing();
16684                                       unsigned first =
16685                                           ExtractDRegister(instr, 22, 12);
16686                                       unsigned length = 4;
16687                                       unsigned last =
16688                                           first +
16689                                           (length - 1) *
16690                                               (spacing == kSingle ? 1 : 2);
16691                                       unsigned rn = (instr >> 16) & 0xf;
16692                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
16693                                       vld4(CurrentCond(),
16694                                            dt,
16695                                            NeonRegisterList(DRegister(first),
16696                                                             DRegister(last),
16697                                                             spacing,
16698                                                             lane),
16699                                            AlignedMemOperand(Register(rn),
16700                                                              align,
16701                                                              PostIndex));
16702                                       break;
16703                                     }
16704                                     case 0x00000002: {
16705                                       // 0xf9a0030f
16706                                       if (((instr & 0xc00) == 0xc00)) {
16707                                         UnallocatedT32(instr);
16708                                         return;
16709                                       }
16710                                       DataType dt =
16711                                           Dt_size_7_Decode((instr >> 10) & 0x3);
16712                                       if (dt.Is(kDataTypeValueInvalid)) {
16713                                         UnallocatedT32(instr);
16714                                         return;
16715                                       }
16716                                       DecodeNeonAndAlign decode_neon =
16717                                           Align_index_align_3_Decode((instr >>
16718                                                                       4) &
16719                                                                          0xf,
16720                                                                      dt);
16721                                       if (!decode_neon.IsValid()) {
16722                                         UnallocatedT32(instr);
16723                                         return;
16724                                       }
16725                                       Alignment align = decode_neon.GetAlign();
16726                                       int lane = decode_neon.GetLane();
16727                                       SpacingType spacing =
16728                                           decode_neon.GetSpacing();
16729                                       unsigned first =
16730                                           ExtractDRegister(instr, 22, 12);
16731                                       unsigned length = 4;
16732                                       unsigned last =
16733                                           first +
16734                                           (length - 1) *
16735                                               (spacing == kSingle ? 1 : 2);
16736                                       unsigned rn = (instr >> 16) & 0xf;
16737                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
16738                                       vld4(CurrentCond(),
16739                                            dt,
16740                                            NeonRegisterList(DRegister(first),
16741                                                             DRegister(last),
16742                                                             spacing,
16743                                                             lane),
16744                                            AlignedMemOperand(Register(rn),
16745                                                              align,
16746                                                              Offset));
16747                                       break;
16748                                     }
16749                                   }
16750                                   break;
16751                                 }
16752                                 default: {
16753                                   if (((instr & 0xc00) == 0xc00) ||
16754                                       ((instr & 0xd) == 0xd)) {
16755                                     UnallocatedT32(instr);
16756                                     return;
16757                                   }
16758                                   DataType dt =
16759                                       Dt_size_7_Decode((instr >> 10) & 0x3);
16760                                   if (dt.Is(kDataTypeValueInvalid)) {
16761                                     UnallocatedT32(instr);
16762                                     return;
16763                                   }
16764                                   DecodeNeonAndAlign decode_neon =
16765                                       Align_index_align_3_Decode((instr >> 4) &
16766                                                                      0xf,
16767                                                                  dt);
16768                                   if (!decode_neon.IsValid()) {
16769                                     UnallocatedT32(instr);
16770                                     return;
16771                                   }
16772                                   Alignment align = decode_neon.GetAlign();
16773                                   int lane = decode_neon.GetLane();
16774                                   SpacingType spacing =
16775                                       decode_neon.GetSpacing();
16776                                   unsigned first =
16777                                       ExtractDRegister(instr, 22, 12);
16778                                   unsigned length = 4;
16779                                   unsigned last =
16780                                       first +
16781                                       (length - 1) *
16782                                           (spacing == kSingle ? 1 : 2);
16783                                   unsigned rn = (instr >> 16) & 0xf;
16784                                   unsigned rm = instr & 0xf;
16785                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
16786                                   vld4(CurrentCond(),
16787                                        dt,
16788                                        NeonRegisterList(DRegister(first),
16789                                                         DRegister(last),
16790                                                         spacing,
16791                                                         lane),
16792                                        AlignedMemOperand(Register(rn),
16793                                                          align,
16794                                                          Register(rm),
16795                                                          PostIndex));
16796                                   break;
16797                                 }
16798                               }
16799                               break;
16800                             }
16801                           }
16802                           break;
16803                         }
16804                       }
16805                       break;
16806                     }
16807                   }
16808                   break;
16809                 }
16810                 case 0x10100000: {
16811                   // 0xf8100000
16812                   switch (instr & 0x01400000) {
16813                     case 0x00000000: {
16814                       // 0xf8100000
16815                       switch (instr & 0x000f0000) {
16816                         case 0x000f0000: {
16817                           // 0xf81f0000
16818                           switch (instr & 0x0000f000) {
16819                             case 0x0000f000: {
16820                               // 0xf81ff000
16821                               uint32_t U = (instr >> 23) & 0x1;
16822                               int32_t imm = instr & 0xfff;
16823                               if (U == 0) imm = -imm;
16824                               bool minus_zero = (imm == 0) && (U == 0);
16825                               Label label(imm, kT32PcDelta, minus_zero);
16826                               // PLD{<c>}{<q>} <label> ; T1
16827                               pld(CurrentCond(), &label);
16828                               if (((instr & 0xff7ff000) != 0xf81ff000)) {
16829                                 UnpredictableT32(instr);
16830                               }
16831                               break;
16832                             }
16833                             default: {
16834                               switch (instr & 0x00200000) {
16835                                 case 0x00000000: {
16836                                   // 0xf81f0000
16837                                   if (((instr & 0xf000) == 0xf000)) {
16838                                     UnallocatedT32(instr);
16839                                     return;
16840                                   }
16841                                   unsigned rt = (instr >> 12) & 0xf;
16842                                   uint32_t U = (instr >> 23) & 0x1;
16843                                   int32_t imm = instr & 0xfff;
16844                                   if (U == 0) imm = -imm;
16845                                   bool minus_zero = (imm == 0) && (U == 0);
16846                                   Label label(imm, kT32PcDelta, minus_zero);
16847                                   // LDRB{<c>}{<q>} <Rt>, <label> ; T1
16848                                   ldrb(CurrentCond(), Register(rt), &label);
16849                                   break;
16850                                 }
16851                                 case 0x00200000: {
16852                                   // 0xf83f0000
16853                                   if (((instr & 0xf000) == 0xf000)) {
16854                                     UnallocatedT32(instr);
16855                                     return;
16856                                   }
16857                                   unsigned rt = (instr >> 12) & 0xf;
16858                                   uint32_t U = (instr >> 23) & 0x1;
16859                                   int32_t imm = instr & 0xfff;
16860                                   if (U == 0) imm = -imm;
16861                                   bool minus_zero = (imm == 0) && (U == 0);
16862                                   Label label(imm, kT32PcDelta, minus_zero);
16863                                   // LDRH{<c>}{<q>} <Rt>, <label> ; T1
16864                                   ldrh(CurrentCond(), Register(rt), &label);
16865                                   break;
16866                                 }
16867                               }
16868                               break;
16869                             }
16870                           }
16871                           break;
16872                         }
16873                         default: {
16874                           switch (instr & 0x00a00000) {
16875                             case 0x00000000: {
16876                               // 0xf8100000
16877                               switch (instr & 0x00000d00) {
16878                                 case 0x00000000: {
16879                                   // 0xf8100000
16880                                   switch (instr & 0x000002c0) {
16881                                     case 0x00000000: {
16882                                       // 0xf8100000
16883                                       switch (instr & 0x0000f000) {
16884                                         case 0x0000f000: {
16885                                           // 0xf810f000
16886                                           if (((instr & 0xf0000) == 0xf0000)) {
16887                                             UnallocatedT32(instr);
16888                                             return;
16889                                           }
16890                                           unsigned rn = (instr >> 16) & 0xf;
16891                                           Sign sign(plus);
16892                                           unsigned rm = instr & 0xf;
16893                                           Shift shift = LSL;
16894                                           uint32_t amount = (instr >> 4) & 0x3;
16895                                           AddrMode addrmode = Offset;
16896                                           // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
16897                                           pld(CurrentCond(),
16898                                               MemOperand(Register(rn),
16899                                                          sign,
16900                                                          Register(rm),
16901                                                          shift,
16902                                                          amount,
16903                                                          addrmode));
16904                                           break;
16905                                         }
16906                                         default: {
16907                                           if (((instr & 0xf0000) == 0xf0000) ||
16908                                               ((instr & 0xf000) == 0xf000)) {
16909                                             UnallocatedT32(instr);
16910                                             return;
16911                                           }
16912                                           unsigned rt = (instr >> 12) & 0xf;
16913                                           unsigned rn = (instr >> 16) & 0xf;
16914                                           Sign sign(plus);
16915                                           unsigned rm = instr & 0xf;
16916                                           Shift shift = LSL;
16917                                           uint32_t amount = (instr >> 4) & 0x3;
16918                                           AddrMode addrmode = Offset;
16919                                           if ((rt < kNumberOfT32LowRegisters) &&
16920                                               (rn < kNumberOfT32LowRegisters) &&
16921                                               (rm < kNumberOfT32LowRegisters) &&
16922                                               shift.IsLSL() && (amount == 0) &&
16923                                               sign.IsPlus()) {
16924                                             // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
16925                                             ldrb(CurrentCond(),
16926                                                  Wide,
16927                                                  Register(rt),
16928                                                  MemOperand(Register(rn),
16929                                                             sign,
16930                                                             Register(rm),
16931                                                             addrmode));
16932                                           } else {
16933                                             // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
16934                                             ldrb(CurrentCond(),
16935                                                  Best,
16936                                                  Register(rt),
16937                                                  MemOperand(Register(rn),
16938                                                             sign,
16939                                                             Register(rm),
16940                                                             shift,
16941                                                             amount,
16942                                                             addrmode));
16943                                           }
16944                                           break;
16945                                         }
16946                                       }
16947                                       break;
16948                                     }
16949                                     default:
16950                                       UnallocatedT32(instr);
16951                                       break;
16952                                   }
16953                                   break;
16954                                 }
16955                                 case 0x00000900: {
16956                                   // 0xf8100900
16957                                   if (((instr & 0xf0000) == 0xf0000)) {
16958                                     UnallocatedT32(instr);
16959                                     return;
16960                                   }
16961                                   unsigned rt = (instr >> 12) & 0xf;
16962                                   unsigned rn = (instr >> 16) & 0xf;
16963                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
16964                                                                         : plus);
16965                                   int32_t offset = instr & 0xff;
16966                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
16967                                   ldrb(CurrentCond(),
16968                                        Best,
16969                                        Register(rt),
16970                                        MemOperand(Register(rn),
16971                                                   sign,
16972                                                   offset,
16973                                                   PostIndex));
16974                                   break;
16975                                 }
16976                                 case 0x00000c00: {
16977                                   // 0xf8100c00
16978                                   switch (instr & 0x00000200) {
16979                                     case 0x00000000: {
16980                                       // 0xf8100c00
16981                                       switch (instr & 0x0000f000) {
16982                                         case 0x0000f000: {
16983                                           // 0xf810fc00
16984                                           if (((instr & 0xf0000) == 0xf0000)) {
16985                                             UnallocatedT32(instr);
16986                                             return;
16987                                           }
16988                                           unsigned rn = (instr >> 16) & 0xf;
16989                                           int32_t offset = instr & 0xff;
16990                                           // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
16991                                           pld(CurrentCond(),
16992                                               MemOperand(Register(rn),
16993                                                          minus,
16994                                                          offset,
16995                                                          Offset));
16996                                           break;
16997                                         }
16998                                         default: {
16999                                           if (((instr & 0xf0000) == 0xf0000) ||
17000                                               ((instr & 0xf000) == 0xf000)) {
17001                                             UnallocatedT32(instr);
17002                                             return;
17003                                           }
17004                                           unsigned rt = (instr >> 12) & 0xf;
17005                                           unsigned rn = (instr >> 16) & 0xf;
17006                                           int32_t offset = instr & 0xff;
17007                                           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17008                                           ldrb(CurrentCond(),
17009                                                Best,
17010                                                Register(rt),
17011                                                MemOperand(Register(rn),
17012                                                           minus,
17013                                                           offset,
17014                                                           Offset));
17015                                           break;
17016                                         }
17017                                       }
17018                                       break;
17019                                     }
17020                                     case 0x00000200: {
17021                                       // 0xf8100e00
17022                                       if (((instr & 0xf0000) == 0xf0000)) {
17023                                         UnallocatedT32(instr);
17024                                         return;
17025                                       }
17026                                       UnimplementedT32_32("LDRBT", instr);
17027                                       break;
17028                                     }
17029                                   }
17030                                   break;
17031                                 }
17032                                 case 0x00000d00: {
17033                                   // 0xf8100d00
17034                                   if (((instr & 0xf0000) == 0xf0000)) {
17035                                     UnallocatedT32(instr);
17036                                     return;
17037                                   }
17038                                   unsigned rt = (instr >> 12) & 0xf;
17039                                   unsigned rn = (instr >> 16) & 0xf;
17040                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17041                                                                         : plus);
17042                                   int32_t offset = instr & 0xff;
17043                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17044                                   ldrb(CurrentCond(),
17045                                        Best,
17046                                        Register(rt),
17047                                        MemOperand(Register(rn),
17048                                                   sign,
17049                                                   offset,
17050                                                   PreIndex));
17051                                   break;
17052                                 }
17053                                 default:
17054                                   UnallocatedT32(instr);
17055                                   break;
17056                               }
17057                               break;
17058                             }
17059                             case 0x00200000: {
17060                               // 0xf8300000
17061                               switch (instr & 0x00000d00) {
17062                                 case 0x00000000: {
17063                                   // 0xf8300000
17064                                   switch (instr & 0x000002c0) {
17065                                     case 0x00000000: {
17066                                       // 0xf8300000
17067                                       switch (instr & 0x0000f000) {
17068                                         case 0x0000f000: {
17069                                           // 0xf830f000
17070                                           if (((instr & 0xf0000) == 0xf0000)) {
17071                                             UnallocatedT32(instr);
17072                                             return;
17073                                           }
17074                                           unsigned rn = (instr >> 16) & 0xf;
17075                                           Sign sign(plus);
17076                                           unsigned rm = instr & 0xf;
17077                                           Shift shift = LSL;
17078                                           uint32_t amount = (instr >> 4) & 0x3;
17079                                           AddrMode addrmode = Offset;
17080                                           // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17081                                           pldw(CurrentCond(),
17082                                                MemOperand(Register(rn),
17083                                                           sign,
17084                                                           Register(rm),
17085                                                           shift,
17086                                                           amount,
17087                                                           addrmode));
17088                                           break;
17089                                         }
17090                                         default: {
17091                                           if (((instr & 0xf0000) == 0xf0000) ||
17092                                               ((instr & 0xf000) == 0xf000)) {
17093                                             UnallocatedT32(instr);
17094                                             return;
17095                                           }
17096                                           unsigned rt = (instr >> 12) & 0xf;
17097                                           unsigned rn = (instr >> 16) & 0xf;
17098                                           Sign sign(plus);
17099                                           unsigned rm = instr & 0xf;
17100                                           Shift shift = LSL;
17101                                           uint32_t amount = (instr >> 4) & 0x3;
17102                                           AddrMode addrmode = Offset;
17103                                           if ((rt < kNumberOfT32LowRegisters) &&
17104                                               (rn < kNumberOfT32LowRegisters) &&
17105                                               (rm < kNumberOfT32LowRegisters) &&
17106                                               shift.IsLSL() && (amount == 0) &&
17107                                               sign.IsPlus()) {
17108                                             // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17109                                             ldrh(CurrentCond(),
17110                                                  Wide,
17111                                                  Register(rt),
17112                                                  MemOperand(Register(rn),
17113                                                             sign,
17114                                                             Register(rm),
17115                                                             addrmode));
17116                                           } else {
17117                                             // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17118                                             ldrh(CurrentCond(),
17119                                                  Best,
17120                                                  Register(rt),
17121                                                  MemOperand(Register(rn),
17122                                                             sign,
17123                                                             Register(rm),
17124                                                             shift,
17125                                                             amount,
17126                                                             addrmode));
17127                                           }
17128                                           break;
17129                                         }
17130                                       }
17131                                       break;
17132                                     }
17133                                     default:
17134                                       UnallocatedT32(instr);
17135                                       break;
17136                                   }
17137                                   break;
17138                                 }
17139                                 case 0x00000900: {
17140                                   // 0xf8300900
17141                                   if (((instr & 0xf0000) == 0xf0000)) {
17142                                     UnallocatedT32(instr);
17143                                     return;
17144                                   }
17145                                   unsigned rt = (instr >> 12) & 0xf;
17146                                   unsigned rn = (instr >> 16) & 0xf;
17147                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17148                                                                         : plus);
17149                                   int32_t offset = instr & 0xff;
17150                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
17151                                   ldrh(CurrentCond(),
17152                                        Best,
17153                                        Register(rt),
17154                                        MemOperand(Register(rn),
17155                                                   sign,
17156                                                   offset,
17157                                                   PostIndex));
17158                                   break;
17159                                 }
17160                                 case 0x00000c00: {
17161                                   // 0xf8300c00
17162                                   switch (instr & 0x00000200) {
17163                                     case 0x00000000: {
17164                                       // 0xf8300c00
17165                                       switch (instr & 0x0000f000) {
17166                                         case 0x0000f000: {
17167                                           // 0xf830fc00
17168                                           if (((instr & 0xf0000) == 0xf0000)) {
17169                                             UnallocatedT32(instr);
17170                                             return;
17171                                           }
17172                                           unsigned rn = (instr >> 16) & 0xf;
17173                                           int32_t offset = instr & 0xff;
17174                                           // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17175                                           pldw(CurrentCond(),
17176                                                MemOperand(Register(rn),
17177                                                           minus,
17178                                                           offset,
17179                                                           Offset));
17180                                           break;
17181                                         }
17182                                         default: {
17183                                           if (((instr & 0xf0000) == 0xf0000) ||
17184                                               ((instr & 0xf000) == 0xf000)) {
17185                                             UnallocatedT32(instr);
17186                                             return;
17187                                           }
17188                                           unsigned rt = (instr >> 12) & 0xf;
17189                                           unsigned rn = (instr >> 16) & 0xf;
17190                                           int32_t offset = instr & 0xff;
17191                                           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
17192                                           ldrh(CurrentCond(),
17193                                                Best,
17194                                                Register(rt),
17195                                                MemOperand(Register(rn),
17196                                                           minus,
17197                                                           offset,
17198                                                           Offset));
17199                                           break;
17200                                         }
17201                                       }
17202                                       break;
17203                                     }
17204                                     case 0x00000200: {
17205                                       // 0xf8300e00
17206                                       if (((instr & 0xf0000) == 0xf0000)) {
17207                                         UnallocatedT32(instr);
17208                                         return;
17209                                       }
17210                                       UnimplementedT32_32("LDRHT", instr);
17211                                       break;
17212                                     }
17213                                   }
17214                                   break;
17215                                 }
17216                                 case 0x00000d00: {
17217                                   // 0xf8300d00
17218                                   if (((instr & 0xf0000) == 0xf0000)) {
17219                                     UnallocatedT32(instr);
17220                                     return;
17221                                   }
17222                                   unsigned rt = (instr >> 12) & 0xf;
17223                                   unsigned rn = (instr >> 16) & 0xf;
17224                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
17225                                                                         : plus);
17226                                   int32_t offset = instr & 0xff;
17227                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
17228                                   ldrh(CurrentCond(),
17229                                        Best,
17230                                        Register(rt),
17231                                        MemOperand(Register(rn),
17232                                                   sign,
17233                                                   offset,
17234                                                   PreIndex));
17235                                   break;
17236                                 }
17237                                 default:
17238                                   UnallocatedT32(instr);
17239                                   break;
17240                               }
17241                               break;
17242                             }
17243                             case 0x00800000: {
17244                               // 0xf8900000
17245                               switch (instr & 0x0000f000) {
17246                                 case 0x0000f000: {
17247                                   // 0xf890f000
17248                                   if (((instr & 0xf0000) == 0xf0000)) {
17249                                     UnallocatedT32(instr);
17250                                     return;
17251                                   }
17252                                   unsigned rn = (instr >> 16) & 0xf;
17253                                   int32_t offset = instr & 0xfff;
17254                                   // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17255                                   pld(CurrentCond(),
17256                                       MemOperand(Register(rn),
17257                                                  plus,
17258                                                  offset,
17259                                                  Offset));
17260                                   break;
17261                                 }
17262                                 default: {
17263                                   if (((instr & 0xf0000) == 0xf0000) ||
17264                                       ((instr & 0xf000) == 0xf000)) {
17265                                     UnallocatedT32(instr);
17266                                     return;
17267                                   }
17268                                   unsigned rt = (instr >> 12) & 0xf;
17269                                   unsigned rn = (instr >> 16) & 0xf;
17270                                   int32_t offset = instr & 0xfff;
17271                                   if ((rt < kNumberOfT32LowRegisters) &&
17272                                       (rn < kNumberOfT32LowRegisters) &&
17273                                       ((offset >= 0) && (offset <= 31))) {
17274                                     // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17275                                     ldrb(CurrentCond(),
17276                                          Wide,
17277                                          Register(rt),
17278                                          MemOperand(Register(rn),
17279                                                     plus,
17280                                                     offset,
17281                                                     Offset));
17282                                   } else {
17283                                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17284                                     ldrb(CurrentCond(),
17285                                          Best,
17286                                          Register(rt),
17287                                          MemOperand(Register(rn),
17288                                                     plus,
17289                                                     offset,
17290                                                     Offset));
17291                                   }
17292                                   break;
17293                                 }
17294                               }
17295                               break;
17296                             }
17297                             case 0x00a00000: {
17298                               // 0xf8b00000
17299                               switch (instr & 0x0000f000) {
17300                                 case 0x0000f000: {
17301                                   // 0xf8b0f000
17302                                   if (((instr & 0xf0000) == 0xf0000)) {
17303                                     UnallocatedT32(instr);
17304                                     return;
17305                                   }
17306                                   unsigned rn = (instr >> 16) & 0xf;
17307                                   int32_t offset = instr & 0xfff;
17308                                   // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17309                                   pldw(CurrentCond(),
17310                                        MemOperand(Register(rn),
17311                                                   plus,
17312                                                   offset,
17313                                                   Offset));
17314                                   break;
17315                                 }
17316                                 default: {
17317                                   if (((instr & 0xf0000) == 0xf0000) ||
17318                                       ((instr & 0xf000) == 0xf000)) {
17319                                     UnallocatedT32(instr);
17320                                     return;
17321                                   }
17322                                   unsigned rt = (instr >> 12) & 0xf;
17323                                   unsigned rn = (instr >> 16) & 0xf;
17324                                   int32_t offset = instr & 0xfff;
17325                                   if ((rt < kNumberOfT32LowRegisters) &&
17326                                       (rn < kNumberOfT32LowRegisters) &&
17327                                       ((offset >= 0) && (offset <= 62) &&
17328                                        ((offset & 1) == 0))) {
17329                                     // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17330                                     ldrh(CurrentCond(),
17331                                          Wide,
17332                                          Register(rt),
17333                                          MemOperand(Register(rn),
17334                                                     plus,
17335                                                     offset,
17336                                                     Offset));
17337                                   } else {
17338                                     // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17339                                     ldrh(CurrentCond(),
17340                                          Best,
17341                                          Register(rt),
17342                                          MemOperand(Register(rn),
17343                                                     plus,
17344                                                     offset,
17345                                                     Offset));
17346                                   }
17347                                   break;
17348                                 }
17349                               }
17350                               break;
17351                             }
17352                           }
17353                           break;
17354                         }
17355                       }
17356                       break;
17357                     }
17358                     case 0x00400000: {
17359                       // 0xf8500000
17360                       switch (instr & 0x00200000) {
17361                         case 0x00000000: {
17362                           // 0xf8500000
17363                           switch (instr & 0x000f0000) {
17364                             case 0x000f0000: {
17365                               // 0xf85f0000
17366                               unsigned rt = (instr >> 12) & 0xf;
17367                               uint32_t U = (instr >> 23) & 0x1;
17368                               int32_t imm = instr & 0xfff;
17369                               if (U == 0) imm = -imm;
17370                               bool minus_zero = (imm == 0) && (U == 0);
17371                               Label label(imm, kT32PcDelta, minus_zero);
17372                               if ((imm >= -4095) && (imm <= 4095) &&
17373                                   ((rt < kNumberOfT32LowRegisters) &&
17374                                    (imm >= 0) && (imm <= 1020) &&
17375                                    ((imm & 3) == 0))) {
17376                                 // LDR{<c>}.W <Rt>, <label> ; T2
17377                                 ldr(CurrentCond(), Wide, Register(rt), &label);
17378                               } else {
17379                                 // LDR{<c>}{<q>} <Rt>, <label> ; T2
17380                                 ldr(CurrentCond(), Best, Register(rt), &label);
17381                               }
17382                               break;
17383                             }
17384                             default: {
17385                               switch (instr & 0x00800000) {
17386                                 case 0x00000000: {
17387                                   // 0xf8500000
17388                                   switch (instr & 0x00000d00) {
17389                                     case 0x00000000: {
17390                                       // 0xf8500000
17391                                       if ((instr & 0x000002c0) == 0x00000000) {
17392                                         if (((instr & 0xf0000) == 0xf0000)) {
17393                                           UnallocatedT32(instr);
17394                                           return;
17395                                         }
17396                                         unsigned rt = (instr >> 12) & 0xf;
17397                                         unsigned rn = (instr >> 16) & 0xf;
17398                                         Sign sign(plus);
17399                                         unsigned rm = instr & 0xf;
17400                                         Shift shift = LSL;
17401                                         uint32_t amount = (instr >> 4) & 0x3;
17402                                         AddrMode addrmode = Offset;
17403                                         if ((rt < kNumberOfT32LowRegisters) &&
17404                                             (rn < kNumberOfT32LowRegisters) &&
17405                                             (rm < kNumberOfT32LowRegisters) &&
17406                                             shift.IsLSL() && (amount == 0) &&
17407                                             sign.IsPlus()) {
17408                                           // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17409                                           ldr(CurrentCond(),
17410                                               Wide,
17411                                               Register(rt),
17412                                               MemOperand(Register(rn),
17413                                                          sign,
17414                                                          Register(rm),
17415                                                          addrmode));
17416                                         } else {
17417                                           // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17418                                           ldr(CurrentCond(),
17419                                               Best,
17420                                               Register(rt),
17421                                               MemOperand(Register(rn),
17422                                                          sign,
17423                                                          Register(rm),
17424                                                          shift,
17425                                                          amount,
17426                                                          addrmode));
17427                                         }
17428                                       } else {
17429                                         UnallocatedT32(instr);
17430                                       }
17431                                       break;
17432                                     }
17433                                     case 0x00000900: {
17434                                       // 0xf8500900
17435                                       if (((instr & 0xf0000) == 0xf0000)) {
17436                                         UnallocatedT32(instr);
17437                                         return;
17438                                       }
17439                                       if (((Uint32((instr >> 16)) &
17440                                             Uint32(0xf)) == Uint32(0xd)) &&
17441                                           ((Uint32((instr >> 9)) &
17442                                             Uint32(0x1)) == Uint32(0x1)) &&
17443                                           ((Uint32(instr) & Uint32(0xff)) ==
17444                                            Uint32(0x4))) {
17445                                         unsigned rt = (instr >> 12) & 0xf;
17446                                         if ((rt <= 7) || (rt == kPCRegNum)) {
17447                                           // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
17448                                           pop(CurrentCond(),
17449                                               Wide,
17450                                               Register(rt));
17451                                         } else {
17452                                           // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
17453                                           pop(CurrentCond(),
17454                                               Best,
17455                                               Register(rt));
17456                                         }
17457                                         return;
17458                                       }
17459                                       unsigned rt = (instr >> 12) & 0xf;
17460                                       unsigned rn = (instr >> 16) & 0xf;
17461                                       Sign sign((((instr >> 9) & 0x1) == 0)
17462                                                     ? minus
17463                                                     : plus);
17464                                       int32_t offset = instr & 0xff;
17465                                       // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
17466                                       ldr(CurrentCond(),
17467                                           Best,
17468                                           Register(rt),
17469                                           MemOperand(Register(rn),
17470                                                      sign,
17471                                                      offset,
17472                                                      PostIndex));
17473                                       break;
17474                                     }
17475                                     case 0x00000c00: {
17476                                       // 0xf8500c00
17477                                       switch (instr & 0x00000200) {
17478                                         case 0x00000000: {
17479                                           // 0xf8500c00
17480                                           if (((instr & 0xf0000) == 0xf0000)) {
17481                                             UnallocatedT32(instr);
17482                                             return;
17483                                           }
17484                                           unsigned rt = (instr >> 12) & 0xf;
17485                                           unsigned rn = (instr >> 16) & 0xf;
17486                                           int32_t offset = instr & 0xff;
17487                                           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
17488                                           ldr(CurrentCond(),
17489                                               Best,
17490                                               Register(rt),
17491                                               MemOperand(Register(rn),
17492                                                          minus,
17493                                                          offset,
17494                                                          Offset));
17495                                           break;
17496                                         }
17497                                         case 0x00000200: {
17498                                           // 0xf8500e00
17499                                           if (((instr & 0xf0000) == 0xf0000)) {
17500                                             UnallocatedT32(instr);
17501                                             return;
17502                                           }
17503                                           UnimplementedT32_32("LDRT", instr);
17504                                           break;
17505                                         }
17506                                       }
17507                                       break;
17508                                     }
17509                                     case 0x00000d00: {
17510                                       // 0xf8500d00
17511                                       if (((instr & 0xf0000) == 0xf0000)) {
17512                                         UnallocatedT32(instr);
17513                                         return;
17514                                       }
17515                                       unsigned rt = (instr >> 12) & 0xf;
17516                                       unsigned rn = (instr >> 16) & 0xf;
17517                                       Sign sign((((instr >> 9) & 0x1) == 0)
17518                                                     ? minus
17519                                                     : plus);
17520                                       int32_t offset = instr & 0xff;
17521                                       // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
17522                                       ldr(CurrentCond(),
17523                                           Best,
17524                                           Register(rt),
17525                                           MemOperand(Register(rn),
17526                                                      sign,
17527                                                      offset,
17528                                                      PreIndex));
17529                                       break;
17530                                     }
17531                                     default:
17532                                       UnallocatedT32(instr);
17533                                       break;
17534                                   }
17535                                   break;
17536                                 }
17537                                 case 0x00800000: {
17538                                   // 0xf8d00000
17539                                   if (((instr & 0xf0000) == 0xf0000)) {
17540                                     UnallocatedT32(instr);
17541                                     return;
17542                                   }
17543                                   unsigned rt = (instr >> 12) & 0xf;
17544                                   unsigned rn = (instr >> 16) & 0xf;
17545                                   int32_t offset = instr & 0xfff;
17546                                   if (((rt < kNumberOfT32LowRegisters) &&
17547                                        (rn < kNumberOfT32LowRegisters) &&
17548                                        ((offset >= 0) && (offset <= 124) &&
17549                                         ((offset & 3) == 0))) ||
17550                                       ((rt < kNumberOfT32LowRegisters) &&
17551                                        (rn == sp.GetCode()) &&
17552                                        ((offset >= 0) && (offset <= 1020) &&
17553                                         ((offset & 3) == 0)))) {
17554                                     // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17555                                     ldr(CurrentCond(),
17556                                         Wide,
17557                                         Register(rt),
17558                                         MemOperand(Register(rn),
17559                                                    plus,
17560                                                    offset,
17561                                                    Offset));
17562                                   } else {
17563                                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
17564                                     ldr(CurrentCond(),
17565                                         Best,
17566                                         Register(rt),
17567                                         MemOperand(Register(rn),
17568                                                    plus,
17569                                                    offset,
17570                                                    Offset));
17571                                   }
17572                                   break;
17573                                 }
17574                               }
17575                               break;
17576                             }
17577                           }
17578                           break;
17579                         }
17580                         default:
17581                           UnallocatedT32(instr);
17582                           break;
17583                       }
17584                       break;
17585                     }
17586                     case 0x01000000: {
17587                       // 0xf9100000
17588                       switch (instr & 0x00200000) {
17589                         case 0x00000000: {
17590                           // 0xf9100000
17591                           switch (instr & 0x000f0000) {
17592                             case 0x000f0000: {
17593                               // 0xf91f0000
17594                               switch (instr & 0x0000f000) {
17595                                 case 0x0000f000: {
17596                                   // 0xf91ff000
17597                                   uint32_t U = (instr >> 23) & 0x1;
17598                                   int32_t imm = instr & 0xfff;
17599                                   if (U == 0) imm = -imm;
17600                                   bool minus_zero = (imm == 0) && (U == 0);
17601                                   Label label(imm, kT32PcDelta, minus_zero);
17602                                   // PLI{<c>}{<q>} <label> ; T3
17603                                   pli(CurrentCond(), &label);
17604                                   break;
17605                                 }
17606                                 default: {
17607                                   if (((instr & 0xf000) == 0xf000)) {
17608                                     UnallocatedT32(instr);
17609                                     return;
17610                                   }
17611                                   unsigned rt = (instr >> 12) & 0xf;
17612                                   uint32_t U = (instr >> 23) & 0x1;
17613                                   int32_t imm = instr & 0xfff;
17614                                   if (U == 0) imm = -imm;
17615                                   bool minus_zero = (imm == 0) && (U == 0);
17616                                   Label label(imm, kT32PcDelta, minus_zero);
17617                                   // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
17618                                   ldrsb(CurrentCond(), Register(rt), &label);
17619                                   break;
17620                                 }
17621                               }
17622                               break;
17623                             }
17624                             default: {
17625                               switch (instr & 0x00800000) {
17626                                 case 0x00000000: {
17627                                   // 0xf9100000
17628                                   switch (instr & 0x00000d00) {
17629                                     case 0x00000000: {
17630                                       // 0xf9100000
17631                                       switch (instr & 0x000002c0) {
17632                                         case 0x00000000: {
17633                                           // 0xf9100000
17634                                           switch (instr & 0x0000f000) {
17635                                             case 0x0000f000: {
17636                                               // 0xf910f000
17637                                               if (((instr & 0xf0000) ==
17638                                                    0xf0000)) {
17639                                                 UnallocatedT32(instr);
17640                                                 return;
17641                                               }
17642                                               unsigned rn = (instr >> 16) & 0xf;
17643                                               Sign sign(plus);
17644                                               unsigned rm = instr & 0xf;
17645                                               Shift shift = LSL;
17646                                               uint32_t amount =
17647                                                   (instr >> 4) & 0x3;
17648                                               AddrMode addrmode = Offset;
17649                                               // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
17650                                               pli(CurrentCond(),
17651                                                   MemOperand(Register(rn),
17652                                                              sign,
17653                                                              Register(rm),
17654                                                              shift,
17655                                                              amount,
17656                                                              addrmode));
17657                                               break;
17658                                             }
17659                                             default: {
17660                                               if (((instr & 0xf0000) ==
17661                                                    0xf0000) ||
17662                                                   ((instr & 0xf000) ==
17663                                                    0xf000)) {
17664                                                 UnallocatedT32(instr);
17665                                                 return;
17666                                               }
17667                                               unsigned rt = (instr >> 12) & 0xf;
17668                                               unsigned rn = (instr >> 16) & 0xf;
17669                                               Sign sign(plus);
17670                                               unsigned rm = instr & 0xf;
17671                                               Shift shift = LSL;
17672                                               uint32_t amount =
17673                                                   (instr >> 4) & 0x3;
17674                                               AddrMode addrmode = Offset;
17675                                               if ((rt <
17676                                                    kNumberOfT32LowRegisters) &&
17677                                                   (rn <
17678                                                    kNumberOfT32LowRegisters) &&
17679                                                   (rm <
17680                                                    kNumberOfT32LowRegisters) &&
17681                                                   shift.IsLSL() &&
17682                                                   (amount == 0) &&
17683                                                   sign.IsPlus()) {
17684                                                 // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17685                                                 ldrsb(CurrentCond(),
17686                                                       Wide,
17687                                                       Register(rt),
17688                                                       MemOperand(Register(rn),
17689                                                                  sign,
17690                                                                  Register(rm),
17691                                                                  addrmode));
17692                                               } else {
17693                                                 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17694                                                 ldrsb(CurrentCond(),
17695                                                       Best,
17696                                                       Register(rt),
17697                                                       MemOperand(Register(rn),
17698                                                                  sign,
17699                                                                  Register(rm),
17700                                                                  shift,
17701                                                                  amount,
17702                                                                  addrmode));
17703                                               }
17704                                               break;
17705                                             }
17706                                           }
17707                                           break;
17708                                         }
17709                                         default:
17710                                           UnallocatedT32(instr);
17711                                           break;
17712                                       }
17713                                       break;
17714                                     }
17715                                     case 0x00000900: {
17716                                       // 0xf9100900
17717                                       if (((instr & 0xf0000) == 0xf0000)) {
17718                                         UnallocatedT32(instr);
17719                                         return;
17720                                       }
17721                                       unsigned rt = (instr >> 12) & 0xf;
17722                                       unsigned rn = (instr >> 16) & 0xf;
17723                                       Sign sign((((instr >> 9) & 0x1) == 0)
17724                                                     ? minus
17725                                                     : plus);
17726                                       int32_t offset = instr & 0xff;
17727                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
17728                                       ldrsb(CurrentCond(),
17729                                             Best,
17730                                             Register(rt),
17731                                             MemOperand(Register(rn),
17732                                                        sign,
17733                                                        offset,
17734                                                        PostIndex));
17735                                       break;
17736                                     }
17737                                     case 0x00000c00: {
17738                                       // 0xf9100c00
17739                                       switch (instr & 0x00000200) {
17740                                         case 0x00000000: {
17741                                           // 0xf9100c00
17742                                           switch (instr & 0x0000f000) {
17743                                             case 0x0000f000: {
17744                                               // 0xf910fc00
17745                                               if (((instr & 0xf0000) ==
17746                                                    0xf0000)) {
17747                                                 UnallocatedT32(instr);
17748                                                 return;
17749                                               }
17750                                               unsigned rn = (instr >> 16) & 0xf;
17751                                               int32_t offset = instr & 0xff;
17752                                               // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17753                                               pli(CurrentCond(),
17754                                                   MemOperand(Register(rn),
17755                                                              minus,
17756                                                              offset,
17757                                                              Offset));
17758                                               break;
17759                                             }
17760                                             default: {
17761                                               if (((instr & 0xf0000) ==
17762                                                    0xf0000) ||
17763                                                   ((instr & 0xf000) ==
17764                                                    0xf000)) {
17765                                                 UnallocatedT32(instr);
17766                                                 return;
17767                                               }
17768                                               unsigned rt = (instr >> 12) & 0xf;
17769                                               unsigned rn = (instr >> 16) & 0xf;
17770                                               int32_t offset = instr & 0xff;
17771                                               // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17772                                               ldrsb(CurrentCond(),
17773                                                     Best,
17774                                                     Register(rt),
17775                                                     MemOperand(Register(rn),
17776                                                                minus,
17777                                                                offset,
17778                                                                Offset));
17779                                               break;
17780                                             }
17781                                           }
17782                                           break;
17783                                         }
17784                                         case 0x00000200: {
17785                                           // 0xf9100e00
17786                                           if (((instr & 0xf0000) == 0xf0000)) {
17787                                             UnallocatedT32(instr);
17788                                             return;
17789                                           }
17790                                           UnimplementedT32_32("LDRSBT", instr);
17791                                           break;
17792                                         }
17793                                       }
17794                                       break;
17795                                     }
17796                                     case 0x00000d00: {
17797                                       // 0xf9100d00
17798                                       if (((instr & 0xf0000) == 0xf0000)) {
17799                                         UnallocatedT32(instr);
17800                                         return;
17801                                       }
17802                                       unsigned rt = (instr >> 12) & 0xf;
17803                                       unsigned rn = (instr >> 16) & 0xf;
17804                                       Sign sign((((instr >> 9) & 0x1) == 0)
17805                                                     ? minus
17806                                                     : plus);
17807                                       int32_t offset = instr & 0xff;
17808                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
17809                                       ldrsb(CurrentCond(),
17810                                             Best,
17811                                             Register(rt),
17812                                             MemOperand(Register(rn),
17813                                                        sign,
17814                                                        offset,
17815                                                        PreIndex));
17816                                       break;
17817                                     }
17818                                     default:
17819                                       UnallocatedT32(instr);
17820                                       break;
17821                                   }
17822                                   break;
17823                                 }
17824                                 case 0x00800000: {
17825                                   // 0xf9900000
17826                                   switch (instr & 0x0000f000) {
17827                                     case 0x0000f000: {
17828                                       // 0xf990f000
17829                                       if (((instr & 0xf0000) == 0xf0000)) {
17830                                         UnallocatedT32(instr);
17831                                         return;
17832                                       }
17833                                       unsigned rn = (instr >> 16) & 0xf;
17834                                       int32_t offset = instr & 0xfff;
17835                                       // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
17836                                       pli(CurrentCond(),
17837                                           MemOperand(Register(rn),
17838                                                      plus,
17839                                                      offset,
17840                                                      Offset));
17841                                       break;
17842                                     }
17843                                     default: {
17844                                       if (((instr & 0xf0000) == 0xf0000) ||
17845                                           ((instr & 0xf000) == 0xf000)) {
17846                                         UnallocatedT32(instr);
17847                                         return;
17848                                       }
17849                                       unsigned rt = (instr >> 12) & 0xf;
17850                                       unsigned rn = (instr >> 16) & 0xf;
17851                                       int32_t offset = instr & 0xfff;
17852                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
17853                                       ldrsb(CurrentCond(),
17854                                             Best,
17855                                             Register(rt),
17856                                             MemOperand(Register(rn),
17857                                                        plus,
17858                                                        offset,
17859                                                        Offset));
17860                                       break;
17861                                     }
17862                                   }
17863                                   break;
17864                                 }
17865                               }
17866                               break;
17867                             }
17868                           }
17869                           break;
17870                         }
17871                         case 0x00200000: {
17872                           // 0xf9300000
17873                           switch (instr & 0x000f0000) {
17874                             case 0x000f0000: {
17875                               // 0xf93f0000
17876                               if (((instr & 0xf000) == 0xf000)) {
17877                                 UnallocatedT32(instr);
17878                                 return;
17879                               }
17880                               unsigned rt = (instr >> 12) & 0xf;
17881                               uint32_t U = (instr >> 23) & 0x1;
17882                               int32_t imm = instr & 0xfff;
17883                               if (U == 0) imm = -imm;
17884                               bool minus_zero = (imm == 0) && (U == 0);
17885                               Label label(imm, kT32PcDelta, minus_zero);
17886                               // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
17887                               ldrsh(CurrentCond(), Register(rt), &label);
17888                               break;
17889                             }
17890                             default: {
17891                               switch (instr & 0x00800000) {
17892                                 case 0x00000000: {
17893                                   // 0xf9300000
17894                                   switch (instr & 0x00000d00) {
17895                                     case 0x00000000: {
17896                                       // 0xf9300000
17897                                       if ((instr & 0x000002c0) == 0x00000000) {
17898                                         if (((instr & 0xf0000) == 0xf0000) ||
17899                                             ((instr & 0xf000) == 0xf000)) {
17900                                           UnallocatedT32(instr);
17901                                           return;
17902                                         }
17903                                         unsigned rt = (instr >> 12) & 0xf;
17904                                         unsigned rn = (instr >> 16) & 0xf;
17905                                         Sign sign(plus);
17906                                         unsigned rm = instr & 0xf;
17907                                         Shift shift = LSL;
17908                                         uint32_t amount = (instr >> 4) & 0x3;
17909                                         AddrMode addrmode = Offset;
17910                                         if ((rt < kNumberOfT32LowRegisters) &&
17911                                             (rn < kNumberOfT32LowRegisters) &&
17912                                             (rm < kNumberOfT32LowRegisters) &&
17913                                             shift.IsLSL() && (amount == 0) &&
17914                                             sign.IsPlus()) {
17915                                           // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
17916                                           ldrsh(CurrentCond(),
17917                                                 Wide,
17918                                                 Register(rt),
17919                                                 MemOperand(Register(rn),
17920                                                            sign,
17921                                                            Register(rm),
17922                                                            addrmode));
17923                                         } else {
17924                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
17925                                           ldrsh(CurrentCond(),
17926                                                 Best,
17927                                                 Register(rt),
17928                                                 MemOperand(Register(rn),
17929                                                            sign,
17930                                                            Register(rm),
17931                                                            shift,
17932                                                            amount,
17933                                                            addrmode));
17934                                         }
17935                                       } else {
17936                                         UnallocatedT32(instr);
17937                                       }
17938                                       break;
17939                                     }
17940                                     case 0x00000900: {
17941                                       // 0xf9300900
17942                                       if (((instr & 0xf0000) == 0xf0000)) {
17943                                         UnallocatedT32(instr);
17944                                         return;
17945                                       }
17946                                       unsigned rt = (instr >> 12) & 0xf;
17947                                       unsigned rn = (instr >> 16) & 0xf;
17948                                       Sign sign((((instr >> 9) & 0x1) == 0)
17949                                                     ? minus
17950                                                     : plus);
17951                                       int32_t offset = instr & 0xff;
17952                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
17953                                       ldrsh(CurrentCond(),
17954                                             Best,
17955                                             Register(rt),
17956                                             MemOperand(Register(rn),
17957                                                        sign,
17958                                                        offset,
17959                                                        PostIndex));
17960                                       break;
17961                                     }
17962                                     case 0x00000c00: {
17963                                       // 0xf9300c00
17964                                       switch (instr & 0x00000200) {
17965                                         case 0x00000000: {
17966                                           // 0xf9300c00
17967                                           if (((instr & 0xf0000) == 0xf0000) ||
17968                                               ((instr & 0xf000) == 0xf000)) {
17969                                             UnallocatedT32(instr);
17970                                             return;
17971                                           }
17972                                           unsigned rt = (instr >> 12) & 0xf;
17973                                           unsigned rn = (instr >> 16) & 0xf;
17974                                           int32_t offset = instr & 0xff;
17975                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
17976                                           ldrsh(CurrentCond(),
17977                                                 Best,
17978                                                 Register(rt),
17979                                                 MemOperand(Register(rn),
17980                                                            minus,
17981                                                            offset,
17982                                                            Offset));
17983                                           break;
17984                                         }
17985                                         case 0x00000200: {
17986                                           // 0xf9300e00
17987                                           if (((instr & 0xf0000) == 0xf0000)) {
17988                                             UnallocatedT32(instr);
17989                                             return;
17990                                           }
17991                                           UnimplementedT32_32("LDRSHT", instr);
17992                                           break;
17993                                         }
17994                                       }
17995                                       break;
17996                                     }
17997                                     case 0x00000d00: {
17998                                       // 0xf9300d00
17999                                       if (((instr & 0xf0000) == 0xf0000)) {
18000                                         UnallocatedT32(instr);
18001                                         return;
18002                                       }
18003                                       unsigned rt = (instr >> 12) & 0xf;
18004                                       unsigned rn = (instr >> 16) & 0xf;
18005                                       Sign sign((((instr >> 9) & 0x1) == 0)
18006                                                     ? minus
18007                                                     : plus);
18008                                       int32_t offset = instr & 0xff;
18009                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
18010                                       ldrsh(CurrentCond(),
18011                                             Best,
18012                                             Register(rt),
18013                                             MemOperand(Register(rn),
18014                                                        sign,
18015                                                        offset,
18016                                                        PreIndex));
18017                                       break;
18018                                     }
18019                                     default:
18020                                       UnallocatedT32(instr);
18021                                       break;
18022                                   }
18023                                   break;
18024                                 }
18025                                 case 0x00800000: {
18026                                   // 0xf9b00000
18027                                   if (((instr & 0xf0000) == 0xf0000) ||
18028                                       ((instr & 0xf000) == 0xf000)) {
18029                                     UnallocatedT32(instr);
18030                                     return;
18031                                   }
18032                                   unsigned rt = (instr >> 12) & 0xf;
18033                                   unsigned rn = (instr >> 16) & 0xf;
18034                                   int32_t offset = instr & 0xfff;
18035                                   // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
18036                                   ldrsh(CurrentCond(),
18037                                         Best,
18038                                         Register(rt),
18039                                         MemOperand(Register(rn),
18040                                                    plus,
18041                                                    offset,
18042                                                    Offset));
18043                                   break;
18044                                 }
18045                               }
18046                               break;
18047                             }
18048                           }
18049                           break;
18050                         }
18051                       }
18052                       break;
18053                     }
18054                     default:
18055                       UnallocatedT32(instr);
18056                       break;
18057                   }
18058                   break;
18059                 }
18060               }
18061               break;
18062             }
18063             case 0x02000000: {
18064               // 0xea000000
18065               switch (instr & 0x11900000) {
18066                 case 0x00000000: {
18067                   // 0xea000000
18068                   switch (instr & 0x00600000) {
18069                     case 0x00000000: {
18070                       // 0xea000000
18071                       switch (instr & 0x000070f0) {
18072                         case 0x00000030: {
18073                           // 0xea000030
18074                           unsigned rd = (instr >> 8) & 0xf;
18075                           unsigned rn = (instr >> 16) & 0xf;
18076                           unsigned rm = instr & 0xf;
18077                           // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18078                           and_(CurrentCond(),
18079                                Best,
18080                                Register(rd),
18081                                Register(rn),
18082                                Operand(Register(rm), RRX));
18083                           if (((instr & 0xfff0f0f0) != 0xea000030)) {
18084                             UnpredictableT32(instr);
18085                           }
18086                           break;
18087                         }
18088                         default: {
18089                           if (((instr & 0x70f0) == 0x30)) {
18090                             UnallocatedT32(instr);
18091                             return;
18092                           }
18093                           unsigned rd = (instr >> 8) & 0xf;
18094                           unsigned rn = (instr >> 16) & 0xf;
18095                           unsigned rm = instr & 0xf;
18096                           ImmediateShiftOperand
18097                               shift_operand((instr >> 4) & 0x3,
18098                                             ((instr >> 6) & 0x3) |
18099                                                 ((instr >> 10) & 0x1c));
18100                           if (InITBlock() &&
18101                               (instr & 0x00100000) == 0x00000000 &&
18102                               shift_operand.GetShift().IsLSL() &&
18103                               (shift_operand.GetAmount() == 0) &&
18104                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18105                                (rm < kNumberOfT32LowRegisters))) {
18106                             // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18107                             and_(CurrentCond(),
18108                                  Wide,
18109                                  Register(rd),
18110                                  Register(rn),
18111                                  Register(rm));
18112                             if (((instr & 0xfff08000) != 0xea000000)) {
18113                               UnpredictableT32(instr);
18114                             }
18115                           } else {
18116                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
18117                             // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18118                             and_(CurrentCond(),
18119                                  Best,
18120                                  Register(rd),
18121                                  Register(rn),
18122                                  Operand(Register(rm),
18123                                          shift_operand.GetType(),
18124                                          shift_operand.GetAmount()));
18125                             if (((instr & 0xfff08000) != 0xea000000)) {
18126                               UnpredictableT32(instr);
18127                             }
18128                           }
18129                           break;
18130                         }
18131                       }
18132                       break;
18133                     }
18134                     case 0x00200000: {
18135                       // 0xea200000
18136                       switch (instr & 0x000070f0) {
18137                         case 0x00000030: {
18138                           // 0xea200030
18139                           unsigned rd = (instr >> 8) & 0xf;
18140                           unsigned rn = (instr >> 16) & 0xf;
18141                           unsigned rm = instr & 0xf;
18142                           // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18143                           bic(CurrentCond(),
18144                               Best,
18145                               Register(rd),
18146                               Register(rn),
18147                               Operand(Register(rm), RRX));
18148                           if (((instr & 0xfff0f0f0) != 0xea200030)) {
18149                             UnpredictableT32(instr);
18150                           }
18151                           break;
18152                         }
18153                         default: {
18154                           if (((instr & 0x70f0) == 0x30)) {
18155                             UnallocatedT32(instr);
18156                             return;
18157                           }
18158                           unsigned rd = (instr >> 8) & 0xf;
18159                           unsigned rn = (instr >> 16) & 0xf;
18160                           unsigned rm = instr & 0xf;
18161                           ImmediateShiftOperand
18162                               shift_operand((instr >> 4) & 0x3,
18163                                             ((instr >> 6) & 0x3) |
18164                                                 ((instr >> 10) & 0x1c));
18165                           if (InITBlock() &&
18166                               (instr & 0x00100000) == 0x00000000 &&
18167                               shift_operand.GetShift().IsLSL() &&
18168                               (shift_operand.GetAmount() == 0) &&
18169                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18170                                (rm < kNumberOfT32LowRegisters))) {
18171                             // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18172                             bic(CurrentCond(),
18173                                 Wide,
18174                                 Register(rd),
18175                                 Register(rn),
18176                                 Register(rm));
18177                             if (((instr & 0xfff08000) != 0xea200000)) {
18178                               UnpredictableT32(instr);
18179                             }
18180                           } else {
18181                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
18182                             // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18183                             bic(CurrentCond(),
18184                                 Best,
18185                                 Register(rd),
18186                                 Register(rn),
18187                                 Operand(Register(rm),
18188                                         shift_operand.GetType(),
18189                                         shift_operand.GetAmount()));
18190                             if (((instr & 0xfff08000) != 0xea200000)) {
18191                               UnpredictableT32(instr);
18192                             }
18193                           }
18194                           break;
18195                         }
18196                       }
18197                       break;
18198                     }
18199                     case 0x00400000: {
18200                       // 0xea400000
18201                       switch (instr & 0x000f0000) {
18202                         case 0x000f0000: {
18203                           // 0xea4f0000
18204                           switch (instr & 0x000070f0) {
18205                             case 0x00000030: {
18206                               // 0xea4f0030
18207                               unsigned rd = (instr >> 8) & 0xf;
18208                               unsigned rm = instr & 0xf;
18209                               // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
18210                               rrx(CurrentCond(), Register(rd), Register(rm));
18211                               if (((instr & 0xfffff0f0) != 0xea4f0030)) {
18212                                 UnpredictableT32(instr);
18213                               }
18214                               break;
18215                             }
18216                             default: {
18217                               if (((instr & 0x70f0) == 0x30)) {
18218                                 UnallocatedT32(instr);
18219                                 return;
18220                               }
18221                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18222                                    Uint32(0x2))) {
18223                                 unsigned rd = (instr >> 8) & 0xf;
18224                                 unsigned rm = instr & 0xf;
18225                                 uint32_t amount = ((instr >> 6) & 0x3) |
18226                                                   ((instr >> 10) & 0x1c);
18227                                 if (amount == 0) amount = 32;
18228                                 if (InITBlock() &&
18229                                     ((rd < kNumberOfT32LowRegisters) &&
18230                                      (rm < kNumberOfT32LowRegisters) &&
18231                                      ((amount >= 1) && (amount <= 32)))) {
18232                                   // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18233                                   asr(CurrentCond(),
18234                                       Wide,
18235                                       Register(rd),
18236                                       Register(rm),
18237                                       amount);
18238                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
18239                                     UnpredictableT32(instr);
18240                                   }
18241                                 } else {
18242                                   // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18243                                   asr(CurrentCond(),
18244                                       Best,
18245                                       Register(rd),
18246                                       Register(rm),
18247                                       amount);
18248                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
18249                                     UnpredictableT32(instr);
18250                                   }
18251                                 }
18252                                 return;
18253                               }
18254                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18255                                    Uint32(0x0)) &&
18256                                   ((instr & 0x000070c0) != 0x00000000)) {
18257                                 unsigned rd = (instr >> 8) & 0xf;
18258                                 unsigned rm = instr & 0xf;
18259                                 uint32_t amount = ((instr >> 6) & 0x3) |
18260                                                   ((instr >> 10) & 0x1c);
18261                                 if (InITBlock() &&
18262                                     ((rd < kNumberOfT32LowRegisters) &&
18263                                      (rm < kNumberOfT32LowRegisters) &&
18264                                      ((amount >= 1) && (amount <= 31)))) {
18265                                   // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18266                                   lsl(CurrentCond(),
18267                                       Wide,
18268                                       Register(rd),
18269                                       Register(rm),
18270                                       amount);
18271                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
18272                                     UnpredictableT32(instr);
18273                                   }
18274                                 } else {
18275                                   // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18276                                   lsl(CurrentCond(),
18277                                       Best,
18278                                       Register(rd),
18279                                       Register(rm),
18280                                       amount);
18281                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
18282                                     UnpredictableT32(instr);
18283                                   }
18284                                 }
18285                                 return;
18286                               }
18287                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18288                                    Uint32(0x1))) {
18289                                 unsigned rd = (instr >> 8) & 0xf;
18290                                 unsigned rm = instr & 0xf;
18291                                 uint32_t amount = ((instr >> 6) & 0x3) |
18292                                                   ((instr >> 10) & 0x1c);
18293                                 if (amount == 0) amount = 32;
18294                                 if (InITBlock() &&
18295                                     ((rd < kNumberOfT32LowRegisters) &&
18296                                      (rm < kNumberOfT32LowRegisters) &&
18297                                      ((amount >= 1) && (amount <= 32)))) {
18298                                   // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
18299                                   lsr(CurrentCond(),
18300                                       Wide,
18301                                       Register(rd),
18302                                       Register(rm),
18303                                       amount);
18304                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
18305                                     UnpredictableT32(instr);
18306                                   }
18307                                 } else {
18308                                   // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18309                                   lsr(CurrentCond(),
18310                                       Best,
18311                                       Register(rd),
18312                                       Register(rm),
18313                                       amount);
18314                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
18315                                     UnpredictableT32(instr);
18316                                   }
18317                                 }
18318                                 return;
18319                               }
18320                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18321                                    Uint32(0x3)) &&
18322                                   ((instr & 0x000070c0) != 0x00000000)) {
18323                                 unsigned rd = (instr >> 8) & 0xf;
18324                                 unsigned rm = instr & 0xf;
18325                                 uint32_t amount = ((instr >> 6) & 0x3) |
18326                                                   ((instr >> 10) & 0x1c);
18327                                 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18328                                 ror(CurrentCond(),
18329                                     Best,
18330                                     Register(rd),
18331                                     Register(rm),
18332                                     amount);
18333                                 if (((instr & 0xffff8030) != 0xea4f0030)) {
18334                                   UnpredictableT32(instr);
18335                                 }
18336                                 return;
18337                               }
18338                               unsigned rd = (instr >> 8) & 0xf;
18339                               unsigned rm = instr & 0xf;
18340                               ImmediateShiftOperand
18341                                   shift_operand((instr >> 4) & 0x3,
18342                                                 ((instr >> 6) & 0x3) |
18343                                                     ((instr >> 10) & 0x1c));
18344                               if ((instr & 0x00100000) == 0x00000000 &&
18345                                   (shift_operand.GetShift().IsLSL() &&
18346                                    (shift_operand.GetAmount() == 0))) {
18347                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18348                                 mov(CurrentCond(),
18349                                     Wide,
18350                                     Register(rd),
18351                                     Operand(Register(rm),
18352                                             shift_operand.GetType(),
18353                                             shift_operand.GetAmount()));
18354                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
18355                                   UnpredictableT32(instr);
18356                                 }
18357                               } else if (InITBlock() &&
18358                                          (instr & 0x00100000) == 0x00000000 &&
18359                                          ((rd < kNumberOfT32LowRegisters) &&
18360                                           (rm < kNumberOfT32LowRegisters))) {
18361                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18362                                 mov(CurrentCond(),
18363                                     Wide,
18364                                     Register(rd),
18365                                     Operand(Register(rm),
18366                                             shift_operand.GetType(),
18367                                             shift_operand.GetAmount()));
18368                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
18369                                   UnpredictableT32(instr);
18370                                 }
18371                               } else {
18372                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
18373                                 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18374                                 mov(CurrentCond(),
18375                                     Best,
18376                                     Register(rd),
18377                                     Operand(Register(rm),
18378                                             shift_operand.GetType(),
18379                                             shift_operand.GetAmount()));
18380                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
18381                                   UnpredictableT32(instr);
18382                                 }
18383                               }
18384                               break;
18385                             }
18386                           }
18387                           break;
18388                         }
18389                         default: {
18390                           switch (instr & 0x000070f0) {
18391                             case 0x00000030: {
18392                               // 0xea400030
18393                               if (((instr & 0xf0000) == 0xf0000)) {
18394                                 UnallocatedT32(instr);
18395                                 return;
18396                               }
18397                               unsigned rd = (instr >> 8) & 0xf;
18398                               unsigned rn = (instr >> 16) & 0xf;
18399                               unsigned rm = instr & 0xf;
18400                               // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18401                               orr(CurrentCond(),
18402                                   Best,
18403                                   Register(rd),
18404                                   Register(rn),
18405                                   Operand(Register(rm), RRX));
18406                               if (((instr & 0xfff0f0f0) != 0xea400030)) {
18407                                 UnpredictableT32(instr);
18408                               }
18409                               break;
18410                             }
18411                             default: {
18412                               if (((instr & 0xf0000) == 0xf0000) ||
18413                                   ((instr & 0x70f0) == 0x30)) {
18414                                 UnallocatedT32(instr);
18415                                 return;
18416                               }
18417                               unsigned rd = (instr >> 8) & 0xf;
18418                               unsigned rn = (instr >> 16) & 0xf;
18419                               unsigned rm = instr & 0xf;
18420                               ImmediateShiftOperand
18421                                   shift_operand((instr >> 4) & 0x3,
18422                                                 ((instr >> 6) & 0x3) |
18423                                                     ((instr >> 10) & 0x1c));
18424                               if (InITBlock() &&
18425                                   (instr & 0x00100000) == 0x00000000 &&
18426                                   shift_operand.GetShift().IsLSL() &&
18427                                   (shift_operand.GetAmount() == 0) &&
18428                                   ((rd == rn) &&
18429                                    (rd < kNumberOfT32LowRegisters) &&
18430                                    (rm < kNumberOfT32LowRegisters))) {
18431                                 // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
18432                                 orr(CurrentCond(),
18433                                     Wide,
18434                                     Register(rd),
18435                                     Register(rn),
18436                                     Register(rm));
18437                                 if (((instr & 0xfff08000) != 0xea400000)) {
18438                                   UnpredictableT32(instr);
18439                                 }
18440                               } else {
18441                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
18442                                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18443                                 orr(CurrentCond(),
18444                                     Best,
18445                                     Register(rd),
18446                                     Register(rn),
18447                                     Operand(Register(rm),
18448                                             shift_operand.GetType(),
18449                                             shift_operand.GetAmount()));
18450                                 if (((instr & 0xfff08000) != 0xea400000)) {
18451                                   UnpredictableT32(instr);
18452                                 }
18453                               }
18454                               break;
18455                             }
18456                           }
18457                           break;
18458                         }
18459                       }
18460                       break;
18461                     }
18462                     case 0x00600000: {
18463                       // 0xea600000
18464                       switch (instr & 0x000f0000) {
18465                         case 0x000f0000: {
18466                           // 0xea6f0000
18467                           switch (instr & 0x000070f0) {
18468                             case 0x00000030: {
18469                               // 0xea6f0030
18470                               unsigned rd = (instr >> 8) & 0xf;
18471                               unsigned rm = instr & 0xf;
18472                               // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
18473                               mvn(CurrentCond(),
18474                                   Best,
18475                                   Register(rd),
18476                                   Operand(Register(rm), RRX));
18477                               if (((instr & 0xfffff0f0) != 0xea6f0030)) {
18478                                 UnpredictableT32(instr);
18479                               }
18480                               break;
18481                             }
18482                             default: {
18483                               if (((instr & 0x70f0) == 0x30)) {
18484                                 UnallocatedT32(instr);
18485                                 return;
18486                               }
18487                               unsigned rd = (instr >> 8) & 0xf;
18488                               unsigned rm = instr & 0xf;
18489                               ImmediateShiftOperand
18490                                   shift_operand((instr >> 4) & 0x3,
18491                                                 ((instr >> 6) & 0x3) |
18492                                                     ((instr >> 10) & 0x1c));
18493                               if (InITBlock() &&
18494                                   (instr & 0x00100000) == 0x00000000 &&
18495                                   shift_operand.GetShift().IsLSL() &&
18496                                   (shift_operand.GetAmount() == 0) &&
18497                                   ((rd < kNumberOfT32LowRegisters) &&
18498                                    (rm < kNumberOfT32LowRegisters))) {
18499                                 // MVN<c>.W <Rd>, <Rm> ; T2
18500                                 mvn(CurrentCond(),
18501                                     Wide,
18502                                     Register(rd),
18503                                     Register(rm));
18504                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
18505                                   UnpredictableT32(instr);
18506                                 }
18507                               } else {
18508                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
18509                                 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18510                                 mvn(CurrentCond(),
18511                                     Best,
18512                                     Register(rd),
18513                                     Operand(Register(rm),
18514                                             shift_operand.GetType(),
18515                                             shift_operand.GetAmount()));
18516                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
18517                                   UnpredictableT32(instr);
18518                                 }
18519                               }
18520                               break;
18521                             }
18522                           }
18523                           break;
18524                         }
18525                         default: {
18526                           switch (instr & 0x000070f0) {
18527                             case 0x00000030: {
18528                               // 0xea600030
18529                               if (((instr & 0xf0000) == 0xf0000)) {
18530                                 UnallocatedT32(instr);
18531                                 return;
18532                               }
18533                               unsigned rd = (instr >> 8) & 0xf;
18534                               unsigned rn = (instr >> 16) & 0xf;
18535                               unsigned rm = instr & 0xf;
18536                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
18537                               orn(CurrentCond(),
18538                                   Register(rd),
18539                                   Register(rn),
18540                                   Operand(Register(rm), RRX));
18541                               if (((instr & 0xfff0f0f0) != 0xea600030)) {
18542                                 UnpredictableT32(instr);
18543                               }
18544                               break;
18545                             }
18546                             default: {
18547                               if (((instr & 0xf0000) == 0xf0000) ||
18548                                   ((instr & 0x70f0) == 0x30)) {
18549                                 UnallocatedT32(instr);
18550                                 return;
18551                               }
18552                               unsigned rd = (instr >> 8) & 0xf;
18553                               unsigned rn = (instr >> 16) & 0xf;
18554                               unsigned rm = instr & 0xf;
18555                               ImmediateShiftOperand
18556                                   shift_operand((instr >> 4) & 0x3,
18557                                                 ((instr >> 6) & 0x3) |
18558                                                     ((instr >> 10) & 0x1c));
18559                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
18560                               orn(CurrentCond(),
18561                                   Register(rd),
18562                                   Register(rn),
18563                                   Operand(Register(rm),
18564                                           shift_operand.GetType(),
18565                                           shift_operand.GetAmount()));
18566                               if (((instr & 0xfff08000) != 0xea600000)) {
18567                                 UnpredictableT32(instr);
18568                               }
18569                               break;
18570                             }
18571                           }
18572                           break;
18573                         }
18574                       }
18575                       break;
18576                     }
18577                   }
18578                   break;
18579                 }
18580                 case 0x00100000: {
18581                   // 0xea100000
18582                   switch (instr & 0x00600000) {
18583                     case 0x00000000: {
18584                       // 0xea100000
18585                       switch (instr & 0x00000f00) {
18586                         case 0x00000f00: {
18587                           // 0xea100f00
18588                           switch (instr & 0x000070f0) {
18589                             case 0x00000030: {
18590                               // 0xea100f30
18591                               unsigned rn = (instr >> 16) & 0xf;
18592                               unsigned rm = instr & 0xf;
18593                               // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
18594                               tst(CurrentCond(),
18595                                   Best,
18596                                   Register(rn),
18597                                   Operand(Register(rm), RRX));
18598                               if (((instr & 0xfff0fff0) != 0xea100f30)) {
18599                                 UnpredictableT32(instr);
18600                               }
18601                               break;
18602                             }
18603                             default: {
18604                               if (((instr & 0x70f0) == 0x30)) {
18605                                 UnallocatedT32(instr);
18606                                 return;
18607                               }
18608                               unsigned rn = (instr >> 16) & 0xf;
18609                               unsigned rm = instr & 0xf;
18610                               ImmediateShiftOperand
18611                                   shift_operand((instr >> 4) & 0x3,
18612                                                 ((instr >> 6) & 0x3) |
18613                                                     ((instr >> 10) & 0x1c));
18614                               if (shift_operand.GetShift().IsLSL() &&
18615                                   (shift_operand.GetAmount() == 0) &&
18616                                   ((rn < kNumberOfT32LowRegisters) &&
18617                                    (rm < kNumberOfT32LowRegisters))) {
18618                                 // TST{<c>}.W <Rn>, <Rm> ; T2
18619                                 tst(CurrentCond(),
18620                                     Wide,
18621                                     Register(rn),
18622                                     Register(rm));
18623                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
18624                                   UnpredictableT32(instr);
18625                                 }
18626                               } else {
18627                                 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18628                                 tst(CurrentCond(),
18629                                     Best,
18630                                     Register(rn),
18631                                     Operand(Register(rm),
18632                                             shift_operand.GetType(),
18633                                             shift_operand.GetAmount()));
18634                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
18635                                   UnpredictableT32(instr);
18636                                 }
18637                               }
18638                               break;
18639                             }
18640                           }
18641                           break;
18642                         }
18643                         default: {
18644                           switch (instr & 0x000070f0) {
18645                             case 0x00000030: {
18646                               // 0xea100030
18647                               if (((instr & 0xf00) == 0xf00)) {
18648                                 UnallocatedT32(instr);
18649                                 return;
18650                               }
18651                               unsigned rd = (instr >> 8) & 0xf;
18652                               unsigned rn = (instr >> 16) & 0xf;
18653                               unsigned rm = instr & 0xf;
18654                               // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18655                               ands(CurrentCond(),
18656                                    Best,
18657                                    Register(rd),
18658                                    Register(rn),
18659                                    Operand(Register(rm), RRX));
18660                               if (((instr & 0xfff0f0f0) != 0xea100030)) {
18661                                 UnpredictableT32(instr);
18662                               }
18663                               break;
18664                             }
18665                             default: {
18666                               if (((instr & 0x70f0) == 0x30) ||
18667                                   ((instr & 0xf00) == 0xf00)) {
18668                                 UnallocatedT32(instr);
18669                                 return;
18670                               }
18671                               unsigned rd = (instr >> 8) & 0xf;
18672                               unsigned rn = (instr >> 16) & 0xf;
18673                               unsigned rm = instr & 0xf;
18674                               ImmediateShiftOperand
18675                                   shift_operand((instr >> 4) & 0x3,
18676                                                 ((instr >> 6) & 0x3) |
18677                                                     ((instr >> 10) & 0x1c));
18678                               if (OutsideITBlock() &&
18679                                   (instr & 0x00100000) == 0x00100000 &&
18680                                   shift_operand.GetShift().IsLSL() &&
18681                                   (shift_operand.GetAmount() == 0) &&
18682                                   ((rd == rn) &&
18683                                    (rd < kNumberOfT32LowRegisters) &&
18684                                    (rm < kNumberOfT32LowRegisters))) {
18685                                 // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
18686                                 ands(Condition::None(),
18687                                      Wide,
18688                                      Register(rd),
18689                                      Register(rn),
18690                                      Register(rm));
18691                                 if (((instr & 0xfff08000) != 0xea100000)) {
18692                                   UnpredictableT32(instr);
18693                                 }
18694                               } else {
18695                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
18696                                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18697                                 ands(CurrentCond(),
18698                                      Best,
18699                                      Register(rd),
18700                                      Register(rn),
18701                                      Operand(Register(rm),
18702                                              shift_operand.GetType(),
18703                                              shift_operand.GetAmount()));
18704                                 if (((instr & 0xfff08000) != 0xea100000)) {
18705                                   UnpredictableT32(instr);
18706                                 }
18707                               }
18708                               break;
18709                             }
18710                           }
18711                           break;
18712                         }
18713                       }
18714                       break;
18715                     }
18716                     case 0x00200000: {
18717                       // 0xea300000
18718                       switch (instr & 0x000070f0) {
18719                         case 0x00000030: {
18720                           // 0xea300030
18721                           unsigned rd = (instr >> 8) & 0xf;
18722                           unsigned rn = (instr >> 16) & 0xf;
18723                           unsigned rm = instr & 0xf;
18724                           // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18725                           bics(CurrentCond(),
18726                                Best,
18727                                Register(rd),
18728                                Register(rn),
18729                                Operand(Register(rm), RRX));
18730                           if (((instr & 0xfff0f0f0) != 0xea300030)) {
18731                             UnpredictableT32(instr);
18732                           }
18733                           break;
18734                         }
18735                         default: {
18736                           if (((instr & 0x70f0) == 0x30)) {
18737                             UnallocatedT32(instr);
18738                             return;
18739                           }
18740                           unsigned rd = (instr >> 8) & 0xf;
18741                           unsigned rn = (instr >> 16) & 0xf;
18742                           unsigned rm = instr & 0xf;
18743                           ImmediateShiftOperand
18744                               shift_operand((instr >> 4) & 0x3,
18745                                             ((instr >> 6) & 0x3) |
18746                                                 ((instr >> 10) & 0x1c));
18747                           if (OutsideITBlock() &&
18748                               (instr & 0x00100000) == 0x00100000 &&
18749                               shift_operand.GetShift().IsLSL() &&
18750                               (shift_operand.GetAmount() == 0) &&
18751                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
18752                                (rm < kNumberOfT32LowRegisters))) {
18753                             // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
18754                             bics(Condition::None(),
18755                                  Wide,
18756                                  Register(rd),
18757                                  Register(rn),
18758                                  Register(rm));
18759                             if (((instr & 0xfff08000) != 0xea300000)) {
18760                               UnpredictableT32(instr);
18761                             }
18762                           } else {
18763                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
18764                             // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
18765                             bics(CurrentCond(),
18766                                  Best,
18767                                  Register(rd),
18768                                  Register(rn),
18769                                  Operand(Register(rm),
18770                                          shift_operand.GetType(),
18771                                          shift_operand.GetAmount()));
18772                             if (((instr & 0xfff08000) != 0xea300000)) {
18773                               UnpredictableT32(instr);
18774                             }
18775                           }
18776                           break;
18777                         }
18778                       }
18779                       break;
18780                     }
18781                     case 0x00400000: {
18782                       // 0xea500000
18783                       switch (instr & 0x000f0000) {
18784                         case 0x000f0000: {
18785                           // 0xea5f0000
18786                           switch (instr & 0x000070f0) {
18787                             case 0x00000030: {
18788                               // 0xea5f0030
18789                               unsigned rd = (instr >> 8) & 0xf;
18790                               unsigned rm = instr & 0xf;
18791                               // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
18792                               rrxs(CurrentCond(), Register(rd), Register(rm));
18793                               if (((instr & 0xfffff0f0) != 0xea5f0030)) {
18794                                 UnpredictableT32(instr);
18795                               }
18796                               break;
18797                             }
18798                             default: {
18799                               if (((instr & 0x70f0) == 0x30)) {
18800                                 UnallocatedT32(instr);
18801                                 return;
18802                               }
18803                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18804                                    Uint32(0x2))) {
18805                                 unsigned rd = (instr >> 8) & 0xf;
18806                                 unsigned rm = instr & 0xf;
18807                                 uint32_t amount = ((instr >> 6) & 0x3) |
18808                                                   ((instr >> 10) & 0x1c);
18809                                 if (amount == 0) amount = 32;
18810                                 if (OutsideITBlock() &&
18811                                     ((rd < kNumberOfT32LowRegisters) &&
18812                                      (rm < kNumberOfT32LowRegisters) &&
18813                                      ((amount >= 1) && (amount <= 32)))) {
18814                                   // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
18815                                   asrs(Condition::None(),
18816                                        Wide,
18817                                        Register(rd),
18818                                        Register(rm),
18819                                        amount);
18820                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
18821                                     UnpredictableT32(instr);
18822                                   }
18823                                 } else {
18824                                   // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18825                                   asrs(CurrentCond(),
18826                                        Best,
18827                                        Register(rd),
18828                                        Register(rm),
18829                                        amount);
18830                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
18831                                     UnpredictableT32(instr);
18832                                   }
18833                                 }
18834                                 return;
18835                               }
18836                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18837                                    Uint32(0x0)) &&
18838                                   ((instr & 0x000070c0) != 0x00000000)) {
18839                                 unsigned rd = (instr >> 8) & 0xf;
18840                                 unsigned rm = instr & 0xf;
18841                                 uint32_t amount = ((instr >> 6) & 0x3) |
18842                                                   ((instr >> 10) & 0x1c);
18843                                 if (OutsideITBlock() &&
18844                                     ((rd < kNumberOfT32LowRegisters) &&
18845                                      (rm < kNumberOfT32LowRegisters) &&
18846                                      ((amount >= 1) && (amount <= 31)))) {
18847                                   // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
18848                                   lsls(Condition::None(),
18849                                        Wide,
18850                                        Register(rd),
18851                                        Register(rm),
18852                                        amount);
18853                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
18854                                     UnpredictableT32(instr);
18855                                   }
18856                                 } else {
18857                                   // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18858                                   lsls(CurrentCond(),
18859                                        Best,
18860                                        Register(rd),
18861                                        Register(rm),
18862                                        amount);
18863                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
18864                                     UnpredictableT32(instr);
18865                                   }
18866                                 }
18867                                 return;
18868                               }
18869                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18870                                    Uint32(0x1))) {
18871                                 unsigned rd = (instr >> 8) & 0xf;
18872                                 unsigned rm = instr & 0xf;
18873                                 uint32_t amount = ((instr >> 6) & 0x3) |
18874                                                   ((instr >> 10) & 0x1c);
18875                                 if (amount == 0) amount = 32;
18876                                 if (OutsideITBlock() &&
18877                                     ((rd < kNumberOfT32LowRegisters) &&
18878                                      (rm < kNumberOfT32LowRegisters) &&
18879                                      ((amount >= 1) && (amount <= 32)))) {
18880                                   // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
18881                                   lsrs(Condition::None(),
18882                                        Wide,
18883                                        Register(rd),
18884                                        Register(rm),
18885                                        amount);
18886                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
18887                                     UnpredictableT32(instr);
18888                                   }
18889                                 } else {
18890                                   // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18891                                   lsrs(CurrentCond(),
18892                                        Best,
18893                                        Register(rd),
18894                                        Register(rm),
18895                                        amount);
18896                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
18897                                     UnpredictableT32(instr);
18898                                   }
18899                                 }
18900                                 return;
18901                               }
18902                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
18903                                    Uint32(0x3)) &&
18904                                   ((instr & 0x000070c0) != 0x00000000)) {
18905                                 unsigned rd = (instr >> 8) & 0xf;
18906                                 unsigned rm = instr & 0xf;
18907                                 uint32_t amount = ((instr >> 6) & 0x3) |
18908                                                   ((instr >> 10) & 0x1c);
18909                                 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
18910                                 rors(CurrentCond(),
18911                                      Best,
18912                                      Register(rd),
18913                                      Register(rm),
18914                                      amount);
18915                                 if (((instr & 0xffff8030) != 0xea5f0030)) {
18916                                   UnpredictableT32(instr);
18917                                 }
18918                                 return;
18919                               }
18920                               unsigned rd = (instr >> 8) & 0xf;
18921                               unsigned rm = instr & 0xf;
18922                               ImmediateShiftOperand
18923                                   shift_operand((instr >> 4) & 0x3,
18924                                                 ((instr >> 6) & 0x3) |
18925                                                     ((instr >> 10) & 0x1c));
18926                               if (OutsideITBlock() &&
18927                                   (instr & 0x00100000) == 0x00100000 &&
18928                                   ((rd < kNumberOfT32LowRegisters) &&
18929                                    (rm < kNumberOfT32LowRegisters))) {
18930                                 // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
18931                                 movs(Condition::None(),
18932                                      Wide,
18933                                      Register(rd),
18934                                      Operand(Register(rm),
18935                                              shift_operand.GetType(),
18936                                              shift_operand.GetAmount()));
18937                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
18938                                   UnpredictableT32(instr);
18939                                 }
18940                               } else {
18941                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
18942                                 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
18943                                 movs(CurrentCond(),
18944                                      Best,
18945                                      Register(rd),
18946                                      Operand(Register(rm),
18947                                              shift_operand.GetType(),
18948                                              shift_operand.GetAmount()));
18949                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
18950                                   UnpredictableT32(instr);
18951                                 }
18952                               }
18953                               break;
18954                             }
18955                           }
18956                           break;
18957                         }
18958                         default: {
18959                           switch (instr & 0x000070f0) {
18960                             case 0x00000030: {
18961                               // 0xea500030
18962                               if (((instr & 0xf0000) == 0xf0000)) {
18963                                 UnallocatedT32(instr);
18964                                 return;
18965                               }
18966                               unsigned rd = (instr >> 8) & 0xf;
18967                               unsigned rn = (instr >> 16) & 0xf;
18968                               unsigned rm = instr & 0xf;
18969                               // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
18970                               orrs(CurrentCond(),
18971                                    Best,
18972                                    Register(rd),
18973                                    Register(rn),
18974                                    Operand(Register(rm), RRX));
18975                               if (((instr & 0xfff0f0f0) != 0xea500030)) {
18976                                 UnpredictableT32(instr);
18977                               }
18978                               break;
18979                             }
18980                             default: {
18981                               if (((instr & 0xf0000) == 0xf0000) ||
18982                                   ((instr & 0x70f0) == 0x30)) {
18983                                 UnallocatedT32(instr);
18984                                 return;
18985                               }
18986                               unsigned rd = (instr >> 8) & 0xf;
18987                               unsigned rn = (instr >> 16) & 0xf;
18988                               unsigned rm = instr & 0xf;
18989                               ImmediateShiftOperand
18990                                   shift_operand((instr >> 4) & 0x3,
18991                                                 ((instr >> 6) & 0x3) |
18992                                                     ((instr >> 10) & 0x1c));
18993                               if (OutsideITBlock() &&
18994                                   (instr & 0x00100000) == 0x00100000 &&
18995                                   shift_operand.GetShift().IsLSL() &&
18996                                   (shift_operand.GetAmount() == 0) &&
18997                                   ((rd == rn) &&
18998                                    (rd < kNumberOfT32LowRegisters) &&
18999                                    (rm < kNumberOfT32LowRegisters))) {
19000                                 // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
19001                                 orrs(Condition::None(),
19002                                      Wide,
19003                                      Register(rd),
19004                                      Register(rn),
19005                                      Register(rm));
19006                                 if (((instr & 0xfff08000) != 0xea500000)) {
19007                                   UnpredictableT32(instr);
19008                                 }
19009                               } else {
19010                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
19011                                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19012                                 orrs(CurrentCond(),
19013                                      Best,
19014                                      Register(rd),
19015                                      Register(rn),
19016                                      Operand(Register(rm),
19017                                              shift_operand.GetType(),
19018                                              shift_operand.GetAmount()));
19019                                 if (((instr & 0xfff08000) != 0xea500000)) {
19020                                   UnpredictableT32(instr);
19021                                 }
19022                               }
19023                               break;
19024                             }
19025                           }
19026                           break;
19027                         }
19028                       }
19029                       break;
19030                     }
19031                     case 0x00600000: {
19032                       // 0xea700000
19033                       switch (instr & 0x000f0000) {
19034                         case 0x000f0000: {
19035                           // 0xea7f0000
19036                           switch (instr & 0x000070f0) {
19037                             case 0x00000030: {
19038                               // 0xea7f0030
19039                               unsigned rd = (instr >> 8) & 0xf;
19040                               unsigned rm = instr & 0xf;
19041                               // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
19042                               mvns(CurrentCond(),
19043                                    Best,
19044                                    Register(rd),
19045                                    Operand(Register(rm), RRX));
19046                               if (((instr & 0xfffff0f0) != 0xea7f0030)) {
19047                                 UnpredictableT32(instr);
19048                               }
19049                               break;
19050                             }
19051                             default: {
19052                               if (((instr & 0x70f0) == 0x30)) {
19053                                 UnallocatedT32(instr);
19054                                 return;
19055                               }
19056                               unsigned rd = (instr >> 8) & 0xf;
19057                               unsigned rm = instr & 0xf;
19058                               ImmediateShiftOperand
19059                                   shift_operand((instr >> 4) & 0x3,
19060                                                 ((instr >> 6) & 0x3) |
19061                                                     ((instr >> 10) & 0x1c));
19062                               if (OutsideITBlock() &&
19063                                   (instr & 0x00100000) == 0x00100000 &&
19064                                   shift_operand.GetShift().IsLSL() &&
19065                                   (shift_operand.GetAmount() == 0) &&
19066                                   ((rd < kNumberOfT32LowRegisters) &&
19067                                    (rm < kNumberOfT32LowRegisters))) {
19068                                 // MVNS.W <Rd>, <Rm> ; T2
19069                                 mvns(Condition::None(),
19070                                      Wide,
19071                                      Register(rd),
19072                                      Register(rm));
19073                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
19074                                   UnpredictableT32(instr);
19075                                 }
19076                               } else {
19077                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
19078                                 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19079                                 mvns(CurrentCond(),
19080                                      Best,
19081                                      Register(rd),
19082                                      Operand(Register(rm),
19083                                              shift_operand.GetType(),
19084                                              shift_operand.GetAmount()));
19085                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
19086                                   UnpredictableT32(instr);
19087                                 }
19088                               }
19089                               break;
19090                             }
19091                           }
19092                           break;
19093                         }
19094                         default: {
19095                           switch (instr & 0x000070f0) {
19096                             case 0x00000030: {
19097                               // 0xea700030
19098                               if (((instr & 0xf0000) == 0xf0000)) {
19099                                 UnallocatedT32(instr);
19100                                 return;
19101                               }
19102                               unsigned rd = (instr >> 8) & 0xf;
19103                               unsigned rn = (instr >> 16) & 0xf;
19104                               unsigned rm = instr & 0xf;
19105                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
19106                               orns(CurrentCond(),
19107                                    Register(rd),
19108                                    Register(rn),
19109                                    Operand(Register(rm), RRX));
19110                               if (((instr & 0xfff0f0f0) != 0xea700030)) {
19111                                 UnpredictableT32(instr);
19112                               }
19113                               break;
19114                             }
19115                             default: {
19116                               if (((instr & 0xf0000) == 0xf0000) ||
19117                                   ((instr & 0x70f0) == 0x30)) {
19118                                 UnallocatedT32(instr);
19119                                 return;
19120                               }
19121                               unsigned rd = (instr >> 8) & 0xf;
19122                               unsigned rn = (instr >> 16) & 0xf;
19123                               unsigned rm = instr & 0xf;
19124                               ImmediateShiftOperand
19125                                   shift_operand((instr >> 4) & 0x3,
19126                                                 ((instr >> 6) & 0x3) |
19127                                                     ((instr >> 10) & 0x1c));
19128                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19129                               orns(CurrentCond(),
19130                                    Register(rd),
19131                                    Register(rn),
19132                                    Operand(Register(rm),
19133                                            shift_operand.GetType(),
19134                                            shift_operand.GetAmount()));
19135                               if (((instr & 0xfff08000) != 0xea700000)) {
19136                                 UnpredictableT32(instr);
19137                               }
19138                               break;
19139                             }
19140                           }
19141                           break;
19142                         }
19143                       }
19144                       break;
19145                     }
19146                   }
19147                   break;
19148                 }
19149                 case 0x00800000: {
19150                   // 0xea800000
19151                   switch (instr & 0x00600000) {
19152                     case 0x00000000: {
19153                       // 0xea800000
19154                       switch (instr & 0x000070f0) {
19155                         case 0x00000030: {
19156                           // 0xea800030
19157                           unsigned rd = (instr >> 8) & 0xf;
19158                           unsigned rn = (instr >> 16) & 0xf;
19159                           unsigned rm = instr & 0xf;
19160                           // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19161                           eor(CurrentCond(),
19162                               Best,
19163                               Register(rd),
19164                               Register(rn),
19165                               Operand(Register(rm), RRX));
19166                           if (((instr & 0xfff0f0f0) != 0xea800030)) {
19167                             UnpredictableT32(instr);
19168                           }
19169                           break;
19170                         }
19171                         default: {
19172                           if (((instr & 0x70f0) == 0x30)) {
19173                             UnallocatedT32(instr);
19174                             return;
19175                           }
19176                           unsigned rd = (instr >> 8) & 0xf;
19177                           unsigned rn = (instr >> 16) & 0xf;
19178                           unsigned rm = instr & 0xf;
19179                           ImmediateShiftOperand
19180                               shift_operand((instr >> 4) & 0x3,
19181                                             ((instr >> 6) & 0x3) |
19182                                                 ((instr >> 10) & 0x1c));
19183                           if (InITBlock() &&
19184                               (instr & 0x00100000) == 0x00000000 &&
19185                               shift_operand.GetShift().IsLSL() &&
19186                               (shift_operand.GetAmount() == 0) &&
19187                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19188                                (rm < kNumberOfT32LowRegisters))) {
19189                             // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19190                             eor(CurrentCond(),
19191                                 Wide,
19192                                 Register(rd),
19193                                 Register(rn),
19194                                 Register(rm));
19195                             if (((instr & 0xfff08000) != 0xea800000)) {
19196                               UnpredictableT32(instr);
19197                             }
19198                           } else {
19199                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
19200                             // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19201                             eor(CurrentCond(),
19202                                 Best,
19203                                 Register(rd),
19204                                 Register(rn),
19205                                 Operand(Register(rm),
19206                                         shift_operand.GetType(),
19207                                         shift_operand.GetAmount()));
19208                             if (((instr & 0xfff08000) != 0xea800000)) {
19209                               UnpredictableT32(instr);
19210                             }
19211                           }
19212                           break;
19213                         }
19214                       }
19215                       break;
19216                     }
19217                     case 0x00400000: {
19218                       // 0xeac00000
19219                       switch (instr & 0x00000030) {
19220                         case 0x00000000: {
19221                           // 0xeac00000
19222                           unsigned rd = (instr >> 8) & 0xf;
19223                           unsigned rn = (instr >> 16) & 0xf;
19224                           unsigned rm = instr & 0xf;
19225                           uint32_t amount =
19226                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19227                           // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
19228                           pkhbt(CurrentCond(),
19229                                 Register(rd),
19230                                 Register(rn),
19231                                 Operand(Register(rm), LSL, amount));
19232                           if (((instr & 0xfff08030) != 0xeac00000)) {
19233                             UnpredictableT32(instr);
19234                           }
19235                           break;
19236                         }
19237                         case 0x00000020: {
19238                           // 0xeac00020
19239                           unsigned rd = (instr >> 8) & 0xf;
19240                           unsigned rn = (instr >> 16) & 0xf;
19241                           unsigned rm = instr & 0xf;
19242                           uint32_t amount =
19243                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
19244                           if (amount == 0) amount = 32;
19245                           // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
19246                           pkhtb(CurrentCond(),
19247                                 Register(rd),
19248                                 Register(rn),
19249                                 Operand(Register(rm), ASR, amount));
19250                           if (((instr & 0xfff08030) != 0xeac00020)) {
19251                             UnpredictableT32(instr);
19252                           }
19253                           break;
19254                         }
19255                         default:
19256                           UnallocatedT32(instr);
19257                           break;
19258                       }
19259                       break;
19260                     }
19261                     default:
19262                       UnallocatedT32(instr);
19263                       break;
19264                   }
19265                   break;
19266                 }
19267                 case 0x00900000: {
19268                   // 0xea900000
19269                   switch (instr & 0x00600000) {
19270                     case 0x00000000: {
19271                       // 0xea900000
19272                       switch (instr & 0x00000f00) {
19273                         case 0x00000f00: {
19274                           // 0xea900f00
19275                           switch (instr & 0x000070f0) {
19276                             case 0x00000030: {
19277                               // 0xea900f30
19278                               unsigned rn = (instr >> 16) & 0xf;
19279                               unsigned rm = instr & 0xf;
19280                               // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
19281                               teq(CurrentCond(),
19282                                   Register(rn),
19283                                   Operand(Register(rm), RRX));
19284                               if (((instr & 0xfff0fff0) != 0xea900f30)) {
19285                                 UnpredictableT32(instr);
19286                               }
19287                               break;
19288                             }
19289                             default: {
19290                               if (((instr & 0x70f0) == 0x30)) {
19291                                 UnallocatedT32(instr);
19292                                 return;
19293                               }
19294                               unsigned rn = (instr >> 16) & 0xf;
19295                               unsigned rm = instr & 0xf;
19296                               ImmediateShiftOperand
19297                                   shift_operand((instr >> 4) & 0x3,
19298                                                 ((instr >> 6) & 0x3) |
19299                                                     ((instr >> 10) & 0x1c));
19300                               // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
19301                               teq(CurrentCond(),
19302                                   Register(rn),
19303                                   Operand(Register(rm),
19304                                           shift_operand.GetType(),
19305                                           shift_operand.GetAmount()));
19306                               if (((instr & 0xfff08f00) != 0xea900f00)) {
19307                                 UnpredictableT32(instr);
19308                               }
19309                               break;
19310                             }
19311                           }
19312                           break;
19313                         }
19314                         default: {
19315                           switch (instr & 0x000070f0) {
19316                             case 0x00000030: {
19317                               // 0xea900030
19318                               if (((instr & 0xf00) == 0xf00)) {
19319                                 UnallocatedT32(instr);
19320                                 return;
19321                               }
19322                               unsigned rd = (instr >> 8) & 0xf;
19323                               unsigned rn = (instr >> 16) & 0xf;
19324                               unsigned rm = instr & 0xf;
19325                               // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19326                               eors(CurrentCond(),
19327                                    Best,
19328                                    Register(rd),
19329                                    Register(rn),
19330                                    Operand(Register(rm), RRX));
19331                               if (((instr & 0xfff0f0f0) != 0xea900030)) {
19332                                 UnpredictableT32(instr);
19333                               }
19334                               break;
19335                             }
19336                             default: {
19337                               if (((instr & 0x70f0) == 0x30) ||
19338                                   ((instr & 0xf00) == 0xf00)) {
19339                                 UnallocatedT32(instr);
19340                                 return;
19341                               }
19342                               unsigned rd = (instr >> 8) & 0xf;
19343                               unsigned rn = (instr >> 16) & 0xf;
19344                               unsigned rm = instr & 0xf;
19345                               ImmediateShiftOperand
19346                                   shift_operand((instr >> 4) & 0x3,
19347                                                 ((instr >> 6) & 0x3) |
19348                                                     ((instr >> 10) & 0x1c));
19349                               if (OutsideITBlock() &&
19350                                   (instr & 0x00100000) == 0x00100000 &&
19351                                   shift_operand.GetShift().IsLSL() &&
19352                                   (shift_operand.GetAmount() == 0) &&
19353                                   ((rd == rn) &&
19354                                    (rd < kNumberOfT32LowRegisters) &&
19355                                    (rm < kNumberOfT32LowRegisters))) {
19356                                 // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
19357                                 eors(Condition::None(),
19358                                      Wide,
19359                                      Register(rd),
19360                                      Register(rn),
19361                                      Register(rm));
19362                                 if (((instr & 0xfff08000) != 0xea900000)) {
19363                                   UnpredictableT32(instr);
19364                                 }
19365                               } else {
19366                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
19367                                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19368                                 eors(CurrentCond(),
19369                                      Best,
19370                                      Register(rd),
19371                                      Register(rn),
19372                                      Operand(Register(rm),
19373                                              shift_operand.GetType(),
19374                                              shift_operand.GetAmount()));
19375                                 if (((instr & 0xfff08000) != 0xea900000)) {
19376                                   UnpredictableT32(instr);
19377                                 }
19378                               }
19379                               break;
19380                             }
19381                           }
19382                           break;
19383                         }
19384                       }
19385                       break;
19386                     }
19387                     default:
19388                       UnallocatedT32(instr);
19389                       break;
19390                   }
19391                   break;
19392                 }
19393                 case 0x01000000: {
19394                   // 0xeb000000
19395                   switch (instr & 0x00600000) {
19396                     case 0x00000000: {
19397                       // 0xeb000000
19398                       switch (instr & 0x000f0000) {
19399                         case 0x000d0000: {
19400                           // 0xeb0d0000
19401                           switch (instr & 0x000070f0) {
19402                             case 0x00000030: {
19403                               // 0xeb0d0030
19404                               unsigned rd = (instr >> 8) & 0xf;
19405                               unsigned rm = instr & 0xf;
19406                               // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19407                               add(CurrentCond(),
19408                                   Best,
19409                                   Register(rd),
19410                                   sp,
19411                                   Operand(Register(rm), RRX));
19412                               if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
19413                                 UnpredictableT32(instr);
19414                               }
19415                               break;
19416                             }
19417                             default: {
19418                               if (((instr & 0x70f0) == 0x30)) {
19419                                 UnallocatedT32(instr);
19420                                 return;
19421                               }
19422                               unsigned rd = (instr >> 8) & 0xf;
19423                               unsigned rm = instr & 0xf;
19424                               ImmediateShiftOperand
19425                                   shift_operand((instr >> 4) & 0x3,
19426                                                 ((instr >> 6) & 0x3) |
19427                                                     ((instr >> 10) & 0x1c));
19428                               if ((instr & 0x00100000) == 0x00000000 &&
19429                                   shift_operand.GetShift().IsLSL() &&
19430                                   (shift_operand.GetAmount() == 0) &&
19431                                   (((rd == rm)) || ((rd == sp.GetCode())))) {
19432                                 // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
19433                                 add(CurrentCond(),
19434                                     Wide,
19435                                     Register(rd),
19436                                     sp,
19437                                     Register(rm));
19438                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
19439                                   UnpredictableT32(instr);
19440                                 }
19441                               } else {
19442                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
19443                                 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19444                                 add(CurrentCond(),
19445                                     Best,
19446                                     Register(rd),
19447                                     sp,
19448                                     Operand(Register(rm),
19449                                             shift_operand.GetType(),
19450                                             shift_operand.GetAmount()));
19451                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
19452                                   UnpredictableT32(instr);
19453                                 }
19454                               }
19455                               break;
19456                             }
19457                           }
19458                           break;
19459                         }
19460                         default: {
19461                           switch (instr & 0x000070f0) {
19462                             case 0x00000030: {
19463                               // 0xeb000030
19464                               if (((instr & 0xf0000) == 0xd0000)) {
19465                                 UnallocatedT32(instr);
19466                                 return;
19467                               }
19468                               unsigned rd = (instr >> 8) & 0xf;
19469                               unsigned rn = (instr >> 16) & 0xf;
19470                               unsigned rm = instr & 0xf;
19471                               // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19472                               add(CurrentCond(),
19473                                   Best,
19474                                   Register(rd),
19475                                   Register(rn),
19476                                   Operand(Register(rm), RRX));
19477                               if (((instr & 0xfff0f0f0) != 0xeb000030)) {
19478                                 UnpredictableT32(instr);
19479                               }
19480                               break;
19481                             }
19482                             default: {
19483                               if (((instr & 0xf0000) == 0xd0000) ||
19484                                   ((instr & 0x70f0) == 0x30)) {
19485                                 UnallocatedT32(instr);
19486                                 return;
19487                               }
19488                               unsigned rd = (instr >> 8) & 0xf;
19489                               unsigned rn = (instr >> 16) & 0xf;
19490                               unsigned rm = instr & 0xf;
19491                               ImmediateShiftOperand
19492                                   shift_operand((instr >> 4) & 0x3,
19493                                                 ((instr >> 6) & 0x3) |
19494                                                     ((instr >> 10) & 0x1c));
19495                               if (InITBlock() &&
19496                                   (instr & 0x00100000) == 0x00000000 &&
19497                                   shift_operand.GetShift().IsLSL() &&
19498                                   (shift_operand.GetAmount() == 0) &&
19499                                   ((rd < kNumberOfT32LowRegisters) &&
19500                                    (rn < kNumberOfT32LowRegisters) &&
19501                                    (rm < kNumberOfT32LowRegisters))) {
19502                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19503                                 add(CurrentCond(),
19504                                     Wide,
19505                                     Register(rd),
19506                                     Register(rn),
19507                                     Register(rm));
19508                                 if (((instr & 0xfff08000) != 0xeb000000)) {
19509                                   UnpredictableT32(instr);
19510                                 }
19511                               } else if ((instr & 0x00100000) == 0x00000000 &&
19512                                          shift_operand.GetShift().IsLSL() &&
19513                                          (shift_operand.GetAmount() == 0) &&
19514                                          ((rd == rn))) {
19515                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
19516                                 add(CurrentCond(),
19517                                     Wide,
19518                                     Register(rd),
19519                                     Register(rn),
19520                                     Register(rm));
19521                                 if (((instr & 0xfff08000) != 0xeb000000)) {
19522                                   UnpredictableT32(instr);
19523                                 }
19524                               } else {
19525                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
19526                                 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19527                                 add(CurrentCond(),
19528                                     Best,
19529                                     Register(rd),
19530                                     Register(rn),
19531                                     Operand(Register(rm),
19532                                             shift_operand.GetType(),
19533                                             shift_operand.GetAmount()));
19534                                 if (((instr & 0xfff08000) != 0xeb000000)) {
19535                                   UnpredictableT32(instr);
19536                                 }
19537                               }
19538                               break;
19539                             }
19540                           }
19541                           break;
19542                         }
19543                       }
19544                       break;
19545                     }
19546                     case 0x00400000: {
19547                       // 0xeb400000
19548                       switch (instr & 0x000070f0) {
19549                         case 0x00000030: {
19550                           // 0xeb400030
19551                           unsigned rd = (instr >> 8) & 0xf;
19552                           unsigned rn = (instr >> 16) & 0xf;
19553                           unsigned rm = instr & 0xf;
19554                           // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19555                           adc(CurrentCond(),
19556                               Best,
19557                               Register(rd),
19558                               Register(rn),
19559                               Operand(Register(rm), RRX));
19560                           if (((instr & 0xfff0f0f0) != 0xeb400030)) {
19561                             UnpredictableT32(instr);
19562                           }
19563                           break;
19564                         }
19565                         default: {
19566                           if (((instr & 0x70f0) == 0x30)) {
19567                             UnallocatedT32(instr);
19568                             return;
19569                           }
19570                           unsigned rd = (instr >> 8) & 0xf;
19571                           unsigned rn = (instr >> 16) & 0xf;
19572                           unsigned rm = instr & 0xf;
19573                           ImmediateShiftOperand
19574                               shift_operand((instr >> 4) & 0x3,
19575                                             ((instr >> 6) & 0x3) |
19576                                                 ((instr >> 10) & 0x1c));
19577                           if (InITBlock() &&
19578                               (instr & 0x00100000) == 0x00000000 &&
19579                               shift_operand.GetShift().IsLSL() &&
19580                               (shift_operand.GetAmount() == 0) &&
19581                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19582                                (rm < kNumberOfT32LowRegisters))) {
19583                             // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19584                             adc(CurrentCond(),
19585                                 Wide,
19586                                 Register(rd),
19587                                 Register(rn),
19588                                 Register(rm));
19589                             if (((instr & 0xfff08000) != 0xeb400000)) {
19590                               UnpredictableT32(instr);
19591                             }
19592                           } else {
19593                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
19594                             // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19595                             adc(CurrentCond(),
19596                                 Best,
19597                                 Register(rd),
19598                                 Register(rn),
19599                                 Operand(Register(rm),
19600                                         shift_operand.GetType(),
19601                                         shift_operand.GetAmount()));
19602                             if (((instr & 0xfff08000) != 0xeb400000)) {
19603                               UnpredictableT32(instr);
19604                             }
19605                           }
19606                           break;
19607                         }
19608                       }
19609                       break;
19610                     }
19611                     case 0x00600000: {
19612                       // 0xeb600000
19613                       switch (instr & 0x000070f0) {
19614                         case 0x00000030: {
19615                           // 0xeb600030
19616                           unsigned rd = (instr >> 8) & 0xf;
19617                           unsigned rn = (instr >> 16) & 0xf;
19618                           unsigned rm = instr & 0xf;
19619                           // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19620                           sbc(CurrentCond(),
19621                               Best,
19622                               Register(rd),
19623                               Register(rn),
19624                               Operand(Register(rm), RRX));
19625                           if (((instr & 0xfff0f0f0) != 0xeb600030)) {
19626                             UnpredictableT32(instr);
19627                           }
19628                           break;
19629                         }
19630                         default: {
19631                           if (((instr & 0x70f0) == 0x30)) {
19632                             UnallocatedT32(instr);
19633                             return;
19634                           }
19635                           unsigned rd = (instr >> 8) & 0xf;
19636                           unsigned rn = (instr >> 16) & 0xf;
19637                           unsigned rm = instr & 0xf;
19638                           ImmediateShiftOperand
19639                               shift_operand((instr >> 4) & 0x3,
19640                                             ((instr >> 6) & 0x3) |
19641                                                 ((instr >> 10) & 0x1c));
19642                           if (InITBlock() &&
19643                               (instr & 0x00100000) == 0x00000000 &&
19644                               shift_operand.GetShift().IsLSL() &&
19645                               (shift_operand.GetAmount() == 0) &&
19646                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19647                                (rm < kNumberOfT32LowRegisters))) {
19648                             // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
19649                             sbc(CurrentCond(),
19650                                 Wide,
19651                                 Register(rd),
19652                                 Register(rn),
19653                                 Register(rm));
19654                             if (((instr & 0xfff08000) != 0xeb600000)) {
19655                               UnpredictableT32(instr);
19656                             }
19657                           } else {
19658                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
19659                             // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19660                             sbc(CurrentCond(),
19661                                 Best,
19662                                 Register(rd),
19663                                 Register(rn),
19664                                 Operand(Register(rm),
19665                                         shift_operand.GetType(),
19666                                         shift_operand.GetAmount()));
19667                             if (((instr & 0xfff08000) != 0xeb600000)) {
19668                               UnpredictableT32(instr);
19669                             }
19670                           }
19671                           break;
19672                         }
19673                       }
19674                       break;
19675                     }
19676                     default:
19677                       UnallocatedT32(instr);
19678                       break;
19679                   }
19680                   break;
19681                 }
19682                 case 0x01100000: {
19683                   // 0xeb100000
19684                   switch (instr & 0x00600000) {
19685                     case 0x00000000: {
19686                       // 0xeb100000
19687                       switch (instr & 0x00000f00) {
19688                         case 0x00000f00: {
19689                           // 0xeb100f00
19690                           switch (instr & 0x000070f0) {
19691                             case 0x00000030: {
19692                               // 0xeb100f30
19693                               unsigned rn = (instr >> 16) & 0xf;
19694                               unsigned rm = instr & 0xf;
19695                               // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
19696                               cmn(CurrentCond(),
19697                                   Best,
19698                                   Register(rn),
19699                                   Operand(Register(rm), RRX));
19700                               if (((instr & 0xfff0fff0) != 0xeb100f30)) {
19701                                 UnpredictableT32(instr);
19702                               }
19703                               break;
19704                             }
19705                             default: {
19706                               if (((instr & 0x70f0) == 0x30)) {
19707                                 UnallocatedT32(instr);
19708                                 return;
19709                               }
19710                               unsigned rn = (instr >> 16) & 0xf;
19711                               unsigned rm = instr & 0xf;
19712                               ImmediateShiftOperand
19713                                   shift_operand((instr >> 4) & 0x3,
19714                                                 ((instr >> 6) & 0x3) |
19715                                                     ((instr >> 10) & 0x1c));
19716                               if (shift_operand.GetShift().IsLSL() &&
19717                                   (shift_operand.GetAmount() == 0) &&
19718                                   ((rn < kNumberOfT32LowRegisters) &&
19719                                    (rm < kNumberOfT32LowRegisters))) {
19720                                 // CMN{<c>}.W <Rn>, <Rm> ; T2
19721                                 cmn(CurrentCond(),
19722                                     Wide,
19723                                     Register(rn),
19724                                     Register(rm));
19725                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
19726                                   UnpredictableT32(instr);
19727                                 }
19728                               } else {
19729                                 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19730                                 cmn(CurrentCond(),
19731                                     Best,
19732                                     Register(rn),
19733                                     Operand(Register(rm),
19734                                             shift_operand.GetType(),
19735                                             shift_operand.GetAmount()));
19736                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
19737                                   UnpredictableT32(instr);
19738                                 }
19739                               }
19740                               break;
19741                             }
19742                           }
19743                           break;
19744                         }
19745                         default: {
19746                           switch (instr & 0x000f0000) {
19747                             case 0x000d0000: {
19748                               // 0xeb1d0000
19749                               switch (instr & 0x000070f0) {
19750                                 case 0x00000030: {
19751                                   // 0xeb1d0030
19752                                   if (((instr & 0xf00) == 0xf00)) {
19753                                     UnallocatedT32(instr);
19754                                     return;
19755                                   }
19756                                   unsigned rd = (instr >> 8) & 0xf;
19757                                   unsigned rm = instr & 0xf;
19758                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
19759                                   adds(CurrentCond(),
19760                                        Best,
19761                                        Register(rd),
19762                                        sp,
19763                                        Operand(Register(rm), RRX));
19764                                   if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
19765                                     UnpredictableT32(instr);
19766                                   }
19767                                   break;
19768                                 }
19769                                 default: {
19770                                   if (((instr & 0x70f0) == 0x30) ||
19771                                       ((instr & 0xf00) == 0xf00)) {
19772                                     UnallocatedT32(instr);
19773                                     return;
19774                                   }
19775                                   unsigned rd = (instr >> 8) & 0xf;
19776                                   unsigned rm = instr & 0xf;
19777                                   ImmediateShiftOperand
19778                                       shift_operand((instr >> 4) & 0x3,
19779                                                     ((instr >> 6) & 0x3) |
19780                                                         ((instr >> 10) & 0x1c));
19781                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19782                                   adds(CurrentCond(),
19783                                        Best,
19784                                        Register(rd),
19785                                        sp,
19786                                        Operand(Register(rm),
19787                                                shift_operand.GetType(),
19788                                                shift_operand.GetAmount()));
19789                                   if (((instr & 0xffff8000) != 0xeb1d0000)) {
19790                                     UnpredictableT32(instr);
19791                                   }
19792                                   break;
19793                                 }
19794                               }
19795                               break;
19796                             }
19797                             default: {
19798                               switch (instr & 0x000070f0) {
19799                                 case 0x00000030: {
19800                                   // 0xeb100030
19801                                   if (((instr & 0xf0000) == 0xd0000) ||
19802                                       ((instr & 0xf00) == 0xf00)) {
19803                                     UnallocatedT32(instr);
19804                                     return;
19805                                   }
19806                                   unsigned rd = (instr >> 8) & 0xf;
19807                                   unsigned rn = (instr >> 16) & 0xf;
19808                                   unsigned rm = instr & 0xf;
19809                                   // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
19810                                   adds(CurrentCond(),
19811                                        Best,
19812                                        Register(rd),
19813                                        Register(rn),
19814                                        Operand(Register(rm), RRX));
19815                                   if (((instr & 0xfff0f0f0) != 0xeb100030)) {
19816                                     UnpredictableT32(instr);
19817                                   }
19818                                   break;
19819                                 }
19820                                 default: {
19821                                   if (((instr & 0xf0000) == 0xd0000) ||
19822                                       ((instr & 0x70f0) == 0x30) ||
19823                                       ((instr & 0xf00) == 0xf00)) {
19824                                     UnallocatedT32(instr);
19825                                     return;
19826                                   }
19827                                   unsigned rd = (instr >> 8) & 0xf;
19828                                   unsigned rn = (instr >> 16) & 0xf;
19829                                   unsigned rm = instr & 0xf;
19830                                   ImmediateShiftOperand
19831                                       shift_operand((instr >> 4) & 0x3,
19832                                                     ((instr >> 6) & 0x3) |
19833                                                         ((instr >> 10) & 0x1c));
19834                                   if (OutsideITBlock() &&
19835                                       (instr & 0x00100000) == 0x00100000 &&
19836                                       shift_operand.GetShift().IsLSL() &&
19837                                       (shift_operand.GetAmount() == 0) &&
19838                                       ((rd < kNumberOfT32LowRegisters) &&
19839                                        (rn < kNumberOfT32LowRegisters) &&
19840                                        (rm < kNumberOfT32LowRegisters))) {
19841                                     // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
19842                                     adds(Condition::None(),
19843                                          Wide,
19844                                          Register(rd),
19845                                          Register(rn),
19846                                          Register(rm));
19847                                     if (((instr & 0xfff08000) != 0xeb100000)) {
19848                                       UnpredictableT32(instr);
19849                                     }
19850                                   } else {
19851                                     VIXL_ASSERT((instr & 0x00100000) ==
19852                                                 0x00100000);
19853                                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
19854                                     adds(CurrentCond(),
19855                                          Best,
19856                                          Register(rd),
19857                                          Register(rn),
19858                                          Operand(Register(rm),
19859                                                  shift_operand.GetType(),
19860                                                  shift_operand.GetAmount()));
19861                                     if (((instr & 0xfff08000) != 0xeb100000)) {
19862                                       UnpredictableT32(instr);
19863                                     }
19864                                   }
19865                                   break;
19866                                 }
19867                               }
19868                               break;
19869                             }
19870                           }
19871                           break;
19872                         }
19873                       }
19874                       break;
19875                     }
19876                     case 0x00400000: {
19877                       // 0xeb500000
19878                       switch (instr & 0x000070f0) {
19879                         case 0x00000030: {
19880                           // 0xeb500030
19881                           unsigned rd = (instr >> 8) & 0xf;
19882                           unsigned rn = (instr >> 16) & 0xf;
19883                           unsigned rm = instr & 0xf;
19884                           // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19885                           adcs(CurrentCond(),
19886                                Best,
19887                                Register(rd),
19888                                Register(rn),
19889                                Operand(Register(rm), RRX));
19890                           if (((instr & 0xfff0f0f0) != 0xeb500030)) {
19891                             UnpredictableT32(instr);
19892                           }
19893                           break;
19894                         }
19895                         default: {
19896                           if (((instr & 0x70f0) == 0x30)) {
19897                             UnallocatedT32(instr);
19898                             return;
19899                           }
19900                           unsigned rd = (instr >> 8) & 0xf;
19901                           unsigned rn = (instr >> 16) & 0xf;
19902                           unsigned rm = instr & 0xf;
19903                           ImmediateShiftOperand
19904                               shift_operand((instr >> 4) & 0x3,
19905                                             ((instr >> 6) & 0x3) |
19906                                                 ((instr >> 10) & 0x1c));
19907                           if (OutsideITBlock() &&
19908                               (instr & 0x00100000) == 0x00100000 &&
19909                               shift_operand.GetShift().IsLSL() &&
19910                               (shift_operand.GetAmount() == 0) &&
19911                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19912                                (rm < kNumberOfT32LowRegisters))) {
19913                             // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
19914                             adcs(Condition::None(),
19915                                  Wide,
19916                                  Register(rd),
19917                                  Register(rn),
19918                                  Register(rm));
19919                             if (((instr & 0xfff08000) != 0xeb500000)) {
19920                               UnpredictableT32(instr);
19921                             }
19922                           } else {
19923                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
19924                             // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19925                             adcs(CurrentCond(),
19926                                  Best,
19927                                  Register(rd),
19928                                  Register(rn),
19929                                  Operand(Register(rm),
19930                                          shift_operand.GetType(),
19931                                          shift_operand.GetAmount()));
19932                             if (((instr & 0xfff08000) != 0xeb500000)) {
19933                               UnpredictableT32(instr);
19934                             }
19935                           }
19936                           break;
19937                         }
19938                       }
19939                       break;
19940                     }
19941                     case 0x00600000: {
19942                       // 0xeb700000
19943                       switch (instr & 0x000070f0) {
19944                         case 0x00000030: {
19945                           // 0xeb700030
19946                           unsigned rd = (instr >> 8) & 0xf;
19947                           unsigned rn = (instr >> 16) & 0xf;
19948                           unsigned rm = instr & 0xf;
19949                           // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
19950                           sbcs(CurrentCond(),
19951                                Best,
19952                                Register(rd),
19953                                Register(rn),
19954                                Operand(Register(rm), RRX));
19955                           if (((instr & 0xfff0f0f0) != 0xeb700030)) {
19956                             UnpredictableT32(instr);
19957                           }
19958                           break;
19959                         }
19960                         default: {
19961                           if (((instr & 0x70f0) == 0x30)) {
19962                             UnallocatedT32(instr);
19963                             return;
19964                           }
19965                           unsigned rd = (instr >> 8) & 0xf;
19966                           unsigned rn = (instr >> 16) & 0xf;
19967                           unsigned rm = instr & 0xf;
19968                           ImmediateShiftOperand
19969                               shift_operand((instr >> 4) & 0x3,
19970                                             ((instr >> 6) & 0x3) |
19971                                                 ((instr >> 10) & 0x1c));
19972                           if (OutsideITBlock() &&
19973                               (instr & 0x00100000) == 0x00100000 &&
19974                               shift_operand.GetShift().IsLSL() &&
19975                               (shift_operand.GetAmount() == 0) &&
19976                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
19977                                (rm < kNumberOfT32LowRegisters))) {
19978                             // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
19979                             sbcs(Condition::None(),
19980                                  Wide,
19981                                  Register(rd),
19982                                  Register(rn),
19983                                  Register(rm));
19984                             if (((instr & 0xfff08000) != 0xeb700000)) {
19985                               UnpredictableT32(instr);
19986                             }
19987                           } else {
19988                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
19989                             // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
19990                             sbcs(CurrentCond(),
19991                                  Best,
19992                                  Register(rd),
19993                                  Register(rn),
19994                                  Operand(Register(rm),
19995                                          shift_operand.GetType(),
19996                                          shift_operand.GetAmount()));
19997                             if (((instr & 0xfff08000) != 0xeb700000)) {
19998                               UnpredictableT32(instr);
19999                             }
20000                           }
20001                           break;
20002                         }
20003                       }
20004                       break;
20005                     }
20006                     default:
20007                       UnallocatedT32(instr);
20008                       break;
20009                   }
20010                   break;
20011                 }
20012                 case 0x01800000: {
20013                   // 0xeb800000
20014                   switch (instr & 0x00600000) {
20015                     case 0x00200000: {
20016                       // 0xeba00000
20017                       switch (instr & 0x000f0000) {
20018                         case 0x000d0000: {
20019                           // 0xebad0000
20020                           switch (instr & 0x000070f0) {
20021                             case 0x00000030: {
20022                               // 0xebad0030
20023                               unsigned rd = (instr >> 8) & 0xf;
20024                               unsigned rm = instr & 0xf;
20025                               // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20026                               sub(CurrentCond(),
20027                                   Best,
20028                                   Register(rd),
20029                                   sp,
20030                                   Operand(Register(rm), RRX));
20031                               if (((instr & 0xfffff0f0) != 0xebad0030)) {
20032                                 UnpredictableT32(instr);
20033                               }
20034                               break;
20035                             }
20036                             default: {
20037                               if (((instr & 0x70f0) == 0x30)) {
20038                                 UnallocatedT32(instr);
20039                                 return;
20040                               }
20041                               unsigned rd = (instr >> 8) & 0xf;
20042                               unsigned rm = instr & 0xf;
20043                               ImmediateShiftOperand
20044                                   shift_operand((instr >> 4) & 0x3,
20045                                                 ((instr >> 6) & 0x3) |
20046                                                     ((instr >> 10) & 0x1c));
20047                               if ((instr & 0x00100000) == 0x00000000 &&
20048                                   shift_operand.GetShift().IsLSL() &&
20049                                   (shift_operand.GetAmount() == 0)) {
20050                                 // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
20051                                 sub(CurrentCond(),
20052                                     Best,
20053                                     Register(rd),
20054                                     sp,
20055                                     Register(rm));
20056                                 if (((instr & 0xffff8000) != 0xebad0000)) {
20057                                   UnpredictableT32(instr);
20058                                 }
20059                               } else {
20060                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
20061                                 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20062                                 sub(CurrentCond(),
20063                                     Best,
20064                                     Register(rd),
20065                                     sp,
20066                                     Operand(Register(rm),
20067                                             shift_operand.GetType(),
20068                                             shift_operand.GetAmount()));
20069                                 if (((instr & 0xffff8000) != 0xebad0000)) {
20070                                   UnpredictableT32(instr);
20071                                 }
20072                               }
20073                               break;
20074                             }
20075                           }
20076                           break;
20077                         }
20078                         default: {
20079                           switch (instr & 0x000070f0) {
20080                             case 0x00000030: {
20081                               // 0xeba00030
20082                               if (((instr & 0xf0000) == 0xd0000)) {
20083                                 UnallocatedT32(instr);
20084                                 return;
20085                               }
20086                               unsigned rd = (instr >> 8) & 0xf;
20087                               unsigned rn = (instr >> 16) & 0xf;
20088                               unsigned rm = instr & 0xf;
20089                               // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20090                               sub(CurrentCond(),
20091                                   Best,
20092                                   Register(rd),
20093                                   Register(rn),
20094                                   Operand(Register(rm), RRX));
20095                               if (((instr & 0xfff0f0f0) != 0xeba00030)) {
20096                                 UnpredictableT32(instr);
20097                               }
20098                               break;
20099                             }
20100                             default: {
20101                               if (((instr & 0xf0000) == 0xd0000) ||
20102                                   ((instr & 0x70f0) == 0x30)) {
20103                                 UnallocatedT32(instr);
20104                                 return;
20105                               }
20106                               unsigned rd = (instr >> 8) & 0xf;
20107                               unsigned rn = (instr >> 16) & 0xf;
20108                               unsigned rm = instr & 0xf;
20109                               ImmediateShiftOperand
20110                                   shift_operand((instr >> 4) & 0x3,
20111                                                 ((instr >> 6) & 0x3) |
20112                                                     ((instr >> 10) & 0x1c));
20113                               if (InITBlock() &&
20114                                   (instr & 0x00100000) == 0x00000000 &&
20115                                   shift_operand.GetShift().IsLSL() &&
20116                                   (shift_operand.GetAmount() == 0) &&
20117                                   ((rd < kNumberOfT32LowRegisters) &&
20118                                    (rn < kNumberOfT32LowRegisters) &&
20119                                    (rm < kNumberOfT32LowRegisters))) {
20120                                 // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
20121                                 sub(CurrentCond(),
20122                                     Wide,
20123                                     Register(rd),
20124                                     Register(rn),
20125                                     Register(rm));
20126                                 if (((instr & 0xfff08000) != 0xeba00000)) {
20127                                   UnpredictableT32(instr);
20128                                 }
20129                               } else {
20130                                 VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
20131                                 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20132                                 sub(CurrentCond(),
20133                                     Best,
20134                                     Register(rd),
20135                                     Register(rn),
20136                                     Operand(Register(rm),
20137                                             shift_operand.GetType(),
20138                                             shift_operand.GetAmount()));
20139                                 if (((instr & 0xfff08000) != 0xeba00000)) {
20140                                   UnpredictableT32(instr);
20141                                 }
20142                               }
20143                               break;
20144                             }
20145                           }
20146                           break;
20147                         }
20148                       }
20149                       break;
20150                     }
20151                     case 0x00400000: {
20152                       // 0xebc00000
20153                       switch (instr & 0x000070f0) {
20154                         case 0x00000030: {
20155                           // 0xebc00030
20156                           unsigned rd = (instr >> 8) & 0xf;
20157                           unsigned rn = (instr >> 16) & 0xf;
20158                           unsigned rm = instr & 0xf;
20159                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20160                           rsb(CurrentCond(),
20161                               Best,
20162                               Register(rd),
20163                               Register(rn),
20164                               Operand(Register(rm), RRX));
20165                           if (((instr & 0xfff0f0f0) != 0xebc00030)) {
20166                             UnpredictableT32(instr);
20167                           }
20168                           break;
20169                         }
20170                         default: {
20171                           if (((instr & 0x70f0) == 0x30)) {
20172                             UnallocatedT32(instr);
20173                             return;
20174                           }
20175                           unsigned rd = (instr >> 8) & 0xf;
20176                           unsigned rn = (instr >> 16) & 0xf;
20177                           unsigned rm = instr & 0xf;
20178                           ImmediateShiftOperand
20179                               shift_operand((instr >> 4) & 0x3,
20180                                             ((instr >> 6) & 0x3) |
20181                                                 ((instr >> 10) & 0x1c));
20182                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20183                           rsb(CurrentCond(),
20184                               Best,
20185                               Register(rd),
20186                               Register(rn),
20187                               Operand(Register(rm),
20188                                       shift_operand.GetType(),
20189                                       shift_operand.GetAmount()));
20190                           if (((instr & 0xfff08000) != 0xebc00000)) {
20191                             UnpredictableT32(instr);
20192                           }
20193                           break;
20194                         }
20195                       }
20196                       break;
20197                     }
20198                     default:
20199                       UnallocatedT32(instr);
20200                       break;
20201                   }
20202                   break;
20203                 }
20204                 case 0x01900000: {
20205                   // 0xeb900000
20206                   switch (instr & 0x00600000) {
20207                     case 0x00200000: {
20208                       // 0xebb00000
20209                       switch (instr & 0x00000f00) {
20210                         case 0x00000f00: {
20211                           // 0xebb00f00
20212                           switch (instr & 0x000070f0) {
20213                             case 0x00000030: {
20214                               // 0xebb00f30
20215                               unsigned rn = (instr >> 16) & 0xf;
20216                               unsigned rm = instr & 0xf;
20217                               // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
20218                               cmp(CurrentCond(),
20219                                   Best,
20220                                   Register(rn),
20221                                   Operand(Register(rm), RRX));
20222                               if (((instr & 0xfff0fff0) != 0xebb00f30)) {
20223                                 UnpredictableT32(instr);
20224                               }
20225                               break;
20226                             }
20227                             default: {
20228                               if (((instr & 0x70f0) == 0x30)) {
20229                                 UnallocatedT32(instr);
20230                                 return;
20231                               }
20232                               unsigned rn = (instr >> 16) & 0xf;
20233                               unsigned rm = instr & 0xf;
20234                               ImmediateShiftOperand
20235                                   shift_operand((instr >> 4) & 0x3,
20236                                                 ((instr >> 6) & 0x3) |
20237                                                     ((instr >> 10) & 0x1c));
20238                               if (shift_operand.GetShift().IsLSL() &&
20239                                   (shift_operand.GetAmount() == 0)) {
20240                                 // CMP{<c>}.W <Rn>, <Rm> ; T3
20241                                 cmp(CurrentCond(),
20242                                     Wide,
20243                                     Register(rn),
20244                                     Register(rm));
20245                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
20246                                   UnpredictableT32(instr);
20247                                 }
20248                               } else {
20249                                 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
20250                                 cmp(CurrentCond(),
20251                                     Best,
20252                                     Register(rn),
20253                                     Operand(Register(rm),
20254                                             shift_operand.GetType(),
20255                                             shift_operand.GetAmount()));
20256                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
20257                                   UnpredictableT32(instr);
20258                                 }
20259                               }
20260                               break;
20261                             }
20262                           }
20263                           break;
20264                         }
20265                         default: {
20266                           switch (instr & 0x000f0000) {
20267                             case 0x000d0000: {
20268                               // 0xebbd0000
20269                               switch (instr & 0x000070f0) {
20270                                 case 0x00000030: {
20271                                   // 0xebbd0030
20272                                   if (((instr & 0xf00) == 0xf00)) {
20273                                     UnallocatedT32(instr);
20274                                     return;
20275                                   }
20276                                   unsigned rd = (instr >> 8) & 0xf;
20277                                   unsigned rm = instr & 0xf;
20278                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
20279                                   subs(CurrentCond(),
20280                                        Best,
20281                                        Register(rd),
20282                                        sp,
20283                                        Operand(Register(rm), RRX));
20284                                   if (((instr & 0xfffff0f0) != 0xebbd0030)) {
20285                                     UnpredictableT32(instr);
20286                                   }
20287                                   break;
20288                                 }
20289                                 default: {
20290                                   if (((instr & 0x70f0) == 0x30) ||
20291                                       ((instr & 0xf00) == 0xf00)) {
20292                                     UnallocatedT32(instr);
20293                                     return;
20294                                   }
20295                                   unsigned rd = (instr >> 8) & 0xf;
20296                                   unsigned rm = instr & 0xf;
20297                                   ImmediateShiftOperand
20298                                       shift_operand((instr >> 4) & 0x3,
20299                                                     ((instr >> 6) & 0x3) |
20300                                                         ((instr >> 10) & 0x1c));
20301                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20302                                   subs(CurrentCond(),
20303                                        Best,
20304                                        Register(rd),
20305                                        sp,
20306                                        Operand(Register(rm),
20307                                                shift_operand.GetType(),
20308                                                shift_operand.GetAmount()));
20309                                   if (((instr & 0xffff8000) != 0xebbd0000)) {
20310                                     UnpredictableT32(instr);
20311                                   }
20312                                   break;
20313                                 }
20314                               }
20315                               break;
20316                             }
20317                             default: {
20318                               switch (instr & 0x000070f0) {
20319                                 case 0x00000030: {
20320                                   // 0xebb00030
20321                                   if (((instr & 0xf0000) == 0xd0000) ||
20322                                       ((instr & 0xf00) == 0xf00)) {
20323                                     UnallocatedT32(instr);
20324                                     return;
20325                                   }
20326                                   unsigned rd = (instr >> 8) & 0xf;
20327                                   unsigned rn = (instr >> 16) & 0xf;
20328                                   unsigned rm = instr & 0xf;
20329                                   // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
20330                                   subs(CurrentCond(),
20331                                        Best,
20332                                        Register(rd),
20333                                        Register(rn),
20334                                        Operand(Register(rm), RRX));
20335                                   if (((instr & 0xfff0f0f0) != 0xebb00030)) {
20336                                     UnpredictableT32(instr);
20337                                   }
20338                                   break;
20339                                 }
20340                                 default: {
20341                                   if (((instr & 0xf0000) == 0xd0000) ||
20342                                       ((instr & 0x70f0) == 0x30) ||
20343                                       ((instr & 0xf00) == 0xf00)) {
20344                                     UnallocatedT32(instr);
20345                                     return;
20346                                   }
20347                                   unsigned rd = (instr >> 8) & 0xf;
20348                                   unsigned rn = (instr >> 16) & 0xf;
20349                                   unsigned rm = instr & 0xf;
20350                                   ImmediateShiftOperand
20351                                       shift_operand((instr >> 4) & 0x3,
20352                                                     ((instr >> 6) & 0x3) |
20353                                                         ((instr >> 10) & 0x1c));
20354                                   if (OutsideITBlock() &&
20355                                       (instr & 0x00100000) == 0x00100000 &&
20356                                       shift_operand.GetShift().IsLSL() &&
20357                                       (shift_operand.GetAmount() == 0) &&
20358                                       ((rd < kNumberOfT32LowRegisters) &&
20359                                        (rn < kNumberOfT32LowRegisters) &&
20360                                        (rm < kNumberOfT32LowRegisters))) {
20361                                     // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
20362                                     subs(Condition::None(),
20363                                          Wide,
20364                                          Register(rd),
20365                                          Register(rn),
20366                                          Register(rm));
20367                                     if (((instr & 0xfff08000) != 0xebb00000)) {
20368                                       UnpredictableT32(instr);
20369                                     }
20370                                   } else {
20371                                     VIXL_ASSERT((instr & 0x00100000) ==
20372                                                 0x00100000);
20373                                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
20374                                     subs(CurrentCond(),
20375                                          Best,
20376                                          Register(rd),
20377                                          Register(rn),
20378                                          Operand(Register(rm),
20379                                                  shift_operand.GetType(),
20380                                                  shift_operand.GetAmount()));
20381                                     if (((instr & 0xfff08000) != 0xebb00000)) {
20382                                       UnpredictableT32(instr);
20383                                     }
20384                                   }
20385                                   break;
20386                                 }
20387                               }
20388                               break;
20389                             }
20390                           }
20391                           break;
20392                         }
20393                       }
20394                       break;
20395                     }
20396                     case 0x00400000: {
20397                       // 0xebd00000
20398                       switch (instr & 0x000070f0) {
20399                         case 0x00000030: {
20400                           // 0xebd00030
20401                           unsigned rd = (instr >> 8) & 0xf;
20402                           unsigned rn = (instr >> 16) & 0xf;
20403                           unsigned rm = instr & 0xf;
20404                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
20405                           rsbs(CurrentCond(),
20406                                Best,
20407                                Register(rd),
20408                                Register(rn),
20409                                Operand(Register(rm), RRX));
20410                           if (((instr & 0xfff0f0f0) != 0xebd00030)) {
20411                             UnpredictableT32(instr);
20412                           }
20413                           break;
20414                         }
20415                         default: {
20416                           if (((instr & 0x70f0) == 0x30)) {
20417                             UnallocatedT32(instr);
20418                             return;
20419                           }
20420                           unsigned rd = (instr >> 8) & 0xf;
20421                           unsigned rn = (instr >> 16) & 0xf;
20422                           unsigned rm = instr & 0xf;
20423                           ImmediateShiftOperand
20424                               shift_operand((instr >> 4) & 0x3,
20425                                             ((instr >> 6) & 0x3) |
20426                                                 ((instr >> 10) & 0x1c));
20427                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
20428                           rsbs(CurrentCond(),
20429                                Best,
20430                                Register(rd),
20431                                Register(rn),
20432                                Operand(Register(rm),
20433                                        shift_operand.GetType(),
20434                                        shift_operand.GetAmount()));
20435                           if (((instr & 0xfff08000) != 0xebd00000)) {
20436                             UnpredictableT32(instr);
20437                           }
20438                           break;
20439                         }
20440                       }
20441                       break;
20442                     }
20443                     default:
20444                       UnallocatedT32(instr);
20445                       break;
20446                   }
20447                   break;
20448                 }
20449                 case 0x10000000: {
20450                   // 0xfa000000
20451                   switch (instr & 0x0000f080) {
20452                     case 0x0000f000: {
20453                       // 0xfa00f000
20454                       if ((instr & 0x00000070) == 0x00000000) {
20455                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20456                              Uint32(0x2))) {
20457                           unsigned rd = (instr >> 8) & 0xf;
20458                           unsigned rm = (instr >> 16) & 0xf;
20459                           unsigned rs = instr & 0xf;
20460                           if (InITBlock() &&
20461                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20462                                (rs < kNumberOfT32LowRegisters))) {
20463                             // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20464                             asr(CurrentCond(),
20465                                 Wide,
20466                                 Register(rd),
20467                                 Register(rm),
20468                                 Register(rs));
20469                           } else {
20470                             // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20471                             asr(CurrentCond(),
20472                                 Best,
20473                                 Register(rd),
20474                                 Register(rm),
20475                                 Register(rs));
20476                           }
20477                           return;
20478                         }
20479                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20480                              Uint32(0x0))) {
20481                           unsigned rd = (instr >> 8) & 0xf;
20482                           unsigned rm = (instr >> 16) & 0xf;
20483                           unsigned rs = instr & 0xf;
20484                           if (InITBlock() &&
20485                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20486                                (rs < kNumberOfT32LowRegisters))) {
20487                             // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20488                             lsl(CurrentCond(),
20489                                 Wide,
20490                                 Register(rd),
20491                                 Register(rm),
20492                                 Register(rs));
20493                           } else {
20494                             // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20495                             lsl(CurrentCond(),
20496                                 Best,
20497                                 Register(rd),
20498                                 Register(rm),
20499                                 Register(rs));
20500                           }
20501                           return;
20502                         }
20503                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20504                              Uint32(0x1))) {
20505                           unsigned rd = (instr >> 8) & 0xf;
20506                           unsigned rm = (instr >> 16) & 0xf;
20507                           unsigned rs = instr & 0xf;
20508                           if (InITBlock() &&
20509                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20510                                (rs < kNumberOfT32LowRegisters))) {
20511                             // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20512                             lsr(CurrentCond(),
20513                                 Wide,
20514                                 Register(rd),
20515                                 Register(rm),
20516                                 Register(rs));
20517                           } else {
20518                             // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20519                             lsr(CurrentCond(),
20520                                 Best,
20521                                 Register(rd),
20522                                 Register(rm),
20523                                 Register(rs));
20524                           }
20525                           return;
20526                         }
20527                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20528                              Uint32(0x3))) {
20529                           unsigned rd = (instr >> 8) & 0xf;
20530                           unsigned rm = (instr >> 16) & 0xf;
20531                           unsigned rs = instr & 0xf;
20532                           if (InITBlock() &&
20533                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20534                                (rs < kNumberOfT32LowRegisters))) {
20535                             // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
20536                             ror(CurrentCond(),
20537                                 Wide,
20538                                 Register(rd),
20539                                 Register(rm),
20540                                 Register(rs));
20541                           } else {
20542                             // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20543                             ror(CurrentCond(),
20544                                 Best,
20545                                 Register(rd),
20546                                 Register(rm),
20547                                 Register(rs));
20548                           }
20549                           return;
20550                         }
20551                         unsigned rd = (instr >> 8) & 0xf;
20552                         unsigned rm = (instr >> 16) & 0xf;
20553                         Shift shift((instr >> 21) & 0x3);
20554                         unsigned rs = instr & 0xf;
20555                         if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
20556                             ((rd < kNumberOfT32LowRegisters) &&
20557                              (rm < kNumberOfT32LowRegisters) &&
20558                              (rs < kNumberOfT32LowRegisters))) {
20559                           // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
20560                           mov(CurrentCond(),
20561                               Wide,
20562                               Register(rd),
20563                               Operand(Register(rm),
20564                                       shift.GetType(),
20565                                       Register(rs)));
20566                         } else {
20567                           VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
20568                           // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20569                           mov(CurrentCond(),
20570                               Best,
20571                               Register(rd),
20572                               Operand(Register(rm),
20573                                       shift.GetType(),
20574                                       Register(rs)));
20575                         }
20576                       } else {
20577                         UnallocatedT32(instr);
20578                       }
20579                       break;
20580                     }
20581                     case 0x0000f080: {
20582                       // 0xfa00f080
20583                       switch (instr & 0x00600000) {
20584                         case 0x00000000: {
20585                           // 0xfa00f080
20586                           switch (instr & 0x000f0000) {
20587                             case 0x000f0000: {
20588                               // 0xfa0ff080
20589                               unsigned rd = (instr >> 8) & 0xf;
20590                               unsigned rm = instr & 0xf;
20591                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20592                               if ((amount == 0) &&
20593                                   ((rd < kNumberOfT32LowRegisters) &&
20594                                    (rm < kNumberOfT32LowRegisters))) {
20595                                 // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
20596                                 sxth(CurrentCond(),
20597                                      Wide,
20598                                      Register(rd),
20599                                      Register(rm));
20600                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20601                                   UnpredictableT32(instr);
20602                                 }
20603                               } else {
20604                                 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20605                                 sxth(CurrentCond(),
20606                                      Best,
20607                                      Register(rd),
20608                                      Operand(Register(rm), ROR, amount));
20609                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
20610                                   UnpredictableT32(instr);
20611                                 }
20612                               }
20613                               break;
20614                             }
20615                             default: {
20616                               if (((instr & 0xf0000) == 0xf0000)) {
20617                                 UnallocatedT32(instr);
20618                                 return;
20619                               }
20620                               unsigned rd = (instr >> 8) & 0xf;
20621                               unsigned rn = (instr >> 16) & 0xf;
20622                               unsigned rm = instr & 0xf;
20623                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20624                               // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20625                               sxtah(CurrentCond(),
20626                                     Register(rd),
20627                                     Register(rn),
20628                                     Operand(Register(rm), ROR, amount));
20629                               if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
20630                                 UnpredictableT32(instr);
20631                               }
20632                               break;
20633                             }
20634                           }
20635                           break;
20636                         }
20637                         case 0x00200000: {
20638                           // 0xfa20f080
20639                           switch (instr & 0x000f0000) {
20640                             case 0x000f0000: {
20641                               // 0xfa2ff080
20642                               unsigned rd = (instr >> 8) & 0xf;
20643                               unsigned rm = instr & 0xf;
20644                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20645                               // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20646                               sxtb16(CurrentCond(),
20647                                      Register(rd),
20648                                      Operand(Register(rm), ROR, amount));
20649                               if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
20650                                 UnpredictableT32(instr);
20651                               }
20652                               break;
20653                             }
20654                             default: {
20655                               if (((instr & 0xf0000) == 0xf0000)) {
20656                                 UnallocatedT32(instr);
20657                                 return;
20658                               }
20659                               unsigned rd = (instr >> 8) & 0xf;
20660                               unsigned rn = (instr >> 16) & 0xf;
20661                               unsigned rm = instr & 0xf;
20662                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20663                               // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20664                               sxtab16(CurrentCond(),
20665                                       Register(rd),
20666                                       Register(rn),
20667                                       Operand(Register(rm), ROR, amount));
20668                               if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
20669                                 UnpredictableT32(instr);
20670                               }
20671                               break;
20672                             }
20673                           }
20674                           break;
20675                         }
20676                         case 0x00400000: {
20677                           // 0xfa40f080
20678                           switch (instr & 0x000f0000) {
20679                             case 0x000f0000: {
20680                               // 0xfa4ff080
20681                               unsigned rd = (instr >> 8) & 0xf;
20682                               unsigned rm = instr & 0xf;
20683                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20684                               if ((amount == 0) &&
20685                                   ((rd < kNumberOfT32LowRegisters) &&
20686                                    (rm < kNumberOfT32LowRegisters))) {
20687                                 // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
20688                                 sxtb(CurrentCond(),
20689                                      Wide,
20690                                      Register(rd),
20691                                      Register(rm));
20692                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20693                                   UnpredictableT32(instr);
20694                                 }
20695                               } else {
20696                                 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20697                                 sxtb(CurrentCond(),
20698                                      Best,
20699                                      Register(rd),
20700                                      Operand(Register(rm), ROR, amount));
20701                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
20702                                   UnpredictableT32(instr);
20703                                 }
20704                               }
20705                               break;
20706                             }
20707                             default: {
20708                               if (((instr & 0xf0000) == 0xf0000)) {
20709                                 UnallocatedT32(instr);
20710                                 return;
20711                               }
20712                               unsigned rd = (instr >> 8) & 0xf;
20713                               unsigned rn = (instr >> 16) & 0xf;
20714                               unsigned rm = instr & 0xf;
20715                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20716                               // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20717                               sxtab(CurrentCond(),
20718                                     Register(rd),
20719                                     Register(rn),
20720                                     Operand(Register(rm), ROR, amount));
20721                               if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
20722                                 UnpredictableT32(instr);
20723                               }
20724                               break;
20725                             }
20726                           }
20727                           break;
20728                         }
20729                         default:
20730                           UnallocatedT32(instr);
20731                           break;
20732                       }
20733                       break;
20734                     }
20735                     default:
20736                       UnallocatedT32(instr);
20737                       break;
20738                   }
20739                   break;
20740                 }
20741                 case 0x10100000: {
20742                   // 0xfa100000
20743                   switch (instr & 0x0000f080) {
20744                     case 0x0000f000: {
20745                       // 0xfa10f000
20746                       if ((instr & 0x00000070) == 0x00000000) {
20747                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20748                              Uint32(0x2))) {
20749                           unsigned rd = (instr >> 8) & 0xf;
20750                           unsigned rm = (instr >> 16) & 0xf;
20751                           unsigned rs = instr & 0xf;
20752                           if (OutsideITBlock() &&
20753                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20754                                (rs < kNumberOfT32LowRegisters))) {
20755                             // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
20756                             asrs(Condition::None(),
20757                                  Wide,
20758                                  Register(rd),
20759                                  Register(rm),
20760                                  Register(rs));
20761                           } else {
20762                             // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20763                             asrs(CurrentCond(),
20764                                  Best,
20765                                  Register(rd),
20766                                  Register(rm),
20767                                  Register(rs));
20768                           }
20769                           return;
20770                         }
20771                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20772                              Uint32(0x0))) {
20773                           unsigned rd = (instr >> 8) & 0xf;
20774                           unsigned rm = (instr >> 16) & 0xf;
20775                           unsigned rs = instr & 0xf;
20776                           if (OutsideITBlock() &&
20777                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20778                                (rs < kNumberOfT32LowRegisters))) {
20779                             // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
20780                             lsls(Condition::None(),
20781                                  Wide,
20782                                  Register(rd),
20783                                  Register(rm),
20784                                  Register(rs));
20785                           } else {
20786                             // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20787                             lsls(CurrentCond(),
20788                                  Best,
20789                                  Register(rd),
20790                                  Register(rm),
20791                                  Register(rs));
20792                           }
20793                           return;
20794                         }
20795                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20796                              Uint32(0x1))) {
20797                           unsigned rd = (instr >> 8) & 0xf;
20798                           unsigned rm = (instr >> 16) & 0xf;
20799                           unsigned rs = instr & 0xf;
20800                           if (OutsideITBlock() &&
20801                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20802                                (rs < kNumberOfT32LowRegisters))) {
20803                             // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
20804                             lsrs(Condition::None(),
20805                                  Wide,
20806                                  Register(rd),
20807                                  Register(rm),
20808                                  Register(rs));
20809                           } else {
20810                             // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20811                             lsrs(CurrentCond(),
20812                                  Best,
20813                                  Register(rd),
20814                                  Register(rm),
20815                                  Register(rs));
20816                           }
20817                           return;
20818                         }
20819                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
20820                              Uint32(0x3))) {
20821                           unsigned rd = (instr >> 8) & 0xf;
20822                           unsigned rm = (instr >> 16) & 0xf;
20823                           unsigned rs = instr & 0xf;
20824                           if (OutsideITBlock() &&
20825                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
20826                                (rs < kNumberOfT32LowRegisters))) {
20827                             // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
20828                             rors(Condition::None(),
20829                                  Wide,
20830                                  Register(rd),
20831                                  Register(rm),
20832                                  Register(rs));
20833                           } else {
20834                             // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
20835                             rors(CurrentCond(),
20836                                  Best,
20837                                  Register(rd),
20838                                  Register(rm),
20839                                  Register(rs));
20840                           }
20841                           return;
20842                         }
20843                         unsigned rd = (instr >> 8) & 0xf;
20844                         unsigned rm = (instr >> 16) & 0xf;
20845                         Shift shift((instr >> 21) & 0x3);
20846                         unsigned rs = instr & 0xf;
20847                         if (OutsideITBlock() &&
20848                             (instr & 0x00100000) == 0x00100000 &&
20849                             ((rd < kNumberOfT32LowRegisters) &&
20850                              (rm < kNumberOfT32LowRegisters) &&
20851                              (rs < kNumberOfT32LowRegisters))) {
20852                           // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
20853                           movs(Condition::None(),
20854                                Wide,
20855                                Register(rd),
20856                                Operand(Register(rm),
20857                                        shift.GetType(),
20858                                        Register(rs)));
20859                         } else {
20860                           VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
20861                           // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
20862                           movs(CurrentCond(),
20863                                Best,
20864                                Register(rd),
20865                                Operand(Register(rm),
20866                                        shift.GetType(),
20867                                        Register(rs)));
20868                         }
20869                       } else {
20870                         UnallocatedT32(instr);
20871                       }
20872                       break;
20873                     }
20874                     case 0x0000f080: {
20875                       // 0xfa10f080
20876                       switch (instr & 0x00600000) {
20877                         case 0x00000000: {
20878                           // 0xfa10f080
20879                           switch (instr & 0x000f0000) {
20880                             case 0x000f0000: {
20881                               // 0xfa1ff080
20882                               unsigned rd = (instr >> 8) & 0xf;
20883                               unsigned rm = instr & 0xf;
20884                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20885                               if ((amount == 0) &&
20886                                   ((rd < kNumberOfT32LowRegisters) &&
20887                                    (rm < kNumberOfT32LowRegisters))) {
20888                                 // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
20889                                 uxth(CurrentCond(),
20890                                      Wide,
20891                                      Register(rd),
20892                                      Register(rm));
20893                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
20894                                   UnpredictableT32(instr);
20895                                 }
20896                               } else {
20897                                 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20898                                 uxth(CurrentCond(),
20899                                      Best,
20900                                      Register(rd),
20901                                      Operand(Register(rm), ROR, amount));
20902                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
20903                                   UnpredictableT32(instr);
20904                                 }
20905                               }
20906                               break;
20907                             }
20908                             default: {
20909                               if (((instr & 0xf0000) == 0xf0000)) {
20910                                 UnallocatedT32(instr);
20911                                 return;
20912                               }
20913                               unsigned rd = (instr >> 8) & 0xf;
20914                               unsigned rn = (instr >> 16) & 0xf;
20915                               unsigned rm = instr & 0xf;
20916                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20917                               // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20918                               uxtah(CurrentCond(),
20919                                     Register(rd),
20920                                     Register(rn),
20921                                     Operand(Register(rm), ROR, amount));
20922                               if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
20923                                 UnpredictableT32(instr);
20924                               }
20925                               break;
20926                             }
20927                           }
20928                           break;
20929                         }
20930                         case 0x00200000: {
20931                           // 0xfa30f080
20932                           switch (instr & 0x000f0000) {
20933                             case 0x000f0000: {
20934                               // 0xfa3ff080
20935                               unsigned rd = (instr >> 8) & 0xf;
20936                               unsigned rm = instr & 0xf;
20937                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20938                               // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20939                               uxtb16(CurrentCond(),
20940                                      Register(rd),
20941                                      Operand(Register(rm), ROR, amount));
20942                               if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
20943                                 UnpredictableT32(instr);
20944                               }
20945                               break;
20946                             }
20947                             default: {
20948                               if (((instr & 0xf0000) == 0xf0000)) {
20949                                 UnallocatedT32(instr);
20950                                 return;
20951                               }
20952                               unsigned rd = (instr >> 8) & 0xf;
20953                               unsigned rn = (instr >> 16) & 0xf;
20954                               unsigned rm = instr & 0xf;
20955                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20956                               // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
20957                               uxtab16(CurrentCond(),
20958                                       Register(rd),
20959                                       Register(rn),
20960                                       Operand(Register(rm), ROR, amount));
20961                               if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
20962                                 UnpredictableT32(instr);
20963                               }
20964                               break;
20965                             }
20966                           }
20967                           break;
20968                         }
20969                         case 0x00400000: {
20970                           // 0xfa50f080
20971                           switch (instr & 0x000f0000) {
20972                             case 0x000f0000: {
20973                               // 0xfa5ff080
20974                               unsigned rd = (instr >> 8) & 0xf;
20975                               unsigned rm = instr & 0xf;
20976                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
20977                               if ((amount == 0) &&
20978                                   ((rd < kNumberOfT32LowRegisters) &&
20979                                    (rm < kNumberOfT32LowRegisters))) {
20980                                 // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
20981                                 uxtb(CurrentCond(),
20982                                      Wide,
20983                                      Register(rd),
20984                                      Register(rm));
20985                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
20986                                   UnpredictableT32(instr);
20987                                 }
20988                               } else {
20989                                 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
20990                                 uxtb(CurrentCond(),
20991                                      Best,
20992                                      Register(rd),
20993                                      Operand(Register(rm), ROR, amount));
20994                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
20995                                   UnpredictableT32(instr);
20996                                 }
20997                               }
20998                               break;
20999                             }
21000                             default: {
21001                               if (((instr & 0xf0000) == 0xf0000)) {
21002                                 UnallocatedT32(instr);
21003                                 return;
21004                               }
21005                               unsigned rd = (instr >> 8) & 0xf;
21006                               unsigned rn = (instr >> 16) & 0xf;
21007                               unsigned rm = instr & 0xf;
21008                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
21009                               // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
21010                               uxtab(CurrentCond(),
21011                                     Register(rd),
21012                                     Register(rn),
21013                                     Operand(Register(rm), ROR, amount));
21014                               if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
21015                                 UnpredictableT32(instr);
21016                               }
21017                               break;
21018                             }
21019                           }
21020                           break;
21021                         }
21022                         default:
21023                           UnallocatedT32(instr);
21024                           break;
21025                       }
21026                       break;
21027                     }
21028                     default:
21029                       UnallocatedT32(instr);
21030                       break;
21031                   }
21032                   break;
21033                 }
21034                 case 0x10800000: {
21035                   // 0xfa800000
21036                   switch (instr & 0x0060f0f0) {
21037                     case 0x0000f000: {
21038                       // 0xfa80f000
21039                       unsigned rd = (instr >> 8) & 0xf;
21040                       unsigned rn = (instr >> 16) & 0xf;
21041                       unsigned rm = instr & 0xf;
21042                       // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21043                       sadd8(CurrentCond(),
21044                             Register(rd),
21045                             Register(rn),
21046                             Register(rm));
21047                       break;
21048                     }
21049                     case 0x0000f010: {
21050                       // 0xfa80f010
21051                       unsigned rd = (instr >> 8) & 0xf;
21052                       unsigned rn = (instr >> 16) & 0xf;
21053                       unsigned rm = instr & 0xf;
21054                       // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21055                       qadd8(CurrentCond(),
21056                             Register(rd),
21057                             Register(rn),
21058                             Register(rm));
21059                       break;
21060                     }
21061                     case 0x0000f020: {
21062                       // 0xfa80f020
21063                       unsigned rd = (instr >> 8) & 0xf;
21064                       unsigned rn = (instr >> 16) & 0xf;
21065                       unsigned rm = instr & 0xf;
21066                       // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21067                       shadd8(CurrentCond(),
21068                              Register(rd),
21069                              Register(rn),
21070                              Register(rm));
21071                       break;
21072                     }
21073                     case 0x0000f040: {
21074                       // 0xfa80f040
21075                       unsigned rd = (instr >> 8) & 0xf;
21076                       unsigned rn = (instr >> 16) & 0xf;
21077                       unsigned rm = instr & 0xf;
21078                       // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21079                       uadd8(CurrentCond(),
21080                             Register(rd),
21081                             Register(rn),
21082                             Register(rm));
21083                       break;
21084                     }
21085                     case 0x0000f050: {
21086                       // 0xfa80f050
21087                       unsigned rd = (instr >> 8) & 0xf;
21088                       unsigned rn = (instr >> 16) & 0xf;
21089                       unsigned rm = instr & 0xf;
21090                       // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21091                       uqadd8(CurrentCond(),
21092                              Register(rd),
21093                              Register(rn),
21094                              Register(rm));
21095                       break;
21096                     }
21097                     case 0x0000f060: {
21098                       // 0xfa80f060
21099                       unsigned rd = (instr >> 8) & 0xf;
21100                       unsigned rn = (instr >> 16) & 0xf;
21101                       unsigned rm = instr & 0xf;
21102                       // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21103                       uhadd8(CurrentCond(),
21104                              Register(rd),
21105                              Register(rn),
21106                              Register(rm));
21107                       break;
21108                     }
21109                     case 0x0000f080: {
21110                       // 0xfa80f080
21111                       unsigned rd = (instr >> 8) & 0xf;
21112                       unsigned rm = instr & 0xf;
21113                       unsigned rn = (instr >> 16) & 0xf;
21114                       // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21115                       qadd(CurrentCond(),
21116                            Register(rd),
21117                            Register(rm),
21118                            Register(rn));
21119                       break;
21120                     }
21121                     case 0x0000f090: {
21122                       // 0xfa80f090
21123                       unsigned rd = (instr >> 8) & 0xf;
21124                       unsigned rm = instr & 0xf;
21125                       unsigned rn = (instr >> 16) & 0xf;
21126                       // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21127                       qdadd(CurrentCond(),
21128                             Register(rd),
21129                             Register(rm),
21130                             Register(rn));
21131                       break;
21132                     }
21133                     case 0x0000f0a0: {
21134                       // 0xfa80f0a0
21135                       unsigned rd = (instr >> 8) & 0xf;
21136                       unsigned rm = instr & 0xf;
21137                       unsigned rn = (instr >> 16) & 0xf;
21138                       // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21139                       qsub(CurrentCond(),
21140                            Register(rd),
21141                            Register(rm),
21142                            Register(rn));
21143                       break;
21144                     }
21145                     case 0x0000f0b0: {
21146                       // 0xfa80f0b0
21147                       unsigned rd = (instr >> 8) & 0xf;
21148                       unsigned rm = instr & 0xf;
21149                       unsigned rn = (instr >> 16) & 0xf;
21150                       // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
21151                       qdsub(CurrentCond(),
21152                             Register(rd),
21153                             Register(rm),
21154                             Register(rn));
21155                       break;
21156                     }
21157                     case 0x0020f000: {
21158                       // 0xfaa0f000
21159                       unsigned rd = (instr >> 8) & 0xf;
21160                       unsigned rn = (instr >> 16) & 0xf;
21161                       unsigned rm = instr & 0xf;
21162                       // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21163                       sasx(CurrentCond(),
21164                            Register(rd),
21165                            Register(rn),
21166                            Register(rm));
21167                       break;
21168                     }
21169                     case 0x0020f010: {
21170                       // 0xfaa0f010
21171                       unsigned rd = (instr >> 8) & 0xf;
21172                       unsigned rn = (instr >> 16) & 0xf;
21173                       unsigned rm = instr & 0xf;
21174                       // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21175                       qasx(CurrentCond(),
21176                            Register(rd),
21177                            Register(rn),
21178                            Register(rm));
21179                       break;
21180                     }
21181                     case 0x0020f020: {
21182                       // 0xfaa0f020
21183                       unsigned rd = (instr >> 8) & 0xf;
21184                       unsigned rn = (instr >> 16) & 0xf;
21185                       unsigned rm = instr & 0xf;
21186                       // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21187                       shasx(CurrentCond(),
21188                             Register(rd),
21189                             Register(rn),
21190                             Register(rm));
21191                       break;
21192                     }
21193                     case 0x0020f040: {
21194                       // 0xfaa0f040
21195                       unsigned rd = (instr >> 8) & 0xf;
21196                       unsigned rn = (instr >> 16) & 0xf;
21197                       unsigned rm = instr & 0xf;
21198                       // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21199                       uasx(CurrentCond(),
21200                            Register(rd),
21201                            Register(rn),
21202                            Register(rm));
21203                       break;
21204                     }
21205                     case 0x0020f050: {
21206                       // 0xfaa0f050
21207                       unsigned rd = (instr >> 8) & 0xf;
21208                       unsigned rn = (instr >> 16) & 0xf;
21209                       unsigned rm = instr & 0xf;
21210                       // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21211                       uqasx(CurrentCond(),
21212                             Register(rd),
21213                             Register(rn),
21214                             Register(rm));
21215                       break;
21216                     }
21217                     case 0x0020f060: {
21218                       // 0xfaa0f060
21219                       unsigned rd = (instr >> 8) & 0xf;
21220                       unsigned rn = (instr >> 16) & 0xf;
21221                       unsigned rm = instr & 0xf;
21222                       // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21223                       uhasx(CurrentCond(),
21224                             Register(rd),
21225                             Register(rn),
21226                             Register(rm));
21227                       break;
21228                     }
21229                     case 0x0020f080: {
21230                       // 0xfaa0f080
21231                       unsigned rd = (instr >> 8) & 0xf;
21232                       unsigned rn = (instr >> 16) & 0xf;
21233                       unsigned rm = instr & 0xf;
21234                       // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21235                       sel(CurrentCond(),
21236                           Register(rd),
21237                           Register(rn),
21238                           Register(rm));
21239                       break;
21240                     }
21241                     case 0x0040f000: {
21242                       // 0xfac0f000
21243                       unsigned rd = (instr >> 8) & 0xf;
21244                       unsigned rn = (instr >> 16) & 0xf;
21245                       unsigned rm = instr & 0xf;
21246                       // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21247                       ssub8(CurrentCond(),
21248                             Register(rd),
21249                             Register(rn),
21250                             Register(rm));
21251                       break;
21252                     }
21253                     case 0x0040f010: {
21254                       // 0xfac0f010
21255                       unsigned rd = (instr >> 8) & 0xf;
21256                       unsigned rn = (instr >> 16) & 0xf;
21257                       unsigned rm = instr & 0xf;
21258                       // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21259                       qsub8(CurrentCond(),
21260                             Register(rd),
21261                             Register(rn),
21262                             Register(rm));
21263                       break;
21264                     }
21265                     case 0x0040f020: {
21266                       // 0xfac0f020
21267                       unsigned rd = (instr >> 8) & 0xf;
21268                       unsigned rn = (instr >> 16) & 0xf;
21269                       unsigned rm = instr & 0xf;
21270                       // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21271                       shsub8(CurrentCond(),
21272                              Register(rd),
21273                              Register(rn),
21274                              Register(rm));
21275                       break;
21276                     }
21277                     case 0x0040f040: {
21278                       // 0xfac0f040
21279                       unsigned rd = (instr >> 8) & 0xf;
21280                       unsigned rn = (instr >> 16) & 0xf;
21281                       unsigned rm = instr & 0xf;
21282                       // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21283                       usub8(CurrentCond(),
21284                             Register(rd),
21285                             Register(rn),
21286                             Register(rm));
21287                       break;
21288                     }
21289                     case 0x0040f050: {
21290                       // 0xfac0f050
21291                       unsigned rd = (instr >> 8) & 0xf;
21292                       unsigned rn = (instr >> 16) & 0xf;
21293                       unsigned rm = instr & 0xf;
21294                       // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21295                       uqsub8(CurrentCond(),
21296                              Register(rd),
21297                              Register(rn),
21298                              Register(rm));
21299                       break;
21300                     }
21301                     case 0x0040f060: {
21302                       // 0xfac0f060
21303                       unsigned rd = (instr >> 8) & 0xf;
21304                       unsigned rn = (instr >> 16) & 0xf;
21305                       unsigned rm = instr & 0xf;
21306                       // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21307                       uhsub8(CurrentCond(),
21308                              Register(rd),
21309                              Register(rn),
21310                              Register(rm));
21311                       break;
21312                     }
21313                     case 0x0040f080: {
21314                       // 0xfac0f080
21315                       unsigned rd = (instr >> 8) & 0xf;
21316                       unsigned rn = (instr >> 16) & 0xf;
21317                       unsigned rm = instr & 0xf;
21318                       // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
21319                       crc32b(Condition::None(),
21320                              Register(rd),
21321                              Register(rn),
21322                              Register(rm));
21323                       break;
21324                     }
21325                     case 0x0040f090: {
21326                       // 0xfac0f090
21327                       unsigned rd = (instr >> 8) & 0xf;
21328                       unsigned rn = (instr >> 16) & 0xf;
21329                       unsigned rm = instr & 0xf;
21330                       // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
21331                       crc32h(Condition::None(),
21332                              Register(rd),
21333                              Register(rn),
21334                              Register(rm));
21335                       break;
21336                     }
21337                     case 0x0040f0a0: {
21338                       // 0xfac0f0a0
21339                       unsigned rd = (instr >> 8) & 0xf;
21340                       unsigned rn = (instr >> 16) & 0xf;
21341                       unsigned rm = instr & 0xf;
21342                       // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
21343                       crc32w(Condition::None(),
21344                              Register(rd),
21345                              Register(rn),
21346                              Register(rm));
21347                       break;
21348                     }
21349                     case 0x0060f000: {
21350                       // 0xfae0f000
21351                       unsigned rd = (instr >> 8) & 0xf;
21352                       unsigned rn = (instr >> 16) & 0xf;
21353                       unsigned rm = instr & 0xf;
21354                       // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21355                       ssax(CurrentCond(),
21356                            Register(rd),
21357                            Register(rn),
21358                            Register(rm));
21359                       break;
21360                     }
21361                     case 0x0060f010: {
21362                       // 0xfae0f010
21363                       unsigned rd = (instr >> 8) & 0xf;
21364                       unsigned rn = (instr >> 16) & 0xf;
21365                       unsigned rm = instr & 0xf;
21366                       // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21367                       qsax(CurrentCond(),
21368                            Register(rd),
21369                            Register(rn),
21370                            Register(rm));
21371                       break;
21372                     }
21373                     case 0x0060f020: {
21374                       // 0xfae0f020
21375                       unsigned rd = (instr >> 8) & 0xf;
21376                       unsigned rn = (instr >> 16) & 0xf;
21377                       unsigned rm = instr & 0xf;
21378                       // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21379                       shsax(CurrentCond(),
21380                             Register(rd),
21381                             Register(rn),
21382                             Register(rm));
21383                       break;
21384                     }
21385                     case 0x0060f040: {
21386                       // 0xfae0f040
21387                       unsigned rd = (instr >> 8) & 0xf;
21388                       unsigned rn = (instr >> 16) & 0xf;
21389                       unsigned rm = instr & 0xf;
21390                       // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21391                       usax(CurrentCond(),
21392                            Register(rd),
21393                            Register(rn),
21394                            Register(rm));
21395                       break;
21396                     }
21397                     case 0x0060f050: {
21398                       // 0xfae0f050
21399                       unsigned rd = (instr >> 8) & 0xf;
21400                       unsigned rn = (instr >> 16) & 0xf;
21401                       unsigned rm = instr & 0xf;
21402                       // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21403                       uqsax(CurrentCond(),
21404                             Register(rd),
21405                             Register(rn),
21406                             Register(rm));
21407                       break;
21408                     }
21409                     case 0x0060f060: {
21410                       // 0xfae0f060
21411                       unsigned rd = (instr >> 8) & 0xf;
21412                       unsigned rn = (instr >> 16) & 0xf;
21413                       unsigned rm = instr & 0xf;
21414                       // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21415                       uhsax(CurrentCond(),
21416                             Register(rd),
21417                             Register(rn),
21418                             Register(rm));
21419                       break;
21420                     }
21421                     default:
21422                       UnallocatedT32(instr);
21423                       break;
21424                   }
21425                   break;
21426                 }
21427                 case 0x10900000: {
21428                   // 0xfa900000
21429                   switch (instr & 0x0060f0f0) {
21430                     case 0x0000f000: {
21431                       // 0xfa90f000
21432                       unsigned rd = (instr >> 8) & 0xf;
21433                       unsigned rn = (instr >> 16) & 0xf;
21434                       unsigned rm = instr & 0xf;
21435                       // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21436                       sadd16(CurrentCond(),
21437                              Register(rd),
21438                              Register(rn),
21439                              Register(rm));
21440                       break;
21441                     }
21442                     case 0x0000f010: {
21443                       // 0xfa90f010
21444                       unsigned rd = (instr >> 8) & 0xf;
21445                       unsigned rn = (instr >> 16) & 0xf;
21446                       unsigned rm = instr & 0xf;
21447                       // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21448                       qadd16(CurrentCond(),
21449                              Register(rd),
21450                              Register(rn),
21451                              Register(rm));
21452                       break;
21453                     }
21454                     case 0x0000f020: {
21455                       // 0xfa90f020
21456                       unsigned rd = (instr >> 8) & 0xf;
21457                       unsigned rn = (instr >> 16) & 0xf;
21458                       unsigned rm = instr & 0xf;
21459                       // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21460                       shadd16(CurrentCond(),
21461                               Register(rd),
21462                               Register(rn),
21463                               Register(rm));
21464                       break;
21465                     }
21466                     case 0x0000f040: {
21467                       // 0xfa90f040
21468                       unsigned rd = (instr >> 8) & 0xf;
21469                       unsigned rn = (instr >> 16) & 0xf;
21470                       unsigned rm = instr & 0xf;
21471                       // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21472                       uadd16(CurrentCond(),
21473                              Register(rd),
21474                              Register(rn),
21475                              Register(rm));
21476                       break;
21477                     }
21478                     case 0x0000f050: {
21479                       // 0xfa90f050
21480                       unsigned rd = (instr >> 8) & 0xf;
21481                       unsigned rn = (instr >> 16) & 0xf;
21482                       unsigned rm = instr & 0xf;
21483                       // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21484                       uqadd16(CurrentCond(),
21485                               Register(rd),
21486                               Register(rn),
21487                               Register(rm));
21488                       break;
21489                     }
21490                     case 0x0000f060: {
21491                       // 0xfa90f060
21492                       unsigned rd = (instr >> 8) & 0xf;
21493                       unsigned rn = (instr >> 16) & 0xf;
21494                       unsigned rm = instr & 0xf;
21495                       // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21496                       uhadd16(CurrentCond(),
21497                               Register(rd),
21498                               Register(rn),
21499                               Register(rm));
21500                       break;
21501                     }
21502                     case 0x0000f080: {
21503                       // 0xfa90f080
21504                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21505                         unsigned rd = (instr >> 8) & 0xf;
21506                         unsigned rm = instr & 0xf;
21507                         if ((rd < kNumberOfT32LowRegisters) &&
21508                             (rm < kNumberOfT32LowRegisters)) {
21509                           // REV{<c>}.W <Rd>, <Rm> ; T2
21510                           rev(CurrentCond(), Wide, Register(rd), Register(rm));
21511                         } else {
21512                           // REV{<c>}{<q>} <Rd>, <Rm> ; T2
21513                           rev(CurrentCond(), Best, Register(rd), Register(rm));
21514                         }
21515                       } else {
21516                         UnallocatedT32(instr);
21517                       }
21518                       break;
21519                     }
21520                     case 0x0000f090: {
21521                       // 0xfa90f090
21522                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21523                         unsigned rd = (instr >> 8) & 0xf;
21524                         unsigned rm = instr & 0xf;
21525                         if ((rd < kNumberOfT32LowRegisters) &&
21526                             (rm < kNumberOfT32LowRegisters)) {
21527                           // REV16{<c>}.W <Rd>, <Rm> ; T2
21528                           rev16(CurrentCond(),
21529                                 Wide,
21530                                 Register(rd),
21531                                 Register(rm));
21532                         } else {
21533                           // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
21534                           rev16(CurrentCond(),
21535                                 Best,
21536                                 Register(rd),
21537                                 Register(rm));
21538                         }
21539                       } else {
21540                         UnallocatedT32(instr);
21541                       }
21542                       break;
21543                     }
21544                     case 0x0000f0a0: {
21545                       // 0xfa90f0a0
21546                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21547                         unsigned rd = (instr >> 8) & 0xf;
21548                         unsigned rm = instr & 0xf;
21549                         // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
21550                         rbit(CurrentCond(), Register(rd), Register(rm));
21551                       } else {
21552                         UnallocatedT32(instr);
21553                       }
21554                       break;
21555                     }
21556                     case 0x0000f0b0: {
21557                       // 0xfa90f0b0
21558                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21559                         unsigned rd = (instr >> 8) & 0xf;
21560                         unsigned rm = instr & 0xf;
21561                         if ((rd < kNumberOfT32LowRegisters) &&
21562                             (rm < kNumberOfT32LowRegisters)) {
21563                           // REVSH{<c>}.W <Rd>, <Rm> ; T2
21564                           revsh(CurrentCond(),
21565                                 Wide,
21566                                 Register(rd),
21567                                 Register(rm));
21568                         } else {
21569                           // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
21570                           revsh(CurrentCond(),
21571                                 Best,
21572                                 Register(rd),
21573                                 Register(rm));
21574                         }
21575                       } else {
21576                         UnallocatedT32(instr);
21577                       }
21578                       break;
21579                     }
21580                     case 0x0020f080: {
21581                       // 0xfab0f080
21582                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
21583                         unsigned rd = (instr >> 8) & 0xf;
21584                         unsigned rm = instr & 0xf;
21585                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
21586                         clz(CurrentCond(), Register(rd), Register(rm));
21587                       } else {
21588                         UnallocatedT32(instr);
21589                       }
21590                       break;
21591                     }
21592                     case 0x0040f000: {
21593                       // 0xfad0f000
21594                       unsigned rd = (instr >> 8) & 0xf;
21595                       unsigned rn = (instr >> 16) & 0xf;
21596                       unsigned rm = instr & 0xf;
21597                       // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21598                       ssub16(CurrentCond(),
21599                              Register(rd),
21600                              Register(rn),
21601                              Register(rm));
21602                       break;
21603                     }
21604                     case 0x0040f010: {
21605                       // 0xfad0f010
21606                       unsigned rd = (instr >> 8) & 0xf;
21607                       unsigned rn = (instr >> 16) & 0xf;
21608                       unsigned rm = instr & 0xf;
21609                       // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21610                       qsub16(CurrentCond(),
21611                              Register(rd),
21612                              Register(rn),
21613                              Register(rm));
21614                       break;
21615                     }
21616                     case 0x0040f020: {
21617                       // 0xfad0f020
21618                       unsigned rd = (instr >> 8) & 0xf;
21619                       unsigned rn = (instr >> 16) & 0xf;
21620                       unsigned rm = instr & 0xf;
21621                       // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21622                       shsub16(CurrentCond(),
21623                               Register(rd),
21624                               Register(rn),
21625                               Register(rm));
21626                       break;
21627                     }
21628                     case 0x0040f040: {
21629                       // 0xfad0f040
21630                       unsigned rd = (instr >> 8) & 0xf;
21631                       unsigned rn = (instr >> 16) & 0xf;
21632                       unsigned rm = instr & 0xf;
21633                       // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21634                       usub16(CurrentCond(),
21635                              Register(rd),
21636                              Register(rn),
21637                              Register(rm));
21638                       break;
21639                     }
21640                     case 0x0040f050: {
21641                       // 0xfad0f050
21642                       unsigned rd = (instr >> 8) & 0xf;
21643                       unsigned rn = (instr >> 16) & 0xf;
21644                       unsigned rm = instr & 0xf;
21645                       // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21646                       uqsub16(CurrentCond(),
21647                               Register(rd),
21648                               Register(rn),
21649                               Register(rm));
21650                       break;
21651                     }
21652                     case 0x0040f060: {
21653                       // 0xfad0f060
21654                       unsigned rd = (instr >> 8) & 0xf;
21655                       unsigned rn = (instr >> 16) & 0xf;
21656                       unsigned rm = instr & 0xf;
21657                       // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21658                       uhsub16(CurrentCond(),
21659                               Register(rd),
21660                               Register(rn),
21661                               Register(rm));
21662                       break;
21663                     }
21664                     case 0x0040f080: {
21665                       // 0xfad0f080
21666                       unsigned rd = (instr >> 8) & 0xf;
21667                       unsigned rn = (instr >> 16) & 0xf;
21668                       unsigned rm = instr & 0xf;
21669                       // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
21670                       crc32cb(Condition::None(),
21671                               Register(rd),
21672                               Register(rn),
21673                               Register(rm));
21674                       break;
21675                     }
21676                     case 0x0040f090: {
21677                       // 0xfad0f090
21678                       unsigned rd = (instr >> 8) & 0xf;
21679                       unsigned rn = (instr >> 16) & 0xf;
21680                       unsigned rm = instr & 0xf;
21681                       // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
21682                       crc32ch(Condition::None(),
21683                               Register(rd),
21684                               Register(rn),
21685                               Register(rm));
21686                       break;
21687                     }
21688                     case 0x0040f0a0: {
21689                       // 0xfad0f0a0
21690                       unsigned rd = (instr >> 8) & 0xf;
21691                       unsigned rn = (instr >> 16) & 0xf;
21692                       unsigned rm = instr & 0xf;
21693                       // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
21694                       crc32cw(Condition::None(),
21695                               Register(rd),
21696                               Register(rn),
21697                               Register(rm));
21698                       break;
21699                     }
21700                     default:
21701                       UnallocatedT32(instr);
21702                       break;
21703                   }
21704                   break;
21705                 }
21706                 case 0x11000000: {
21707                   // 0xfb000000
21708                   switch (instr & 0x006000f0) {
21709                     case 0x00000000: {
21710                       // 0xfb000000
21711                       switch (instr & 0x0000f000) {
21712                         case 0x0000f000: {
21713                           // 0xfb00f000
21714                           unsigned rd = (instr >> 8) & 0xf;
21715                           unsigned rn = (instr >> 16) & 0xf;
21716                           unsigned rm = instr & 0xf;
21717                           if (InITBlock() &&
21718                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
21719                                (rn < kNumberOfT32LowRegisters))) {
21720                             // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
21721                             mul(CurrentCond(),
21722                                 Wide,
21723                                 Register(rd),
21724                                 Register(rn),
21725                                 Register(rm));
21726                           } else {
21727                             // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
21728                             mul(CurrentCond(),
21729                                 Best,
21730                                 Register(rd),
21731                                 Register(rn),
21732                                 Register(rm));
21733                           }
21734                           break;
21735                         }
21736                         default: {
21737                           if (((instr & 0xf000) == 0xf000)) {
21738                             UnallocatedT32(instr);
21739                             return;
21740                           }
21741                           unsigned rd = (instr >> 8) & 0xf;
21742                           unsigned rn = (instr >> 16) & 0xf;
21743                           unsigned rm = instr & 0xf;
21744                           unsigned ra = (instr >> 12) & 0xf;
21745                           // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21746                           mla(CurrentCond(),
21747                               Register(rd),
21748                               Register(rn),
21749                               Register(rm),
21750                               Register(ra));
21751                           break;
21752                         }
21753                       }
21754                       break;
21755                     }
21756                     case 0x00000010: {
21757                       // 0xfb000010
21758                       unsigned rd = (instr >> 8) & 0xf;
21759                       unsigned rn = (instr >> 16) & 0xf;
21760                       unsigned rm = instr & 0xf;
21761                       unsigned ra = (instr >> 12) & 0xf;
21762                       // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21763                       mls(CurrentCond(),
21764                           Register(rd),
21765                           Register(rn),
21766                           Register(rm),
21767                           Register(ra));
21768                       break;
21769                     }
21770                     case 0x00200000: {
21771                       // 0xfb200000
21772                       switch (instr & 0x0000f000) {
21773                         case 0x0000f000: {
21774                           // 0xfb20f000
21775                           unsigned rd = (instr >> 8) & 0xf;
21776                           unsigned rn = (instr >> 16) & 0xf;
21777                           unsigned rm = instr & 0xf;
21778                           // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21779                           smuad(CurrentCond(),
21780                                 Register(rd),
21781                                 Register(rn),
21782                                 Register(rm));
21783                           break;
21784                         }
21785                         default: {
21786                           if (((instr & 0xf000) == 0xf000)) {
21787                             UnallocatedT32(instr);
21788                             return;
21789                           }
21790                           unsigned rd = (instr >> 8) & 0xf;
21791                           unsigned rn = (instr >> 16) & 0xf;
21792                           unsigned rm = instr & 0xf;
21793                           unsigned ra = (instr >> 12) & 0xf;
21794                           // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21795                           smlad(CurrentCond(),
21796                                 Register(rd),
21797                                 Register(rn),
21798                                 Register(rm),
21799                                 Register(ra));
21800                           break;
21801                         }
21802                       }
21803                       break;
21804                     }
21805                     case 0x00200010: {
21806                       // 0xfb200010
21807                       switch (instr & 0x0000f000) {
21808                         case 0x0000f000: {
21809                           // 0xfb20f010
21810                           unsigned rd = (instr >> 8) & 0xf;
21811                           unsigned rn = (instr >> 16) & 0xf;
21812                           unsigned rm = instr & 0xf;
21813                           // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21814                           smuadx(CurrentCond(),
21815                                  Register(rd),
21816                                  Register(rn),
21817                                  Register(rm));
21818                           break;
21819                         }
21820                         default: {
21821                           if (((instr & 0xf000) == 0xf000)) {
21822                             UnallocatedT32(instr);
21823                             return;
21824                           }
21825                           unsigned rd = (instr >> 8) & 0xf;
21826                           unsigned rn = (instr >> 16) & 0xf;
21827                           unsigned rm = instr & 0xf;
21828                           unsigned ra = (instr >> 12) & 0xf;
21829                           // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21830                           smladx(CurrentCond(),
21831                                  Register(rd),
21832                                  Register(rn),
21833                                  Register(rm),
21834                                  Register(ra));
21835                           break;
21836                         }
21837                       }
21838                       break;
21839                     }
21840                     case 0x00400000: {
21841                       // 0xfb400000
21842                       switch (instr & 0x0000f000) {
21843                         case 0x0000f000: {
21844                           // 0xfb40f000
21845                           unsigned rd = (instr >> 8) & 0xf;
21846                           unsigned rn = (instr >> 16) & 0xf;
21847                           unsigned rm = instr & 0xf;
21848                           // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21849                           smusd(CurrentCond(),
21850                                 Register(rd),
21851                                 Register(rn),
21852                                 Register(rm));
21853                           break;
21854                         }
21855                         default: {
21856                           if (((instr & 0xf000) == 0xf000)) {
21857                             UnallocatedT32(instr);
21858                             return;
21859                           }
21860                           unsigned rd = (instr >> 8) & 0xf;
21861                           unsigned rn = (instr >> 16) & 0xf;
21862                           unsigned rm = instr & 0xf;
21863                           unsigned ra = (instr >> 12) & 0xf;
21864                           // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21865                           smlsd(CurrentCond(),
21866                                 Register(rd),
21867                                 Register(rn),
21868                                 Register(rm),
21869                                 Register(ra));
21870                           break;
21871                         }
21872                       }
21873                       break;
21874                     }
21875                     case 0x00400010: {
21876                       // 0xfb400010
21877                       switch (instr & 0x0000f000) {
21878                         case 0x0000f000: {
21879                           // 0xfb40f010
21880                           unsigned rd = (instr >> 8) & 0xf;
21881                           unsigned rn = (instr >> 16) & 0xf;
21882                           unsigned rm = instr & 0xf;
21883                           // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21884                           smusdx(CurrentCond(),
21885                                  Register(rd),
21886                                  Register(rn),
21887                                  Register(rm));
21888                           break;
21889                         }
21890                         default: {
21891                           if (((instr & 0xf000) == 0xf000)) {
21892                             UnallocatedT32(instr);
21893                             return;
21894                           }
21895                           unsigned rd = (instr >> 8) & 0xf;
21896                           unsigned rn = (instr >> 16) & 0xf;
21897                           unsigned rm = instr & 0xf;
21898                           unsigned ra = (instr >> 12) & 0xf;
21899                           // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21900                           smlsdx(CurrentCond(),
21901                                  Register(rd),
21902                                  Register(rn),
21903                                  Register(rm),
21904                                  Register(ra));
21905                           break;
21906                         }
21907                       }
21908                       break;
21909                     }
21910                     case 0x00600000: {
21911                       // 0xfb600000
21912                       unsigned rd = (instr >> 8) & 0xf;
21913                       unsigned rn = (instr >> 16) & 0xf;
21914                       unsigned rm = instr & 0xf;
21915                       unsigned ra = (instr >> 12) & 0xf;
21916                       // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21917                       smmls(CurrentCond(),
21918                             Register(rd),
21919                             Register(rn),
21920                             Register(rm),
21921                             Register(ra));
21922                       break;
21923                     }
21924                     case 0x00600010: {
21925                       // 0xfb600010
21926                       unsigned rd = (instr >> 8) & 0xf;
21927                       unsigned rn = (instr >> 16) & 0xf;
21928                       unsigned rm = instr & 0xf;
21929                       unsigned ra = (instr >> 12) & 0xf;
21930                       // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21931                       smmlsr(CurrentCond(),
21932                              Register(rd),
21933                              Register(rn),
21934                              Register(rm),
21935                              Register(ra));
21936                       break;
21937                     }
21938                     default:
21939                       UnallocatedT32(instr);
21940                       break;
21941                   }
21942                   break;
21943                 }
21944                 case 0x11100000: {
21945                   // 0xfb100000
21946                   switch (instr & 0x006000f0) {
21947                     case 0x00000000: {
21948                       // 0xfb100000
21949                       switch (instr & 0x0000f000) {
21950                         case 0x0000f000: {
21951                           // 0xfb10f000
21952                           unsigned rd = (instr >> 8) & 0xf;
21953                           unsigned rn = (instr >> 16) & 0xf;
21954                           unsigned rm = instr & 0xf;
21955                           // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21956                           smulbb(CurrentCond(),
21957                                  Register(rd),
21958                                  Register(rn),
21959                                  Register(rm));
21960                           break;
21961                         }
21962                         default: {
21963                           if (((instr & 0xf000) == 0xf000)) {
21964                             UnallocatedT32(instr);
21965                             return;
21966                           }
21967                           unsigned rd = (instr >> 8) & 0xf;
21968                           unsigned rn = (instr >> 16) & 0xf;
21969                           unsigned rm = instr & 0xf;
21970                           unsigned ra = (instr >> 12) & 0xf;
21971                           // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
21972                           smlabb(CurrentCond(),
21973                                  Register(rd),
21974                                  Register(rn),
21975                                  Register(rm),
21976                                  Register(ra));
21977                           break;
21978                         }
21979                       }
21980                       break;
21981                     }
21982                     case 0x00000010: {
21983                       // 0xfb100010
21984                       switch (instr & 0x0000f000) {
21985                         case 0x0000f000: {
21986                           // 0xfb10f010
21987                           unsigned rd = (instr >> 8) & 0xf;
21988                           unsigned rn = (instr >> 16) & 0xf;
21989                           unsigned rm = instr & 0xf;
21990                           // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
21991                           smulbt(CurrentCond(),
21992                                  Register(rd),
21993                                  Register(rn),
21994                                  Register(rm));
21995                           break;
21996                         }
21997                         default: {
21998                           if (((instr & 0xf000) == 0xf000)) {
21999                             UnallocatedT32(instr);
22000                             return;
22001                           }
22002                           unsigned rd = (instr >> 8) & 0xf;
22003                           unsigned rn = (instr >> 16) & 0xf;
22004                           unsigned rm = instr & 0xf;
22005                           unsigned ra = (instr >> 12) & 0xf;
22006                           // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22007                           smlabt(CurrentCond(),
22008                                  Register(rd),
22009                                  Register(rn),
22010                                  Register(rm),
22011                                  Register(ra));
22012                           break;
22013                         }
22014                       }
22015                       break;
22016                     }
22017                     case 0x00000020: {
22018                       // 0xfb100020
22019                       switch (instr & 0x0000f000) {
22020                         case 0x0000f000: {
22021                           // 0xfb10f020
22022                           unsigned rd = (instr >> 8) & 0xf;
22023                           unsigned rn = (instr >> 16) & 0xf;
22024                           unsigned rm = instr & 0xf;
22025                           // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22026                           smultb(CurrentCond(),
22027                                  Register(rd),
22028                                  Register(rn),
22029                                  Register(rm));
22030                           break;
22031                         }
22032                         default: {
22033                           if (((instr & 0xf000) == 0xf000)) {
22034                             UnallocatedT32(instr);
22035                             return;
22036                           }
22037                           unsigned rd = (instr >> 8) & 0xf;
22038                           unsigned rn = (instr >> 16) & 0xf;
22039                           unsigned rm = instr & 0xf;
22040                           unsigned ra = (instr >> 12) & 0xf;
22041                           // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22042                           smlatb(CurrentCond(),
22043                                  Register(rd),
22044                                  Register(rn),
22045                                  Register(rm),
22046                                  Register(ra));
22047                           break;
22048                         }
22049                       }
22050                       break;
22051                     }
22052                     case 0x00000030: {
22053                       // 0xfb100030
22054                       switch (instr & 0x0000f000) {
22055                         case 0x0000f000: {
22056                           // 0xfb10f030
22057                           unsigned rd = (instr >> 8) & 0xf;
22058                           unsigned rn = (instr >> 16) & 0xf;
22059                           unsigned rm = instr & 0xf;
22060                           // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22061                           smultt(CurrentCond(),
22062                                  Register(rd),
22063                                  Register(rn),
22064                                  Register(rm));
22065                           break;
22066                         }
22067                         default: {
22068                           if (((instr & 0xf000) == 0xf000)) {
22069                             UnallocatedT32(instr);
22070                             return;
22071                           }
22072                           unsigned rd = (instr >> 8) & 0xf;
22073                           unsigned rn = (instr >> 16) & 0xf;
22074                           unsigned rm = instr & 0xf;
22075                           unsigned ra = (instr >> 12) & 0xf;
22076                           // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22077                           smlatt(CurrentCond(),
22078                                  Register(rd),
22079                                  Register(rn),
22080                                  Register(rm),
22081                                  Register(ra));
22082                           break;
22083                         }
22084                       }
22085                       break;
22086                     }
22087                     case 0x00200000: {
22088                       // 0xfb300000
22089                       switch (instr & 0x0000f000) {
22090                         case 0x0000f000: {
22091                           // 0xfb30f000
22092                           unsigned rd = (instr >> 8) & 0xf;
22093                           unsigned rn = (instr >> 16) & 0xf;
22094                           unsigned rm = instr & 0xf;
22095                           // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22096                           smulwb(CurrentCond(),
22097                                  Register(rd),
22098                                  Register(rn),
22099                                  Register(rm));
22100                           break;
22101                         }
22102                         default: {
22103                           if (((instr & 0xf000) == 0xf000)) {
22104                             UnallocatedT32(instr);
22105                             return;
22106                           }
22107                           unsigned rd = (instr >> 8) & 0xf;
22108                           unsigned rn = (instr >> 16) & 0xf;
22109                           unsigned rm = instr & 0xf;
22110                           unsigned ra = (instr >> 12) & 0xf;
22111                           // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22112                           smlawb(CurrentCond(),
22113                                  Register(rd),
22114                                  Register(rn),
22115                                  Register(rm),
22116                                  Register(ra));
22117                           break;
22118                         }
22119                       }
22120                       break;
22121                     }
22122                     case 0x00200010: {
22123                       // 0xfb300010
22124                       switch (instr & 0x0000f000) {
22125                         case 0x0000f000: {
22126                           // 0xfb30f010
22127                           unsigned rd = (instr >> 8) & 0xf;
22128                           unsigned rn = (instr >> 16) & 0xf;
22129                           unsigned rm = instr & 0xf;
22130                           // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22131                           smulwt(CurrentCond(),
22132                                  Register(rd),
22133                                  Register(rn),
22134                                  Register(rm));
22135                           break;
22136                         }
22137                         default: {
22138                           if (((instr & 0xf000) == 0xf000)) {
22139                             UnallocatedT32(instr);
22140                             return;
22141                           }
22142                           unsigned rd = (instr >> 8) & 0xf;
22143                           unsigned rn = (instr >> 16) & 0xf;
22144                           unsigned rm = instr & 0xf;
22145                           unsigned ra = (instr >> 12) & 0xf;
22146                           // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22147                           smlawt(CurrentCond(),
22148                                  Register(rd),
22149                                  Register(rn),
22150                                  Register(rm),
22151                                  Register(ra));
22152                           break;
22153                         }
22154                       }
22155                       break;
22156                     }
22157                     case 0x00400000: {
22158                       // 0xfb500000
22159                       switch (instr & 0x0000f000) {
22160                         case 0x0000f000: {
22161                           // 0xfb50f000
22162                           unsigned rd = (instr >> 8) & 0xf;
22163                           unsigned rn = (instr >> 16) & 0xf;
22164                           unsigned rm = instr & 0xf;
22165                           // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22166                           smmul(CurrentCond(),
22167                                 Register(rd),
22168                                 Register(rn),
22169                                 Register(rm));
22170                           break;
22171                         }
22172                         default: {
22173                           if (((instr & 0xf000) == 0xf000)) {
22174                             UnallocatedT32(instr);
22175                             return;
22176                           }
22177                           unsigned rd = (instr >> 8) & 0xf;
22178                           unsigned rn = (instr >> 16) & 0xf;
22179                           unsigned rm = instr & 0xf;
22180                           unsigned ra = (instr >> 12) & 0xf;
22181                           // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22182                           smmla(CurrentCond(),
22183                                 Register(rd),
22184                                 Register(rn),
22185                                 Register(rm),
22186                                 Register(ra));
22187                           break;
22188                         }
22189                       }
22190                       break;
22191                     }
22192                     case 0x00400010: {
22193                       // 0xfb500010
22194                       switch (instr & 0x0000f000) {
22195                         case 0x0000f000: {
22196                           // 0xfb50f010
22197                           unsigned rd = (instr >> 8) & 0xf;
22198                           unsigned rn = (instr >> 16) & 0xf;
22199                           unsigned rm = instr & 0xf;
22200                           // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22201                           smmulr(CurrentCond(),
22202                                  Register(rd),
22203                                  Register(rn),
22204                                  Register(rm));
22205                           break;
22206                         }
22207                         default: {
22208                           if (((instr & 0xf000) == 0xf000)) {
22209                             UnallocatedT32(instr);
22210                             return;
22211                           }
22212                           unsigned rd = (instr >> 8) & 0xf;
22213                           unsigned rn = (instr >> 16) & 0xf;
22214                           unsigned rm = instr & 0xf;
22215                           unsigned ra = (instr >> 12) & 0xf;
22216                           // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22217                           smmlar(CurrentCond(),
22218                                  Register(rd),
22219                                  Register(rn),
22220                                  Register(rm),
22221                                  Register(ra));
22222                           break;
22223                         }
22224                       }
22225                       break;
22226                     }
22227                     case 0x00600000: {
22228                       // 0xfb700000
22229                       switch (instr & 0x0000f000) {
22230                         case 0x0000f000: {
22231                           // 0xfb70f000
22232                           unsigned rd = (instr >> 8) & 0xf;
22233                           unsigned rn = (instr >> 16) & 0xf;
22234                           unsigned rm = instr & 0xf;
22235                           // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22236                           usad8(CurrentCond(),
22237                                 Register(rd),
22238                                 Register(rn),
22239                                 Register(rm));
22240                           break;
22241                         }
22242                         default: {
22243                           if (((instr & 0xf000) == 0xf000)) {
22244                             UnallocatedT32(instr);
22245                             return;
22246                           }
22247                           unsigned rd = (instr >> 8) & 0xf;
22248                           unsigned rn = (instr >> 16) & 0xf;
22249                           unsigned rm = instr & 0xf;
22250                           unsigned ra = (instr >> 12) & 0xf;
22251                           // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
22252                           usada8(CurrentCond(),
22253                                  Register(rd),
22254                                  Register(rn),
22255                                  Register(rm),
22256                                  Register(ra));
22257                           break;
22258                         }
22259                       }
22260                       break;
22261                     }
22262                     default:
22263                       UnallocatedT32(instr);
22264                       break;
22265                   }
22266                   break;
22267                 }
22268                 case 0x11800000: {
22269                   // 0xfb800000
22270                   switch (instr & 0x006000f0) {
22271                     case 0x00000000: {
22272                       // 0xfb800000
22273                       unsigned rdlo = (instr >> 12) & 0xf;
22274                       unsigned rdhi = (instr >> 8) & 0xf;
22275                       unsigned rn = (instr >> 16) & 0xf;
22276                       unsigned rm = instr & 0xf;
22277                       // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22278                       smull(CurrentCond(),
22279                             Register(rdlo),
22280                             Register(rdhi),
22281                             Register(rn),
22282                             Register(rm));
22283                       break;
22284                     }
22285                     case 0x00200000: {
22286                       // 0xfba00000
22287                       unsigned rdlo = (instr >> 12) & 0xf;
22288                       unsigned rdhi = (instr >> 8) & 0xf;
22289                       unsigned rn = (instr >> 16) & 0xf;
22290                       unsigned rm = instr & 0xf;
22291                       // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22292                       umull(CurrentCond(),
22293                             Register(rdlo),
22294                             Register(rdhi),
22295                             Register(rn),
22296                             Register(rm));
22297                       break;
22298                     }
22299                     case 0x00400000: {
22300                       // 0xfbc00000
22301                       unsigned rdlo = (instr >> 12) & 0xf;
22302                       unsigned rdhi = (instr >> 8) & 0xf;
22303                       unsigned rn = (instr >> 16) & 0xf;
22304                       unsigned rm = instr & 0xf;
22305                       // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22306                       smlal(CurrentCond(),
22307                             Register(rdlo),
22308                             Register(rdhi),
22309                             Register(rn),
22310                             Register(rm));
22311                       break;
22312                     }
22313                     case 0x00400080: {
22314                       // 0xfbc00080
22315                       unsigned rdlo = (instr >> 12) & 0xf;
22316                       unsigned rdhi = (instr >> 8) & 0xf;
22317                       unsigned rn = (instr >> 16) & 0xf;
22318                       unsigned rm = instr & 0xf;
22319                       // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22320                       smlalbb(CurrentCond(),
22321                               Register(rdlo),
22322                               Register(rdhi),
22323                               Register(rn),
22324                               Register(rm));
22325                       break;
22326                     }
22327                     case 0x00400090: {
22328                       // 0xfbc00090
22329                       unsigned rdlo = (instr >> 12) & 0xf;
22330                       unsigned rdhi = (instr >> 8) & 0xf;
22331                       unsigned rn = (instr >> 16) & 0xf;
22332                       unsigned rm = instr & 0xf;
22333                       // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22334                       smlalbt(CurrentCond(),
22335                               Register(rdlo),
22336                               Register(rdhi),
22337                               Register(rn),
22338                               Register(rm));
22339                       break;
22340                     }
22341                     case 0x004000a0: {
22342                       // 0xfbc000a0
22343                       unsigned rdlo = (instr >> 12) & 0xf;
22344                       unsigned rdhi = (instr >> 8) & 0xf;
22345                       unsigned rn = (instr >> 16) & 0xf;
22346                       unsigned rm = instr & 0xf;
22347                       // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22348                       smlaltb(CurrentCond(),
22349                               Register(rdlo),
22350                               Register(rdhi),
22351                               Register(rn),
22352                               Register(rm));
22353                       break;
22354                     }
22355                     case 0x004000b0: {
22356                       // 0xfbc000b0
22357                       unsigned rdlo = (instr >> 12) & 0xf;
22358                       unsigned rdhi = (instr >> 8) & 0xf;
22359                       unsigned rn = (instr >> 16) & 0xf;
22360                       unsigned rm = instr & 0xf;
22361                       // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22362                       smlaltt(CurrentCond(),
22363                               Register(rdlo),
22364                               Register(rdhi),
22365                               Register(rn),
22366                               Register(rm));
22367                       break;
22368                     }
22369                     case 0x004000c0: {
22370                       // 0xfbc000c0
22371                       unsigned rdlo = (instr >> 12) & 0xf;
22372                       unsigned rdhi = (instr >> 8) & 0xf;
22373                       unsigned rn = (instr >> 16) & 0xf;
22374                       unsigned rm = instr & 0xf;
22375                       // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22376                       smlald(CurrentCond(),
22377                              Register(rdlo),
22378                              Register(rdhi),
22379                              Register(rn),
22380                              Register(rm));
22381                       break;
22382                     }
22383                     case 0x004000d0: {
22384                       // 0xfbc000d0
22385                       unsigned rdlo = (instr >> 12) & 0xf;
22386                       unsigned rdhi = (instr >> 8) & 0xf;
22387                       unsigned rn = (instr >> 16) & 0xf;
22388                       unsigned rm = instr & 0xf;
22389                       // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22390                       smlaldx(CurrentCond(),
22391                               Register(rdlo),
22392                               Register(rdhi),
22393                               Register(rn),
22394                               Register(rm));
22395                       break;
22396                     }
22397                     case 0x00600000: {
22398                       // 0xfbe00000
22399                       unsigned rdlo = (instr >> 12) & 0xf;
22400                       unsigned rdhi = (instr >> 8) & 0xf;
22401                       unsigned rn = (instr >> 16) & 0xf;
22402                       unsigned rm = instr & 0xf;
22403                       // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22404                       umlal(CurrentCond(),
22405                             Register(rdlo),
22406                             Register(rdhi),
22407                             Register(rn),
22408                             Register(rm));
22409                       break;
22410                     }
22411                     case 0x00600060: {
22412                       // 0xfbe00060
22413                       unsigned rdlo = (instr >> 12) & 0xf;
22414                       unsigned rdhi = (instr >> 8) & 0xf;
22415                       unsigned rn = (instr >> 16) & 0xf;
22416                       unsigned rm = instr & 0xf;
22417                       // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22418                       umaal(CurrentCond(),
22419                             Register(rdlo),
22420                             Register(rdhi),
22421                             Register(rn),
22422                             Register(rm));
22423                       break;
22424                     }
22425                     default:
22426                       UnallocatedT32(instr);
22427                       break;
22428                   }
22429                   break;
22430                 }
22431                 case 0x11900000: {
22432                   // 0xfb900000
22433                   switch (instr & 0x006000f0) {
22434                     case 0x000000f0: {
22435                       // 0xfb9000f0
22436                       unsigned rd = (instr >> 8) & 0xf;
22437                       unsigned rn = (instr >> 16) & 0xf;
22438                       unsigned rm = instr & 0xf;
22439                       // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22440                       sdiv(CurrentCond(),
22441                            Register(rd),
22442                            Register(rn),
22443                            Register(rm));
22444                       if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
22445                         UnpredictableT32(instr);
22446                       }
22447                       break;
22448                     }
22449                     case 0x002000f0: {
22450                       // 0xfbb000f0
22451                       unsigned rd = (instr >> 8) & 0xf;
22452                       unsigned rn = (instr >> 16) & 0xf;
22453                       unsigned rm = instr & 0xf;
22454                       // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
22455                       udiv(CurrentCond(),
22456                            Register(rd),
22457                            Register(rn),
22458                            Register(rm));
22459                       if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
22460                         UnpredictableT32(instr);
22461                       }
22462                       break;
22463                     }
22464                     case 0x004000c0: {
22465                       // 0xfbd000c0
22466                       unsigned rdlo = (instr >> 12) & 0xf;
22467                       unsigned rdhi = (instr >> 8) & 0xf;
22468                       unsigned rn = (instr >> 16) & 0xf;
22469                       unsigned rm = instr & 0xf;
22470                       // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22471                       smlsld(CurrentCond(),
22472                              Register(rdlo),
22473                              Register(rdhi),
22474                              Register(rn),
22475                              Register(rm));
22476                       break;
22477                     }
22478                     case 0x004000d0: {
22479                       // 0xfbd000d0
22480                       unsigned rdlo = (instr >> 12) & 0xf;
22481                       unsigned rdhi = (instr >> 8) & 0xf;
22482                       unsigned rn = (instr >> 16) & 0xf;
22483                       unsigned rm = instr & 0xf;
22484                       // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
22485                       smlsldx(CurrentCond(),
22486                               Register(rdlo),
22487                               Register(rdhi),
22488                               Register(rn),
22489                               Register(rm));
22490                       break;
22491                     }
22492                     default:
22493                       UnallocatedT32(instr);
22494                       break;
22495                   }
22496                   break;
22497                 }
22498               }
22499               break;
22500             }
22501             case 0x04000000: {
22502               // 0xec000000
22503               switch (instr & 0x11100000) {
22504                 case 0x00000000: {
22505                   // 0xec000000
22506                   switch (instr & 0x00000e00) {
22507                     case 0x00000a00: {
22508                       // 0xec000a00
22509                       switch (instr & 0x00800100) {
22510                         case 0x00000000: {
22511                           // 0xec000a00
22512                           if ((instr & 0x006000d0) == 0x00400010) {
22513                             unsigned rm = ExtractSRegister(instr, 5, 0);
22514                             unsigned rt = (instr >> 12) & 0xf;
22515                             unsigned rt2 = (instr >> 16) & 0xf;
22516                             // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
22517                             vmov(CurrentCond(),
22518                                  SRegister(rm),
22519                                  SRegister(rm + 1),
22520                                  Register(rt),
22521                                  Register(rt2));
22522                           } else {
22523                             UnallocatedT32(instr);
22524                           }
22525                           break;
22526                         }
22527                         case 0x00000100: {
22528                           // 0xec000b00
22529                           if ((instr & 0x006000d0) == 0x00400010) {
22530                             unsigned rm = ExtractDRegister(instr, 5, 0);
22531                             unsigned rt = (instr >> 12) & 0xf;
22532                             unsigned rt2 = (instr >> 16) & 0xf;
22533                             // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
22534                             vmov(CurrentCond(),
22535                                  DRegister(rm),
22536                                  Register(rt),
22537                                  Register(rt2));
22538                           } else {
22539                             UnallocatedT32(instr);
22540                           }
22541                           break;
22542                         }
22543                         case 0x00800000: {
22544                           // 0xec800a00
22545                           unsigned rn = (instr >> 16) & 0xf;
22546                           WriteBack write_back((instr >> 21) & 0x1);
22547                           unsigned first = ExtractSRegister(instr, 22, 12);
22548                           unsigned len = instr & 0xff;
22549                           // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22550                           vstm(CurrentCond(),
22551                                kDataTypeValueNone,
22552                                Register(rn),
22553                                write_back,
22554                                SRegisterList(SRegister(first), len));
22555                           if ((len == 0) ||
22556                               ((first + len) > kNumberOfSRegisters)) {
22557                             UnpredictableT32(instr);
22558                           }
22559                           break;
22560                         }
22561                         case 0x00800100: {
22562                           // 0xec800b00
22563                           switch (instr & 0x00000001) {
22564                             case 0x00000000: {
22565                               // 0xec800b00
22566                               unsigned rn = (instr >> 16) & 0xf;
22567                               WriteBack write_back((instr >> 21) & 0x1);
22568                               unsigned first = ExtractDRegister(instr, 22, 12);
22569                               unsigned imm8 = (instr & 0xff);
22570                               unsigned len = imm8 / 2;
22571                               unsigned end = first + len;
22572                               // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
22573                               vstm(CurrentCond(),
22574                                    kDataTypeValueNone,
22575                                    Register(rn),
22576                                    write_back,
22577                                    DRegisterList(DRegister(first), len));
22578                               if ((len == 0) || (len > 16) ||
22579                                   (end > kMaxNumberOfDRegisters)) {
22580                                 UnpredictableT32(instr);
22581                               }
22582                               break;
22583                             }
22584                             case 0x00000001: {
22585                               // 0xec800b01
22586                               unsigned rn = (instr >> 16) & 0xf;
22587                               WriteBack write_back((instr >> 21) & 0x1);
22588                               unsigned first = ExtractDRegister(instr, 22, 12);
22589                               unsigned imm8 = (instr & 0xff);
22590                               unsigned len = imm8 / 2;
22591                               unsigned end = first + len;
22592                               // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22593                               fstmiax(CurrentCond(),
22594                                       Register(rn),
22595                                       write_back,
22596                                       DRegisterList(DRegister(first), len));
22597                               if ((len == 0) || (len > 16) || (end > 16)) {
22598                                 UnpredictableT32(instr);
22599                               }
22600                               break;
22601                             }
22602                           }
22603                           break;
22604                         }
22605                       }
22606                       break;
22607                     }
22608                     default: {
22609                       switch (instr & 0x00200000) {
22610                         case 0x00000000: {
22611                           // 0xec000000
22612                           switch (instr & 0x00800000) {
22613                             case 0x00000000: {
22614                               // 0xec000000
22615                               if ((instr & 0x00400000) == 0x00400000) {
22616                                 if (((instr & 0xe00) == 0xa00)) {
22617                                   UnallocatedT32(instr);
22618                                   return;
22619                                 }
22620                                 UnimplementedT32_32("MCRR", instr);
22621                               } else {
22622                                 UnallocatedT32(instr);
22623                               }
22624                               break;
22625                             }
22626                             case 0x00800000: {
22627                               // 0xec800000
22628                               if (((instr & 0xe00) == 0xa00)) {
22629                                 UnallocatedT32(instr);
22630                                 return;
22631                               }
22632                               UnimplementedT32_32("STC", instr);
22633                               break;
22634                             }
22635                           }
22636                           break;
22637                         }
22638                         case 0x00200000: {
22639                           // 0xec200000
22640                           if (((instr & 0xe00) == 0xa00)) {
22641                             UnallocatedT32(instr);
22642                             return;
22643                           }
22644                           UnimplementedT32_32("STC", instr);
22645                           break;
22646                         }
22647                       }
22648                       break;
22649                     }
22650                   }
22651                   break;
22652                 }
22653                 case 0x00100000: {
22654                   // 0xec100000
22655                   switch (instr & 0x00000e00) {
22656                     case 0x00000a00: {
22657                       // 0xec100a00
22658                       switch (instr & 0x00800100) {
22659                         case 0x00000000: {
22660                           // 0xec100a00
22661                           if ((instr & 0x006000d0) == 0x00400010) {
22662                             unsigned rt = (instr >> 12) & 0xf;
22663                             unsigned rt2 = (instr >> 16) & 0xf;
22664                             unsigned rm = ExtractSRegister(instr, 5, 0);
22665                             // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
22666                             vmov(CurrentCond(),
22667                                  Register(rt),
22668                                  Register(rt2),
22669                                  SRegister(rm),
22670                                  SRegister(rm + 1));
22671                           } else {
22672                             UnallocatedT32(instr);
22673                           }
22674                           break;
22675                         }
22676                         case 0x00000100: {
22677                           // 0xec100b00
22678                           if ((instr & 0x006000d0) == 0x00400010) {
22679                             unsigned rt = (instr >> 12) & 0xf;
22680                             unsigned rt2 = (instr >> 16) & 0xf;
22681                             unsigned rm = ExtractDRegister(instr, 5, 0);
22682                             // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
22683                             vmov(CurrentCond(),
22684                                  Register(rt),
22685                                  Register(rt2),
22686                                  DRegister(rm));
22687                           } else {
22688                             UnallocatedT32(instr);
22689                           }
22690                           break;
22691                         }
22692                         case 0x00800000: {
22693                           // 0xec900a00
22694                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22695                                Uint32(0x1)) &&
22696                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22697                                Uint32(0xd))) {
22698                             unsigned first = ExtractSRegister(instr, 22, 12);
22699                             unsigned len = instr & 0xff;
22700                             // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
22701                             vpop(CurrentCond(),
22702                                  kDataTypeValueNone,
22703                                  SRegisterList(SRegister(first), len));
22704                             if ((len == 0) ||
22705                                 ((first + len) > kNumberOfSRegisters)) {
22706                               UnpredictableT32(instr);
22707                             }
22708                             return;
22709                           }
22710                           unsigned rn = (instr >> 16) & 0xf;
22711                           WriteBack write_back((instr >> 21) & 0x1);
22712                           unsigned first = ExtractSRegister(instr, 22, 12);
22713                           unsigned len = instr & 0xff;
22714                           // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
22715                           vldm(CurrentCond(),
22716                                kDataTypeValueNone,
22717                                Register(rn),
22718                                write_back,
22719                                SRegisterList(SRegister(first), len));
22720                           if ((len == 0) ||
22721                               ((first + len) > kNumberOfSRegisters)) {
22722                             UnpredictableT32(instr);
22723                           }
22724                           break;
22725                         }
22726                         case 0x00800100: {
22727                           // 0xec900b00
22728                           switch (instr & 0x00000001) {
22729                             case 0x00000000: {
22730                               // 0xec900b00
22731                               if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
22732                                    Uint32(0x1)) &&
22733                                   ((Uint32((instr >> 16)) & Uint32(0xf)) ==
22734                                    Uint32(0xd))) {
22735                                 unsigned first =
22736                                     ExtractDRegister(instr, 22, 12);
22737                                 unsigned imm8 = (instr & 0xff);
22738                                 unsigned len = imm8 / 2;
22739                                 unsigned end = first + len;
22740                                 // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
22741                                 vpop(CurrentCond(),
22742                                      kDataTypeValueNone,
22743                                      DRegisterList(DRegister(first), len));
22744                                 if ((len == 0) || (len > 16) ||
22745                                     (end > kMaxNumberOfDRegisters)) {
22746                                   UnpredictableT32(instr);
22747                                 }
22748                                 return;
22749                               }
22750                               unsigned rn = (instr >> 16) & 0xf;
22751                               WriteBack write_back((instr >> 21) & 0x1);
22752                               unsigned first = ExtractDRegister(instr, 22, 12);
22753                               unsigned imm8 = (instr & 0xff);
22754                               unsigned len = imm8 / 2;
22755                               unsigned end = first + len;
22756                               // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 NOLINT(whitespace/line_length)
22757                               vldm(CurrentCond(),
22758                                    kDataTypeValueNone,
22759                                    Register(rn),
22760                                    write_back,
22761                                    DRegisterList(DRegister(first), len));
22762                               if ((len == 0) || (len > 16) ||
22763                                   (end > kMaxNumberOfDRegisters)) {
22764                                 UnpredictableT32(instr);
22765                               }
22766                               break;
22767                             }
22768                             case 0x00000001: {
22769                               // 0xec900b01
22770                               unsigned rn = (instr >> 16) & 0xf;
22771                               WriteBack write_back((instr >> 21) & 0x1);
22772                               unsigned first = ExtractDRegister(instr, 22, 12);
22773                               unsigned imm8 = (instr & 0xff);
22774                               unsigned len = imm8 / 2;
22775                               unsigned end = first + len;
22776                               // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
22777                               fldmiax(CurrentCond(),
22778                                       Register(rn),
22779                                       write_back,
22780                                       DRegisterList(DRegister(first), len));
22781                               if ((len == 0) || (len > 16) || (end > 16)) {
22782                                 UnpredictableT32(instr);
22783                               }
22784                               break;
22785                             }
22786                           }
22787                           break;
22788                         }
22789                       }
22790                       break;
22791                     }
22792                     default: {
22793                       switch (instr & 0x00200000) {
22794                         case 0x00000000: {
22795                           // 0xec100000
22796                           switch (instr & 0x00800000) {
22797                             case 0x00000000: {
22798                               // 0xec100000
22799                               if ((instr & 0x00400000) == 0x00400000) {
22800                                 if (((instr & 0xe00) == 0xa00)) {
22801                                   UnallocatedT32(instr);
22802                                   return;
22803                                 }
22804                                 UnimplementedT32_32("MRRC", instr);
22805                               } else {
22806                                 UnallocatedT32(instr);
22807                               }
22808                               break;
22809                             }
22810                             case 0x00800000: {
22811                               // 0xec900000
22812                               if (((instr & 0xf0000) == 0xf0000) ||
22813                                   ((instr & 0xe00) == 0xa00)) {
22814                                 UnallocatedT32(instr);
22815                                 return;
22816                               }
22817                               UnimplementedT32_32("LDC", instr);
22818                               break;
22819                             }
22820                           }
22821                           break;
22822                         }
22823                         case 0x00200000: {
22824                           // 0xec300000
22825                           if (((instr & 0xf0000) == 0xf0000) ||
22826                               ((instr & 0xe00) == 0xa00)) {
22827                             UnallocatedT32(instr);
22828                             return;
22829                           }
22830                           UnimplementedT32_32("LDC", instr);
22831                           break;
22832                         }
22833                       }
22834                       break;
22835                     }
22836                   }
22837                   break;
22838                 }
22839                 case 0x01000000: {
22840                   // 0xed000000
22841                   switch (instr & 0x00200000) {
22842                     case 0x00000000: {
22843                       // 0xed000000
22844                       switch (instr & 0x00000e00) {
22845                         case 0x00000a00: {
22846                           // 0xed000a00
22847                           switch (instr & 0x00000100) {
22848                             case 0x00000000: {
22849                               // 0xed000a00
22850                               unsigned rd = ExtractSRegister(instr, 22, 12);
22851                               unsigned rn = (instr >> 16) & 0xf;
22852                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
22853                                                                      : plus);
22854                               int32_t offset = (instr & 0xff) << 2;
22855                               // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
22856                               vstr(CurrentCond(),
22857                                    kDataTypeValueNone,
22858                                    SRegister(rd),
22859                                    MemOperand(Register(rn),
22860                                               sign,
22861                                               offset,
22862                                               Offset));
22863                               break;
22864                             }
22865                             case 0x00000100: {
22866                               // 0xed000b00
22867                               unsigned rd = ExtractDRegister(instr, 22, 12);
22868                               unsigned rn = (instr >> 16) & 0xf;
22869                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
22870                                                                      : plus);
22871                               int32_t offset = (instr & 0xff) << 2;
22872                               // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
22873                               vstr(CurrentCond(),
22874                                    kDataTypeValueNone,
22875                                    DRegister(rd),
22876                                    MemOperand(Register(rn),
22877                                               sign,
22878                                               offset,
22879                                               Offset));
22880                               break;
22881                             }
22882                           }
22883                           break;
22884                         }
22885                         default: {
22886                           if (((instr & 0xe00) == 0xa00)) {
22887                             UnallocatedT32(instr);
22888                             return;
22889                           }
22890                           UnimplementedT32_32("STC", instr);
22891                           break;
22892                         }
22893                       }
22894                       break;
22895                     }
22896                     case 0x00200000: {
22897                       // 0xed200000
22898                       switch (instr & 0x00000e00) {
22899                         case 0x00000a00: {
22900                           // 0xed200a00
22901                           switch (instr & 0x00800100) {
22902                             case 0x00000000: {
22903                               // 0xed200a00
22904                               if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
22905                                    Uint32(0xd))) {
22906                                 unsigned first =
22907                                     ExtractSRegister(instr, 22, 12);
22908                                 unsigned len = instr & 0xff;
22909                                 // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
22910                                 vpush(CurrentCond(),
22911                                       kDataTypeValueNone,
22912                                       SRegisterList(SRegister(first), len));
22913                                 if ((len == 0) ||
22914                                     ((first + len) > kNumberOfSRegisters)) {
22915                                   UnpredictableT32(instr);
22916                                 }
22917                                 return;
22918                               }
22919                               unsigned rn = (instr >> 16) & 0xf;
22920                               unsigned first = ExtractSRegister(instr, 22, 12);
22921                               unsigned len = instr & 0xff;
22922                               // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
22923                               vstmdb(CurrentCond(),
22924                                      kDataTypeValueNone,
22925                                      Register(rn),
22926                                      WriteBack(WRITE_BACK),
22927                                      SRegisterList(SRegister(first), len));
22928                               if ((len == 0) ||
22929                                   ((first + len) > kNumberOfSRegisters)) {
22930                                 UnpredictableT32(instr);
22931                               }
22932                               break;
22933                             }
22934                             case 0x00000100: {
22935                               // 0xed200b00
22936                               switch (instr & 0x00000001) {
22937                                 case 0x00000000: {
22938                                   // 0xed200b00
22939                                   if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
22940                                        Uint32(0xd))) {
22941                                     unsigned first =
22942                                         ExtractDRegister(instr, 22, 12);
22943                                     unsigned imm8 = (instr & 0xff);
22944                                     unsigned len = imm8 / 2;
22945                                     unsigned end = first + len;
22946                                     // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
22947                                     vpush(CurrentCond(),
22948                                           kDataTypeValueNone,
22949                                           DRegisterList(DRegister(first), len));
22950                                     if ((len == 0) || (len > 16) ||
22951                                         (end > kMaxNumberOfDRegisters)) {
22952                                       UnpredictableT32(instr);
22953                                     }
22954                                     return;
22955                                   }
22956                                   unsigned rn = (instr >> 16) & 0xf;
22957                                   unsigned first =
22958                                       ExtractDRegister(instr, 22, 12);
22959                                   unsigned imm8 = (instr & 0xff);
22960                                   unsigned len = imm8 / 2;
22961                                   unsigned end = first + len;
22962                                   // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
22963                                   vstmdb(CurrentCond(),
22964                                          kDataTypeValueNone,
22965                                          Register(rn),
22966                                          WriteBack(WRITE_BACK),
22967                                          DRegisterList(DRegister(first), len));
22968                                   if ((len == 0) || (len > 16) ||
22969                                       (end > kMaxNumberOfDRegisters)) {
22970                                     UnpredictableT32(instr);
22971                                   }
22972                                   break;
22973                                 }
22974                                 case 0x00000001: {
22975                                   // 0xed200b01
22976                                   unsigned rn = (instr >> 16) & 0xf;
22977                                   unsigned first =
22978                                       ExtractDRegister(instr, 22, 12);
22979                                   unsigned imm8 = (instr & 0xff);
22980                                   unsigned len = imm8 / 2;
22981                                   unsigned end = first + len;
22982                                   // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
22983                                   fstmdbx(CurrentCond(),
22984                                           Register(rn),
22985                                           WriteBack(WRITE_BACK),
22986                                           DRegisterList(DRegister(first), len));
22987                                   if ((len == 0) || (len > 16) || (end > 16)) {
22988                                     UnpredictableT32(instr);
22989                                   }
22990                                   break;
22991                                 }
22992                               }
22993                               break;
22994                             }
22995                             default:
22996                               UnallocatedT32(instr);
22997                               break;
22998                           }
22999                           break;
23000                         }
23001                         default: {
23002                           if (((instr & 0xe00) == 0xa00)) {
23003                             UnallocatedT32(instr);
23004                             return;
23005                           }
23006                           UnimplementedT32_32("STC", instr);
23007                           break;
23008                         }
23009                       }
23010                       break;
23011                     }
23012                   }
23013                   break;
23014                 }
23015                 case 0x01100000: {
23016                   // 0xed100000
23017                   switch (instr & 0x00200000) {
23018                     case 0x00000000: {
23019                       // 0xed100000
23020                       switch (instr & 0x000f0000) {
23021                         case 0x000f0000: {
23022                           // 0xed1f0000
23023                           switch (instr & 0x00000e00) {
23024                             case 0x00000a00: {
23025                               // 0xed1f0a00
23026                               switch (instr & 0x00000100) {
23027                                 case 0x00000000: {
23028                                   // 0xed1f0a00
23029                                   unsigned rd = ExtractSRegister(instr, 22, 12);
23030                                   uint32_t U = (instr >> 23) & 0x1;
23031                                   int32_t imm = instr & 0xff;
23032                                   imm <<= 2;
23033                                   if (U == 0) imm = -imm;
23034                                   bool minus_zero = (imm == 0) && (U == 0);
23035                                   Label label(imm, kT32PcDelta, minus_zero);
23036                                   // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
23037                                   vldr(CurrentCond(),
23038                                        kDataTypeValueNone,
23039                                        SRegister(rd),
23040                                        &label);
23041                                   break;
23042                                 }
23043                                 case 0x00000100: {
23044                                   // 0xed1f0b00
23045                                   unsigned rd = ExtractDRegister(instr, 22, 12);
23046                                   uint32_t U = (instr >> 23) & 0x1;
23047                                   int32_t imm = instr & 0xff;
23048                                   imm <<= 2;
23049                                   if (U == 0) imm = -imm;
23050                                   bool minus_zero = (imm == 0) && (U == 0);
23051                                   Label label(imm, kT32PcDelta, minus_zero);
23052                                   // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
23053                                   vldr(CurrentCond(),
23054                                        kDataTypeValueNone,
23055                                        DRegister(rd),
23056                                        &label);
23057                                   break;
23058                                 }
23059                               }
23060                               break;
23061                             }
23062                             default: {
23063                               if (((instr & 0xe00) == 0xa00)) {
23064                                 UnallocatedT32(instr);
23065                                 return;
23066                               }
23067                               UnimplementedT32_32("LDC", instr);
23068                               break;
23069                             }
23070                           }
23071                           break;
23072                         }
23073                         default: {
23074                           switch (instr & 0x00000e00) {
23075                             case 0x00000a00: {
23076                               // 0xed100a00
23077                               switch (instr & 0x00000100) {
23078                                 case 0x00000000: {
23079                                   // 0xed100a00
23080                                   if (((instr & 0xf0000) == 0xf0000)) {
23081                                     UnallocatedT32(instr);
23082                                     return;
23083                                   }
23084                                   unsigned rd = ExtractSRegister(instr, 22, 12);
23085                                   unsigned rn = (instr >> 16) & 0xf;
23086                                   Sign sign((((instr >> 23) & 0x1) == 0)
23087                                                 ? minus
23088                                                 : plus);
23089                                   int32_t offset = (instr & 0xff) << 2;
23090                                   // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
23091                                   vldr(CurrentCond(),
23092                                        kDataTypeValueNone,
23093                                        SRegister(rd),
23094                                        MemOperand(Register(rn),
23095                                                   sign,
23096                                                   offset,
23097                                                   Offset));
23098                                   break;
23099                                 }
23100                                 case 0x00000100: {
23101                                   // 0xed100b00
23102                                   if (((instr & 0xf0000) == 0xf0000)) {
23103                                     UnallocatedT32(instr);
23104                                     return;
23105                                   }
23106                                   unsigned rd = ExtractDRegister(instr, 22, 12);
23107                                   unsigned rn = (instr >> 16) & 0xf;
23108                                   Sign sign((((instr >> 23) & 0x1) == 0)
23109                                                 ? minus
23110                                                 : plus);
23111                                   int32_t offset = (instr & 0xff) << 2;
23112                                   // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
23113                                   vldr(CurrentCond(),
23114                                        kDataTypeValueNone,
23115                                        DRegister(rd),
23116                                        MemOperand(Register(rn),
23117                                                   sign,
23118                                                   offset,
23119                                                   Offset));
23120                                   break;
23121                                 }
23122                               }
23123                               break;
23124                             }
23125                             default: {
23126                               if (((instr & 0xf0000) == 0xf0000) ||
23127                                   ((instr & 0xe00) == 0xa00)) {
23128                                 UnallocatedT32(instr);
23129                                 return;
23130                               }
23131                               UnimplementedT32_32("LDC", instr);
23132                               break;
23133                             }
23134                           }
23135                           break;
23136                         }
23137                       }
23138                       break;
23139                     }
23140                     case 0x00200000: {
23141                       // 0xed300000
23142                       switch (instr & 0x00000e00) {
23143                         case 0x00000a00: {
23144                           // 0xed300a00
23145                           switch (instr & 0x00800100) {
23146                             case 0x00000000: {
23147                               // 0xed300a00
23148                               unsigned rn = (instr >> 16) & 0xf;
23149                               unsigned first = ExtractSRegister(instr, 22, 12);
23150                               unsigned len = instr & 0xff;
23151                               // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 NOLINT(whitespace/line_length)
23152                               vldmdb(CurrentCond(),
23153                                      kDataTypeValueNone,
23154                                      Register(rn),
23155                                      WriteBack(WRITE_BACK),
23156                                      SRegisterList(SRegister(first), len));
23157                               if ((len == 0) ||
23158                                   ((first + len) > kNumberOfSRegisters)) {
23159                                 UnpredictableT32(instr);
23160                               }
23161                               break;
23162                             }
23163                             case 0x00000100: {
23164                               // 0xed300b00
23165                               switch (instr & 0x00000001) {
23166                                 case 0x00000000: {
23167                                   // 0xed300b00
23168                                   unsigned rn = (instr >> 16) & 0xf;
23169                                   unsigned first =
23170                                       ExtractDRegister(instr, 22, 12);
23171                                   unsigned imm8 = (instr & 0xff);
23172                                   unsigned len = imm8 / 2;
23173                                   unsigned end = first + len;
23174                                   // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 NOLINT(whitespace/line_length)
23175                                   vldmdb(CurrentCond(),
23176                                          kDataTypeValueNone,
23177                                          Register(rn),
23178                                          WriteBack(WRITE_BACK),
23179                                          DRegisterList(DRegister(first), len));
23180                                   if ((len == 0) || (len > 16) ||
23181                                       (end > kMaxNumberOfDRegisters)) {
23182                                     UnpredictableT32(instr);
23183                                   }
23184                                   break;
23185                                 }
23186                                 case 0x00000001: {
23187                                   // 0xed300b01
23188                                   unsigned rn = (instr >> 16) & 0xf;
23189                                   unsigned first =
23190                                       ExtractDRegister(instr, 22, 12);
23191                                   unsigned imm8 = (instr & 0xff);
23192                                   unsigned len = imm8 / 2;
23193                                   unsigned end = first + len;
23194                                   // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
23195                                   fldmdbx(CurrentCond(),
23196                                           Register(rn),
23197                                           WriteBack(WRITE_BACK),
23198                                           DRegisterList(DRegister(first), len));
23199                                   if ((len == 0) || (len > 16) || (end > 16)) {
23200                                     UnpredictableT32(instr);
23201                                   }
23202                                   break;
23203                                 }
23204                               }
23205                               break;
23206                             }
23207                             default:
23208                               UnallocatedT32(instr);
23209                               break;
23210                           }
23211                           break;
23212                         }
23213                         default: {
23214                           if (((instr & 0xf0000) == 0xf0000) ||
23215                               ((instr & 0xe00) == 0xa00)) {
23216                             UnallocatedT32(instr);
23217                             return;
23218                           }
23219                           UnimplementedT32_32("LDC", instr);
23220                           break;
23221                         }
23222                       }
23223                       break;
23224                     }
23225                   }
23226                   break;
23227                 }
23228                 case 0x10000000: {
23229                   // 0xfc000000
23230                   switch (instr & 0x00200000) {
23231                     case 0x00000000: {
23232                       // 0xfc000000
23233                       switch (instr & 0x00800000) {
23234                         case 0x00000000: {
23235                           // 0xfc000000
23236                           if ((instr & 0x00400000) == 0x00400000) {
23237                             if (((instr & 0xe00) == 0xa00)) {
23238                               UnallocatedT32(instr);
23239                               return;
23240                             }
23241                             UnimplementedT32_32("MCRR2", instr);
23242                           } else {
23243                             UnallocatedT32(instr);
23244                           }
23245                           break;
23246                         }
23247                         case 0x00800000: {
23248                           // 0xfc800000
23249                           if (((instr & 0xe00) == 0xa00)) {
23250                             UnallocatedT32(instr);
23251                             return;
23252                           }
23253                           UnimplementedT32_32("STC2", instr);
23254                           break;
23255                         }
23256                       }
23257                       break;
23258                     }
23259                     case 0x00200000: {
23260                       // 0xfc200000
23261                       if (((instr & 0xe00) == 0xa00)) {
23262                         UnallocatedT32(instr);
23263                         return;
23264                       }
23265                       UnimplementedT32_32("STC2", instr);
23266                       break;
23267                     }
23268                   }
23269                   break;
23270                 }
23271                 case 0x10100000: {
23272                   // 0xfc100000
23273                   switch (instr & 0x00200000) {
23274                     case 0x00000000: {
23275                       // 0xfc100000
23276                       switch (instr & 0x00800000) {
23277                         case 0x00000000: {
23278                           // 0xfc100000
23279                           if ((instr & 0x00400000) == 0x00400000) {
23280                             if (((instr & 0xe00) == 0xa00)) {
23281                               UnallocatedT32(instr);
23282                               return;
23283                             }
23284                             UnimplementedT32_32("MRRC2", instr);
23285                           } else {
23286                             UnallocatedT32(instr);
23287                           }
23288                           break;
23289                         }
23290                         case 0x00800000: {
23291                           // 0xfc900000
23292                           if (((instr & 0xf0000) == 0xf0000) ||
23293                               ((instr & 0xe00) == 0xa00)) {
23294                             UnallocatedT32(instr);
23295                             return;
23296                           }
23297                           UnimplementedT32_32("LDC2", instr);
23298                           break;
23299                         }
23300                       }
23301                       break;
23302                     }
23303                     case 0x00200000: {
23304                       // 0xfc300000
23305                       if (((instr & 0xf0000) == 0xf0000) ||
23306                           ((instr & 0xe00) == 0xa00)) {
23307                         UnallocatedT32(instr);
23308                         return;
23309                       }
23310                       UnimplementedT32_32("LDC2", instr);
23311                       break;
23312                     }
23313                   }
23314                   break;
23315                 }
23316                 case 0x11000000: {
23317                   // 0xfd000000
23318                   switch (instr & 0x00200000) {
23319                     case 0x00000000: {
23320                       // 0xfd000000
23321                       if (((instr & 0xe00) == 0xa00)) {
23322                         UnallocatedT32(instr);
23323                         return;
23324                       }
23325                       UnimplementedT32_32("STC2", instr);
23326                       break;
23327                     }
23328                     case 0x00200000: {
23329                       // 0xfd200000
23330                       if (((instr & 0xe00) == 0xa00)) {
23331                         UnallocatedT32(instr);
23332                         return;
23333                       }
23334                       UnimplementedT32_32("STC2", instr);
23335                       break;
23336                     }
23337                   }
23338                   break;
23339                 }
23340                 case 0x11100000: {
23341                   // 0xfd100000
23342                   switch (instr & 0x00200000) {
23343                     case 0x00000000: {
23344                       // 0xfd100000
23345                       switch (instr & 0x00000e00) {
23346                         case 0x00000a00: {
23347                           // 0xfd100a00
23348                           UnallocatedT32(instr);
23349                           break;
23350                         }
23351                         default: {
23352                           switch (instr & 0x000f0000) {
23353                             case 0x000f0000: {
23354                               // 0xfd1f0000
23355                               if (((instr & 0xe00) == 0xa00)) {
23356                                 UnallocatedT32(instr);
23357                                 return;
23358                               }
23359                               UnimplementedT32_32("LDC2", instr);
23360                               break;
23361                             }
23362                             default: {
23363                               if (((instr & 0xf0000) == 0xf0000) ||
23364                                   ((instr & 0xe00) == 0xa00)) {
23365                                 UnallocatedT32(instr);
23366                                 return;
23367                               }
23368                               UnimplementedT32_32("LDC2", instr);
23369                               break;
23370                             }
23371                           }
23372                           break;
23373                         }
23374                       }
23375                       break;
23376                     }
23377                     case 0x00200000: {
23378                       // 0xfd300000
23379                       if (((instr & 0xf0000) == 0xf0000) ||
23380                           ((instr & 0xe00) == 0xa00)) {
23381                         UnallocatedT32(instr);
23382                         return;
23383                       }
23384                       UnimplementedT32_32("LDC2", instr);
23385                       break;
23386                     }
23387                   }
23388                   break;
23389                 }
23390               }
23391               break;
23392             }
23393             case 0x06000000: {
23394               // 0xee000000
23395               switch (instr & 0x01000010) {
23396                 case 0x00000000: {
23397                   // 0xee000000
23398                   switch (instr & 0x10000000) {
23399                     case 0x00000000: {
23400                       // 0xee000000
23401                       switch (instr & 0x00000e00) {
23402                         case 0x00000a00: {
23403                           // 0xee000a00
23404                           switch (instr & 0x00b00140) {
23405                             case 0x00000000: {
23406                               // 0xee000a00
23407                               unsigned rd = ExtractSRegister(instr, 22, 12);
23408                               unsigned rn = ExtractSRegister(instr, 7, 16);
23409                               unsigned rm = ExtractSRegister(instr, 5, 0);
23410                               // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23411                               vmla(CurrentCond(),
23412                                    F32,
23413                                    SRegister(rd),
23414                                    SRegister(rn),
23415                                    SRegister(rm));
23416                               break;
23417                             }
23418                             case 0x00000040: {
23419                               // 0xee000a40
23420                               unsigned rd = ExtractSRegister(instr, 22, 12);
23421                               unsigned rn = ExtractSRegister(instr, 7, 16);
23422                               unsigned rm = ExtractSRegister(instr, 5, 0);
23423                               // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23424                               vmls(CurrentCond(),
23425                                    F32,
23426                                    SRegister(rd),
23427                                    SRegister(rn),
23428                                    SRegister(rm));
23429                               break;
23430                             }
23431                             case 0x00000100: {
23432                               // 0xee000b00
23433                               unsigned rd = ExtractDRegister(instr, 22, 12);
23434                               unsigned rn = ExtractDRegister(instr, 7, 16);
23435                               unsigned rm = ExtractDRegister(instr, 5, 0);
23436                               // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23437                               vmla(CurrentCond(),
23438                                    F64,
23439                                    DRegister(rd),
23440                                    DRegister(rn),
23441                                    DRegister(rm));
23442                               break;
23443                             }
23444                             case 0x00000140: {
23445                               // 0xee000b40
23446                               unsigned rd = ExtractDRegister(instr, 22, 12);
23447                               unsigned rn = ExtractDRegister(instr, 7, 16);
23448                               unsigned rm = ExtractDRegister(instr, 5, 0);
23449                               // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23450                               vmls(CurrentCond(),
23451                                    F64,
23452                                    DRegister(rd),
23453                                    DRegister(rn),
23454                                    DRegister(rm));
23455                               break;
23456                             }
23457                             case 0x00100000: {
23458                               // 0xee100a00
23459                               unsigned rd = ExtractSRegister(instr, 22, 12);
23460                               unsigned rn = ExtractSRegister(instr, 7, 16);
23461                               unsigned rm = ExtractSRegister(instr, 5, 0);
23462                               // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23463                               vnmls(CurrentCond(),
23464                                     F32,
23465                                     SRegister(rd),
23466                                     SRegister(rn),
23467                                     SRegister(rm));
23468                               break;
23469                             }
23470                             case 0x00100040: {
23471                               // 0xee100a40
23472                               unsigned rd = ExtractSRegister(instr, 22, 12);
23473                               unsigned rn = ExtractSRegister(instr, 7, 16);
23474                               unsigned rm = ExtractSRegister(instr, 5, 0);
23475                               // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23476                               vnmla(CurrentCond(),
23477                                     F32,
23478                                     SRegister(rd),
23479                                     SRegister(rn),
23480                                     SRegister(rm));
23481                               break;
23482                             }
23483                             case 0x00100100: {
23484                               // 0xee100b00
23485                               unsigned rd = ExtractDRegister(instr, 22, 12);
23486                               unsigned rn = ExtractDRegister(instr, 7, 16);
23487                               unsigned rm = ExtractDRegister(instr, 5, 0);
23488                               // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23489                               vnmls(CurrentCond(),
23490                                     F64,
23491                                     DRegister(rd),
23492                                     DRegister(rn),
23493                                     DRegister(rm));
23494                               break;
23495                             }
23496                             case 0x00100140: {
23497                               // 0xee100b40
23498                               unsigned rd = ExtractDRegister(instr, 22, 12);
23499                               unsigned rn = ExtractDRegister(instr, 7, 16);
23500                               unsigned rm = ExtractDRegister(instr, 5, 0);
23501                               // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23502                               vnmla(CurrentCond(),
23503                                     F64,
23504                                     DRegister(rd),
23505                                     DRegister(rn),
23506                                     DRegister(rm));
23507                               break;
23508                             }
23509                             case 0x00200000: {
23510                               // 0xee200a00
23511                               unsigned rd = ExtractSRegister(instr, 22, 12);
23512                               unsigned rn = ExtractSRegister(instr, 7, 16);
23513                               unsigned rm = ExtractSRegister(instr, 5, 0);
23514                               // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23515                               vmul(CurrentCond(),
23516                                    F32,
23517                                    SRegister(rd),
23518                                    SRegister(rn),
23519                                    SRegister(rm));
23520                               break;
23521                             }
23522                             case 0x00200040: {
23523                               // 0xee200a40
23524                               unsigned rd = ExtractSRegister(instr, 22, 12);
23525                               unsigned rn = ExtractSRegister(instr, 7, 16);
23526                               unsigned rm = ExtractSRegister(instr, 5, 0);
23527                               // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23528                               vnmul(CurrentCond(),
23529                                     F32,
23530                                     SRegister(rd),
23531                                     SRegister(rn),
23532                                     SRegister(rm));
23533                               break;
23534                             }
23535                             case 0x00200100: {
23536                               // 0xee200b00
23537                               unsigned rd = ExtractDRegister(instr, 22, 12);
23538                               unsigned rn = ExtractDRegister(instr, 7, 16);
23539                               unsigned rm = ExtractDRegister(instr, 5, 0);
23540                               // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23541                               vmul(CurrentCond(),
23542                                    F64,
23543                                    DRegister(rd),
23544                                    DRegister(rn),
23545                                    DRegister(rm));
23546                               break;
23547                             }
23548                             case 0x00200140: {
23549                               // 0xee200b40
23550                               unsigned rd = ExtractDRegister(instr, 22, 12);
23551                               unsigned rn = ExtractDRegister(instr, 7, 16);
23552                               unsigned rm = ExtractDRegister(instr, 5, 0);
23553                               // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23554                               vnmul(CurrentCond(),
23555                                     F64,
23556                                     DRegister(rd),
23557                                     DRegister(rn),
23558                                     DRegister(rm));
23559                               break;
23560                             }
23561                             case 0x00300000: {
23562                               // 0xee300a00
23563                               unsigned rd = ExtractSRegister(instr, 22, 12);
23564                               unsigned rn = ExtractSRegister(instr, 7, 16);
23565                               unsigned rm = ExtractSRegister(instr, 5, 0);
23566                               // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23567                               vadd(CurrentCond(),
23568                                    F32,
23569                                    SRegister(rd),
23570                                    SRegister(rn),
23571                                    SRegister(rm));
23572                               break;
23573                             }
23574                             case 0x00300040: {
23575                               // 0xee300a40
23576                               unsigned rd = ExtractSRegister(instr, 22, 12);
23577                               unsigned rn = ExtractSRegister(instr, 7, 16);
23578                               unsigned rm = ExtractSRegister(instr, 5, 0);
23579                               // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
23580                               vsub(CurrentCond(),
23581                                    F32,
23582                                    SRegister(rd),
23583                                    SRegister(rn),
23584                                    SRegister(rm));
23585                               break;
23586                             }
23587                             case 0x00300100: {
23588                               // 0xee300b00
23589                               unsigned rd = ExtractDRegister(instr, 22, 12);
23590                               unsigned rn = ExtractDRegister(instr, 7, 16);
23591                               unsigned rm = ExtractDRegister(instr, 5, 0);
23592                               // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23593                               vadd(CurrentCond(),
23594                                    F64,
23595                                    DRegister(rd),
23596                                    DRegister(rn),
23597                                    DRegister(rm));
23598                               break;
23599                             }
23600                             case 0x00300140: {
23601                               // 0xee300b40
23602                               unsigned rd = ExtractDRegister(instr, 22, 12);
23603                               unsigned rn = ExtractDRegister(instr, 7, 16);
23604                               unsigned rm = ExtractDRegister(instr, 5, 0);
23605                               // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
23606                               vsub(CurrentCond(),
23607                                    F64,
23608                                    DRegister(rd),
23609                                    DRegister(rn),
23610                                    DRegister(rm));
23611                               break;
23612                             }
23613                             case 0x00800000: {
23614                               // 0xee800a00
23615                               unsigned rd = ExtractSRegister(instr, 22, 12);
23616                               unsigned rn = ExtractSRegister(instr, 7, 16);
23617                               unsigned rm = ExtractSRegister(instr, 5, 0);
23618                               // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
23619                               vdiv(CurrentCond(),
23620                                    F32,
23621                                    SRegister(rd),
23622                                    SRegister(rn),
23623                                    SRegister(rm));
23624                               break;
23625                             }
23626                             case 0x00800100: {
23627                               // 0xee800b00
23628                               unsigned rd = ExtractDRegister(instr, 22, 12);
23629                               unsigned rn = ExtractDRegister(instr, 7, 16);
23630                               unsigned rm = ExtractDRegister(instr, 5, 0);
23631                               // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
23632                               vdiv(CurrentCond(),
23633                                    F64,
23634                                    DRegister(rd),
23635                                    DRegister(rn),
23636                                    DRegister(rm));
23637                               break;
23638                             }
23639                             case 0x00900000: {
23640                               // 0xee900a00
23641                               unsigned rd = ExtractSRegister(instr, 22, 12);
23642                               unsigned rn = ExtractSRegister(instr, 7, 16);
23643                               unsigned rm = ExtractSRegister(instr, 5, 0);
23644                               // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23645                               vfnms(CurrentCond(),
23646                                     F32,
23647                                     SRegister(rd),
23648                                     SRegister(rn),
23649                                     SRegister(rm));
23650                               break;
23651                             }
23652                             case 0x00900040: {
23653                               // 0xee900a40
23654                               unsigned rd = ExtractSRegister(instr, 22, 12);
23655                               unsigned rn = ExtractSRegister(instr, 7, 16);
23656                               unsigned rm = ExtractSRegister(instr, 5, 0);
23657                               // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
23658                               vfnma(CurrentCond(),
23659                                     F32,
23660                                     SRegister(rd),
23661                                     SRegister(rn),
23662                                     SRegister(rm));
23663                               break;
23664                             }
23665                             case 0x00900100: {
23666                               // 0xee900b00
23667                               unsigned rd = ExtractDRegister(instr, 22, 12);
23668                               unsigned rn = ExtractDRegister(instr, 7, 16);
23669                               unsigned rm = ExtractDRegister(instr, 5, 0);
23670                               // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23671                               vfnms(CurrentCond(),
23672                                     F64,
23673                                     DRegister(rd),
23674                                     DRegister(rn),
23675                                     DRegister(rm));
23676                               break;
23677                             }
23678                             case 0x00900140: {
23679                               // 0xee900b40
23680                               unsigned rd = ExtractDRegister(instr, 22, 12);
23681                               unsigned rn = ExtractDRegister(instr, 7, 16);
23682                               unsigned rm = ExtractDRegister(instr, 5, 0);
23683                               // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
23684                               vfnma(CurrentCond(),
23685                                     F64,
23686                                     DRegister(rd),
23687                                     DRegister(rn),
23688                                     DRegister(rm));
23689                               break;
23690                             }
23691                             case 0x00a00000: {
23692                               // 0xeea00a00
23693                               unsigned rd = ExtractSRegister(instr, 22, 12);
23694                               unsigned rn = ExtractSRegister(instr, 7, 16);
23695                               unsigned rm = ExtractSRegister(instr, 5, 0);
23696                               // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23697                               vfma(CurrentCond(),
23698                                    F32,
23699                                    SRegister(rd),
23700                                    SRegister(rn),
23701                                    SRegister(rm));
23702                               break;
23703                             }
23704                             case 0x00a00040: {
23705                               // 0xeea00a40
23706                               unsigned rd = ExtractSRegister(instr, 22, 12);
23707                               unsigned rn = ExtractSRegister(instr, 7, 16);
23708                               unsigned rm = ExtractSRegister(instr, 5, 0);
23709                               // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
23710                               vfms(CurrentCond(),
23711                                    F32,
23712                                    SRegister(rd),
23713                                    SRegister(rn),
23714                                    SRegister(rm));
23715                               break;
23716                             }
23717                             case 0x00a00100: {
23718                               // 0xeea00b00
23719                               unsigned rd = ExtractDRegister(instr, 22, 12);
23720                               unsigned rn = ExtractDRegister(instr, 7, 16);
23721                               unsigned rm = ExtractDRegister(instr, 5, 0);
23722                               // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23723                               vfma(CurrentCond(),
23724                                    F64,
23725                                    DRegister(rd),
23726                                    DRegister(rn),
23727                                    DRegister(rm));
23728                               break;
23729                             }
23730                             case 0x00a00140: {
23731                               // 0xeea00b40
23732                               unsigned rd = ExtractDRegister(instr, 22, 12);
23733                               unsigned rn = ExtractDRegister(instr, 7, 16);
23734                               unsigned rm = ExtractDRegister(instr, 5, 0);
23735                               // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
23736                               vfms(CurrentCond(),
23737                                    F64,
23738                                    DRegister(rd),
23739                                    DRegister(rn),
23740                                    DRegister(rm));
23741                               break;
23742                             }
23743                             case 0x00b00000: {
23744                               // 0xeeb00a00
23745                               unsigned rd = ExtractSRegister(instr, 22, 12);
23746                               uint32_t encoded_imm =
23747                                   (instr & 0xf) | ((instr >> 12) & 0xf0);
23748                               NeonImmediate imm =
23749                                   ImmediateVFP::Decode<float>(encoded_imm);
23750                               // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
23751                               vmov(CurrentCond(), F32, SRegister(rd), imm);
23752                               if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
23753                                 UnpredictableT32(instr);
23754                               }
23755                               break;
23756                             }
23757                             case 0x00b00040: {
23758                               // 0xeeb00a40
23759                               switch (instr & 0x000e0000) {
23760                                 case 0x00000000: {
23761                                   // 0xeeb00a40
23762                                   switch (instr & 0x00010080) {
23763                                     case 0x00000000: {
23764                                       // 0xeeb00a40
23765                                       unsigned rd =
23766                                           ExtractSRegister(instr, 22, 12);
23767                                       unsigned rm =
23768                                           ExtractSRegister(instr, 5, 0);
23769                                       // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23770                                       vmov(CurrentCond(),
23771                                            F32,
23772                                            SRegister(rd),
23773                                            SRegister(rm));
23774                                       break;
23775                                     }
23776                                     case 0x00000080: {
23777                                       // 0xeeb00ac0
23778                                       unsigned rd =
23779                                           ExtractSRegister(instr, 22, 12);
23780                                       unsigned rm =
23781                                           ExtractSRegister(instr, 5, 0);
23782                                       // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23783                                       vabs(CurrentCond(),
23784                                            F32,
23785                                            SRegister(rd),
23786                                            SRegister(rm));
23787                                       break;
23788                                     }
23789                                     case 0x00010000: {
23790                                       // 0xeeb10a40
23791                                       unsigned rd =
23792                                           ExtractSRegister(instr, 22, 12);
23793                                       unsigned rm =
23794                                           ExtractSRegister(instr, 5, 0);
23795                                       // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
23796                                       vneg(CurrentCond(),
23797                                            F32,
23798                                            SRegister(rd),
23799                                            SRegister(rm));
23800                                       break;
23801                                     }
23802                                     case 0x00010080: {
23803                                       // 0xeeb10ac0
23804                                       unsigned rd =
23805                                           ExtractSRegister(instr, 22, 12);
23806                                       unsigned rm =
23807                                           ExtractSRegister(instr, 5, 0);
23808                                       // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23809                                       vsqrt(CurrentCond(),
23810                                             F32,
23811                                             SRegister(rd),
23812                                             SRegister(rm));
23813                                       break;
23814                                     }
23815                                   }
23816                                   break;
23817                                 }
23818                                 case 0x00020000: {
23819                                   // 0xeeb20a40
23820                                   switch (instr & 0x00010080) {
23821                                     case 0x00000000: {
23822                                       // 0xeeb20a40
23823                                       unsigned rd =
23824                                           ExtractSRegister(instr, 22, 12);
23825                                       unsigned rm =
23826                                           ExtractSRegister(instr, 5, 0);
23827                                       // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23828                                       vcvtb(CurrentCond(),
23829                                             F32,
23830                                             F16,
23831                                             SRegister(rd),
23832                                             SRegister(rm));
23833                                       break;
23834                                     }
23835                                     case 0x00000080: {
23836                                       // 0xeeb20ac0
23837                                       unsigned rd =
23838                                           ExtractSRegister(instr, 22, 12);
23839                                       unsigned rm =
23840                                           ExtractSRegister(instr, 5, 0);
23841                                       // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
23842                                       vcvtt(CurrentCond(),
23843                                             F32,
23844                                             F16,
23845                                             SRegister(rd),
23846                                             SRegister(rm));
23847                                       break;
23848                                     }
23849                                     case 0x00010000: {
23850                                       // 0xeeb30a40
23851                                       unsigned rd =
23852                                           ExtractSRegister(instr, 22, 12);
23853                                       unsigned rm =
23854                                           ExtractSRegister(instr, 5, 0);
23855                                       // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23856                                       vcvtb(CurrentCond(),
23857                                             F16,
23858                                             F32,
23859                                             SRegister(rd),
23860                                             SRegister(rm));
23861                                       break;
23862                                     }
23863                                     case 0x00010080: {
23864                                       // 0xeeb30ac0
23865                                       unsigned rd =
23866                                           ExtractSRegister(instr, 22, 12);
23867                                       unsigned rm =
23868                                           ExtractSRegister(instr, 5, 0);
23869                                       // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
23870                                       vcvtt(CurrentCond(),
23871                                             F16,
23872                                             F32,
23873                                             SRegister(rd),
23874                                             SRegister(rm));
23875                                       break;
23876                                     }
23877                                   }
23878                                   break;
23879                                 }
23880                                 case 0x00040000: {
23881                                   // 0xeeb40a40
23882                                   switch (instr & 0x00010080) {
23883                                     case 0x00000000: {
23884                                       // 0xeeb40a40
23885                                       unsigned rd =
23886                                           ExtractSRegister(instr, 22, 12);
23887                                       unsigned rm =
23888                                           ExtractSRegister(instr, 5, 0);
23889                                       // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23890                                       vcmp(CurrentCond(),
23891                                            F32,
23892                                            SRegister(rd),
23893                                            SRegister(rm));
23894                                       break;
23895                                     }
23896                                     case 0x00000080: {
23897                                       // 0xeeb40ac0
23898                                       unsigned rd =
23899                                           ExtractSRegister(instr, 22, 12);
23900                                       unsigned rm =
23901                                           ExtractSRegister(instr, 5, 0);
23902                                       // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
23903                                       vcmpe(CurrentCond(),
23904                                             F32,
23905                                             SRegister(rd),
23906                                             SRegister(rm));
23907                                       break;
23908                                     }
23909                                     case 0x00010000: {
23910                                       // 0xeeb50a40
23911                                       unsigned rd =
23912                                           ExtractSRegister(instr, 22, 12);
23913                                       // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
23914                                       vcmp(CurrentCond(),
23915                                            F32,
23916                                            SRegister(rd),
23917                                            0.0);
23918                                       if (((instr & 0xffbf0fff) !=
23919                                            0xeeb50a40)) {
23920                                         UnpredictableT32(instr);
23921                                       }
23922                                       break;
23923                                     }
23924                                     case 0x00010080: {
23925                                       // 0xeeb50ac0
23926                                       unsigned rd =
23927                                           ExtractSRegister(instr, 22, 12);
23928                                       // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
23929                                       vcmpe(CurrentCond(),
23930                                             F32,
23931                                             SRegister(rd),
23932                                             0.0);
23933                                       if (((instr & 0xffbf0fff) !=
23934                                            0xeeb50ac0)) {
23935                                         UnpredictableT32(instr);
23936                                       }
23937                                       break;
23938                                     }
23939                                   }
23940                                   break;
23941                                 }
23942                                 case 0x00060000: {
23943                                   // 0xeeb60a40
23944                                   switch (instr & 0x00010080) {
23945                                     case 0x00000000: {
23946                                       // 0xeeb60a40
23947                                       unsigned rd =
23948                                           ExtractSRegister(instr, 22, 12);
23949                                       unsigned rm =
23950                                           ExtractSRegister(instr, 5, 0);
23951                                       // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
23952                                       vrintr(CurrentCond(),
23953                                              F32,
23954                                              F32,
23955                                              SRegister(rd),
23956                                              SRegister(rm));
23957                                       break;
23958                                     }
23959                                     case 0x00000080: {
23960                                       // 0xeeb60ac0
23961                                       unsigned rd =
23962                                           ExtractSRegister(instr, 22, 12);
23963                                       unsigned rm =
23964                                           ExtractSRegister(instr, 5, 0);
23965                                       // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
23966                                       vrintz(CurrentCond(),
23967                                              F32,
23968                                              F32,
23969                                              SRegister(rd),
23970                                              SRegister(rm));
23971                                       break;
23972                                     }
23973                                     case 0x00010000: {
23974                                       // 0xeeb70a40
23975                                       unsigned rd =
23976                                           ExtractSRegister(instr, 22, 12);
23977                                       unsigned rm =
23978                                           ExtractSRegister(instr, 5, 0);
23979                                       // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; T1 NOLINT(whitespace/line_length)
23980                                       vrintx(CurrentCond(),
23981                                              F32,
23982                                              F32,
23983                                              SRegister(rd),
23984                                              SRegister(rm));
23985                                       break;
23986                                     }
23987                                     case 0x00010080: {
23988                                       // 0xeeb70ac0
23989                                       unsigned rd =
23990                                           ExtractDRegister(instr, 22, 12);
23991                                       unsigned rm =
23992                                           ExtractSRegister(instr, 5, 0);
23993                                       // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
23994                                       vcvt(CurrentCond(),
23995                                            F64,
23996                                            F32,
23997                                            DRegister(rd),
23998                                            SRegister(rm));
23999                                       break;
24000                                     }
24001                                   }
24002                                   break;
24003                                 }
24004                                 case 0x00080000: {
24005                                   // 0xeeb80a40
24006                                   if ((instr & 0x00010000) == 0x00000000) {
24007                                     DataType dt =
24008                                         Dt_op_2_Decode((instr >> 7) & 0x1);
24009                                     if (dt.Is(kDataTypeValueInvalid)) {
24010                                       UnallocatedT32(instr);
24011                                       return;
24012                                     }
24013                                     unsigned rd =
24014                                         ExtractSRegister(instr, 22, 12);
24015                                     unsigned rm = ExtractSRegister(instr, 5, 0);
24016                                     // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
24017                                     vcvt(CurrentCond(),
24018                                          F32,
24019                                          dt,
24020                                          SRegister(rd),
24021                                          SRegister(rm));
24022                                   } else {
24023                                     UnallocatedT32(instr);
24024                                   }
24025                                   break;
24026                                 }
24027                                 case 0x000a0000: {
24028                                   // 0xeeba0a40
24029                                   DataType dt =
24030                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24031                                                        ((instr >> 15) & 0x2));
24032                                   if (dt.Is(kDataTypeValueInvalid)) {
24033                                     UnallocatedT32(instr);
24034                                     return;
24035                                   }
24036                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24037                                   unsigned offset = 32;
24038                                   if (dt.Is(S16) || dt.Is(U16)) {
24039                                     offset = 16;
24040                                   }
24041                                   uint32_t fbits =
24042                                       offset - (((instr >> 5) & 0x1) |
24043                                                 ((instr << 1) & 0x1e));
24044                                   // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24045                                   vcvt(CurrentCond(),
24046                                        F32,
24047                                        dt,
24048                                        SRegister(rd),
24049                                        SRegister(rd),
24050                                        fbits);
24051                                   break;
24052                                 }
24053                                 case 0x000c0000: {
24054                                   // 0xeebc0a40
24055                                   switch (instr & 0x00010080) {
24056                                     case 0x00000000: {
24057                                       // 0xeebc0a40
24058                                       unsigned rd =
24059                                           ExtractSRegister(instr, 22, 12);
24060                                       unsigned rm =
24061                                           ExtractSRegister(instr, 5, 0);
24062                                       // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
24063                                       vcvtr(CurrentCond(),
24064                                             U32,
24065                                             F32,
24066                                             SRegister(rd),
24067                                             SRegister(rm));
24068                                       break;
24069                                     }
24070                                     case 0x00000080: {
24071                                       // 0xeebc0ac0
24072                                       unsigned rd =
24073                                           ExtractSRegister(instr, 22, 12);
24074                                       unsigned rm =
24075                                           ExtractSRegister(instr, 5, 0);
24076                                       // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
24077                                       vcvt(CurrentCond(),
24078                                            U32,
24079                                            F32,
24080                                            SRegister(rd),
24081                                            SRegister(rm));
24082                                       break;
24083                                     }
24084                                     case 0x00010000: {
24085                                       // 0xeebd0a40
24086                                       unsigned rd =
24087                                           ExtractSRegister(instr, 22, 12);
24088                                       unsigned rm =
24089                                           ExtractSRegister(instr, 5, 0);
24090                                       // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
24091                                       vcvtr(CurrentCond(),
24092                                             S32,
24093                                             F32,
24094                                             SRegister(rd),
24095                                             SRegister(rm));
24096                                       break;
24097                                     }
24098                                     case 0x00010080: {
24099                                       // 0xeebd0ac0
24100                                       unsigned rd =
24101                                           ExtractSRegister(instr, 22, 12);
24102                                       unsigned rm =
24103                                           ExtractSRegister(instr, 5, 0);
24104                                       // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
24105                                       vcvt(CurrentCond(),
24106                                            S32,
24107                                            F32,
24108                                            SRegister(rd),
24109                                            SRegister(rm));
24110                                       break;
24111                                     }
24112                                   }
24113                                   break;
24114                                 }
24115                                 case 0x000e0000: {
24116                                   // 0xeebe0a40
24117                                   DataType dt =
24118                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24119                                                        ((instr >> 15) & 0x2));
24120                                   if (dt.Is(kDataTypeValueInvalid)) {
24121                                     UnallocatedT32(instr);
24122                                     return;
24123                                   }
24124                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24125                                   unsigned offset = 32;
24126                                   if (dt.Is(S16) || dt.Is(U16)) {
24127                                     offset = 16;
24128                                   }
24129                                   uint32_t fbits =
24130                                       offset - (((instr >> 5) & 0x1) |
24131                                                 ((instr << 1) & 0x1e));
24132                                   // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24133                                   vcvt(CurrentCond(),
24134                                        dt,
24135                                        F32,
24136                                        SRegister(rd),
24137                                        SRegister(rd),
24138                                        fbits);
24139                                   break;
24140                                 }
24141                               }
24142                               break;
24143                             }
24144                             case 0x00b00100: {
24145                               // 0xeeb00b00
24146                               unsigned rd = ExtractDRegister(instr, 22, 12);
24147                               uint32_t encoded_imm =
24148                                   (instr & 0xf) | ((instr >> 12) & 0xf0);
24149                               NeonImmediate imm =
24150                                   ImmediateVFP::Decode<double>(encoded_imm);
24151                               // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
24152                               vmov(CurrentCond(), F64, DRegister(rd), imm);
24153                               if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
24154                                 UnpredictableT32(instr);
24155                               }
24156                               break;
24157                             }
24158                             case 0x00b00140: {
24159                               // 0xeeb00b40
24160                               switch (instr & 0x000e0000) {
24161                                 case 0x00000000: {
24162                                   // 0xeeb00b40
24163                                   switch (instr & 0x00010080) {
24164                                     case 0x00000000: {
24165                                       // 0xeeb00b40
24166                                       unsigned rd =
24167                                           ExtractDRegister(instr, 22, 12);
24168                                       unsigned rm =
24169                                           ExtractDRegister(instr, 5, 0);
24170                                       // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24171                                       vmov(CurrentCond(),
24172                                            F64,
24173                                            DRegister(rd),
24174                                            DRegister(rm));
24175                                       break;
24176                                     }
24177                                     case 0x00000080: {
24178                                       // 0xeeb00bc0
24179                                       unsigned rd =
24180                                           ExtractDRegister(instr, 22, 12);
24181                                       unsigned rm =
24182                                           ExtractDRegister(instr, 5, 0);
24183                                       // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24184                                       vabs(CurrentCond(),
24185                                            F64,
24186                                            DRegister(rd),
24187                                            DRegister(rm));
24188                                       break;
24189                                     }
24190                                     case 0x00010000: {
24191                                       // 0xeeb10b40
24192                                       unsigned rd =
24193                                           ExtractDRegister(instr, 22, 12);
24194                                       unsigned rm =
24195                                           ExtractDRegister(instr, 5, 0);
24196                                       // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
24197                                       vneg(CurrentCond(),
24198                                            F64,
24199                                            DRegister(rd),
24200                                            DRegister(rm));
24201                                       break;
24202                                     }
24203                                     case 0x00010080: {
24204                                       // 0xeeb10bc0
24205                                       unsigned rd =
24206                                           ExtractDRegister(instr, 22, 12);
24207                                       unsigned rm =
24208                                           ExtractDRegister(instr, 5, 0);
24209                                       // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24210                                       vsqrt(CurrentCond(),
24211                                             F64,
24212                                             DRegister(rd),
24213                                             DRegister(rm));
24214                                       break;
24215                                     }
24216                                   }
24217                                   break;
24218                                 }
24219                                 case 0x00020000: {
24220                                   // 0xeeb20b40
24221                                   switch (instr & 0x00010080) {
24222                                     case 0x00000000: {
24223                                       // 0xeeb20b40
24224                                       unsigned rd =
24225                                           ExtractDRegister(instr, 22, 12);
24226                                       unsigned rm =
24227                                           ExtractSRegister(instr, 5, 0);
24228                                       // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24229                                       vcvtb(CurrentCond(),
24230                                             F64,
24231                                             F16,
24232                                             DRegister(rd),
24233                                             SRegister(rm));
24234                                       break;
24235                                     }
24236                                     case 0x00000080: {
24237                                       // 0xeeb20bc0
24238                                       unsigned rd =
24239                                           ExtractDRegister(instr, 22, 12);
24240                                       unsigned rm =
24241                                           ExtractSRegister(instr, 5, 0);
24242                                       // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
24243                                       vcvtt(CurrentCond(),
24244                                             F64,
24245                                             F16,
24246                                             DRegister(rd),
24247                                             SRegister(rm));
24248                                       break;
24249                                     }
24250                                     case 0x00010000: {
24251                                       // 0xeeb30b40
24252                                       unsigned rd =
24253                                           ExtractSRegister(instr, 22, 12);
24254                                       unsigned rm =
24255                                           ExtractDRegister(instr, 5, 0);
24256                                       // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24257                                       vcvtb(CurrentCond(),
24258                                             F16,
24259                                             F64,
24260                                             SRegister(rd),
24261                                             DRegister(rm));
24262                                       break;
24263                                     }
24264                                     case 0x00010080: {
24265                                       // 0xeeb30bc0
24266                                       unsigned rd =
24267                                           ExtractSRegister(instr, 22, 12);
24268                                       unsigned rm =
24269                                           ExtractDRegister(instr, 5, 0);
24270                                       // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
24271                                       vcvtt(CurrentCond(),
24272                                             F16,
24273                                             F64,
24274                                             SRegister(rd),
24275                                             DRegister(rm));
24276                                       break;
24277                                     }
24278                                   }
24279                                   break;
24280                                 }
24281                                 case 0x00040000: {
24282                                   // 0xeeb40b40
24283                                   switch (instr & 0x00010080) {
24284                                     case 0x00000000: {
24285                                       // 0xeeb40b40
24286                                       unsigned rd =
24287                                           ExtractDRegister(instr, 22, 12);
24288                                       unsigned rm =
24289                                           ExtractDRegister(instr, 5, 0);
24290                                       // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24291                                       vcmp(CurrentCond(),
24292                                            F64,
24293                                            DRegister(rd),
24294                                            DRegister(rm));
24295                                       break;
24296                                     }
24297                                     case 0x00000080: {
24298                                       // 0xeeb40bc0
24299                                       unsigned rd =
24300                                           ExtractDRegister(instr, 22, 12);
24301                                       unsigned rm =
24302                                           ExtractDRegister(instr, 5, 0);
24303                                       // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
24304                                       vcmpe(CurrentCond(),
24305                                             F64,
24306                                             DRegister(rd),
24307                                             DRegister(rm));
24308                                       break;
24309                                     }
24310                                     case 0x00010000: {
24311                                       // 0xeeb50b40
24312                                       unsigned rd =
24313                                           ExtractDRegister(instr, 22, 12);
24314                                       // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24315                                       vcmp(CurrentCond(),
24316                                            F64,
24317                                            DRegister(rd),
24318                                            0.0);
24319                                       if (((instr & 0xffbf0fff) !=
24320                                            0xeeb50b40)) {
24321                                         UnpredictableT32(instr);
24322                                       }
24323                                       break;
24324                                     }
24325                                     case 0x00010080: {
24326                                       // 0xeeb50bc0
24327                                       unsigned rd =
24328                                           ExtractDRegister(instr, 22, 12);
24329                                       // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
24330                                       vcmpe(CurrentCond(),
24331                                             F64,
24332                                             DRegister(rd),
24333                                             0.0);
24334                                       if (((instr & 0xffbf0fff) !=
24335                                            0xeeb50bc0)) {
24336                                         UnpredictableT32(instr);
24337                                       }
24338                                       break;
24339                                     }
24340                                   }
24341                                   break;
24342                                 }
24343                                 case 0x00060000: {
24344                                   // 0xeeb60b40
24345                                   switch (instr & 0x00010080) {
24346                                     case 0x00000000: {
24347                                       // 0xeeb60b40
24348                                       unsigned rd =
24349                                           ExtractDRegister(instr, 22, 12);
24350                                       unsigned rm =
24351                                           ExtractDRegister(instr, 5, 0);
24352                                       // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
24353                                       vrintr(CurrentCond(),
24354                                              F64,
24355                                              F64,
24356                                              DRegister(rd),
24357                                              DRegister(rm));
24358                                       break;
24359                                     }
24360                                     case 0x00000080: {
24361                                       // 0xeeb60bc0
24362                                       unsigned rd =
24363                                           ExtractDRegister(instr, 22, 12);
24364                                       unsigned rm =
24365                                           ExtractDRegister(instr, 5, 0);
24366                                       // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
24367                                       vrintz(CurrentCond(),
24368                                              F64,
24369                                              F64,
24370                                              DRegister(rd),
24371                                              DRegister(rm));
24372                                       break;
24373                                     }
24374                                     case 0x00010000: {
24375                                       // 0xeeb70b40
24376                                       unsigned rd =
24377                                           ExtractDRegister(instr, 22, 12);
24378                                       unsigned rm =
24379                                           ExtractDRegister(instr, 5, 0);
24380                                       // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
24381                                       vrintx(CurrentCond(),
24382                                              F64,
24383                                              F64,
24384                                              DRegister(rd),
24385                                              DRegister(rm));
24386                                       break;
24387                                     }
24388                                     case 0x00010080: {
24389                                       // 0xeeb70bc0
24390                                       unsigned rd =
24391                                           ExtractSRegister(instr, 22, 12);
24392                                       unsigned rm =
24393                                           ExtractDRegister(instr, 5, 0);
24394                                       // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
24395                                       vcvt(CurrentCond(),
24396                                            F32,
24397                                            F64,
24398                                            SRegister(rd),
24399                                            DRegister(rm));
24400                                       break;
24401                                     }
24402                                   }
24403                                   break;
24404                                 }
24405                                 case 0x00080000: {
24406                                   // 0xeeb80b40
24407                                   if ((instr & 0x00010000) == 0x00000000) {
24408                                     DataType dt =
24409                                         Dt_op_2_Decode((instr >> 7) & 0x1);
24410                                     if (dt.Is(kDataTypeValueInvalid)) {
24411                                       UnallocatedT32(instr);
24412                                       return;
24413                                     }
24414                                     unsigned rd =
24415                                         ExtractDRegister(instr, 22, 12);
24416                                     unsigned rm = ExtractSRegister(instr, 5, 0);
24417                                     // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
24418                                     vcvt(CurrentCond(),
24419                                          F64,
24420                                          dt,
24421                                          DRegister(rd),
24422                                          SRegister(rm));
24423                                   } else {
24424                                     UnallocatedT32(instr);
24425                                   }
24426                                   break;
24427                                 }
24428                                 case 0x000a0000: {
24429                                   // 0xeeba0b40
24430                                   DataType dt =
24431                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24432                                                        ((instr >> 15) & 0x2));
24433                                   if (dt.Is(kDataTypeValueInvalid)) {
24434                                     UnallocatedT32(instr);
24435                                     return;
24436                                   }
24437                                   unsigned rd = ExtractDRegister(instr, 22, 12);
24438                                   unsigned offset = 32;
24439                                   if (dt.Is(S16) || dt.Is(U16)) {
24440                                     offset = 16;
24441                                   }
24442                                   uint32_t fbits =
24443                                       offset - (((instr >> 5) & 0x1) |
24444                                                 ((instr << 1) & 0x1e));
24445                                   // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24446                                   vcvt(CurrentCond(),
24447                                        F64,
24448                                        dt,
24449                                        DRegister(rd),
24450                                        DRegister(rd),
24451                                        fbits);
24452                                   break;
24453                                 }
24454                                 case 0x000c0000: {
24455                                   // 0xeebc0b40
24456                                   switch (instr & 0x00010080) {
24457                                     case 0x00000000: {
24458                                       // 0xeebc0b40
24459                                       unsigned rd =
24460                                           ExtractSRegister(instr, 22, 12);
24461                                       unsigned rm =
24462                                           ExtractDRegister(instr, 5, 0);
24463                                       // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24464                                       vcvtr(CurrentCond(),
24465                                             U32,
24466                                             F64,
24467                                             SRegister(rd),
24468                                             DRegister(rm));
24469                                       break;
24470                                     }
24471                                     case 0x00000080: {
24472                                       // 0xeebc0bc0
24473                                       unsigned rd =
24474                                           ExtractSRegister(instr, 22, 12);
24475                                       unsigned rm =
24476                                           ExtractDRegister(instr, 5, 0);
24477                                       // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
24478                                       vcvt(CurrentCond(),
24479                                            U32,
24480                                            F64,
24481                                            SRegister(rd),
24482                                            DRegister(rm));
24483                                       break;
24484                                     }
24485                                     case 0x00010000: {
24486                                       // 0xeebd0b40
24487                                       unsigned rd =
24488                                           ExtractSRegister(instr, 22, 12);
24489                                       unsigned rm =
24490                                           ExtractDRegister(instr, 5, 0);
24491                                       // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24492                                       vcvtr(CurrentCond(),
24493                                             S32,
24494                                             F64,
24495                                             SRegister(rd),
24496                                             DRegister(rm));
24497                                       break;
24498                                     }
24499                                     case 0x00010080: {
24500                                       // 0xeebd0bc0
24501                                       unsigned rd =
24502                                           ExtractSRegister(instr, 22, 12);
24503                                       unsigned rm =
24504                                           ExtractDRegister(instr, 5, 0);
24505                                       // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
24506                                       vcvt(CurrentCond(),
24507                                            S32,
24508                                            F64,
24509                                            SRegister(rd),
24510                                            DRegister(rm));
24511                                       break;
24512                                     }
24513                                   }
24514                                   break;
24515                                 }
24516                                 case 0x000e0000: {
24517                                   // 0xeebe0b40
24518                                   DataType dt =
24519                                       Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
24520                                                        ((instr >> 15) & 0x2));
24521                                   if (dt.Is(kDataTypeValueInvalid)) {
24522                                     UnallocatedT32(instr);
24523                                     return;
24524                                   }
24525                                   unsigned rd = ExtractDRegister(instr, 22, 12);
24526                                   unsigned offset = 32;
24527                                   if (dt.Is(S16) || dt.Is(U16)) {
24528                                     offset = 16;
24529                                   }
24530                                   uint32_t fbits =
24531                                       offset - (((instr >> 5) & 0x1) |
24532                                                 ((instr << 1) & 0x1e));
24533                                   // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
24534                                   vcvt(CurrentCond(),
24535                                        dt,
24536                                        F64,
24537                                        DRegister(rd),
24538                                        DRegister(rd),
24539                                        fbits);
24540                                   break;
24541                                 }
24542                               }
24543                               break;
24544                             }
24545                             default:
24546                               UnallocatedT32(instr);
24547                               break;
24548                           }
24549                           break;
24550                         }
24551                         default: {
24552                           if (((instr & 0xe00) == 0xa00)) {
24553                             UnallocatedT32(instr);
24554                             return;
24555                           }
24556                           UnimplementedT32_32("CDP", instr);
24557                           break;
24558                         }
24559                       }
24560                       break;
24561                     }
24562                     case 0x10000000: {
24563                       // 0xfe000000
24564                       switch (instr & 0x00000e00) {
24565                         case 0x00000a00: {
24566                           // 0xfe000a00
24567                           switch (instr & 0x00b00140) {
24568                             case 0x00000000: {
24569                               // 0xfe000a00
24570                               unsigned rd = ExtractSRegister(instr, 22, 12);
24571                               unsigned rn = ExtractSRegister(instr, 7, 16);
24572                               unsigned rm = ExtractSRegister(instr, 5, 0);
24573                               // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
24574                               vseleq(F32,
24575                                      SRegister(rd),
24576                                      SRegister(rn),
24577                                      SRegister(rm));
24578                               break;
24579                             }
24580                             case 0x00000100: {
24581                               // 0xfe000b00
24582                               unsigned rd = ExtractDRegister(instr, 22, 12);
24583                               unsigned rn = ExtractDRegister(instr, 7, 16);
24584                               unsigned rm = ExtractDRegister(instr, 5, 0);
24585                               // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
24586                               vseleq(F64,
24587                                      DRegister(rd),
24588                                      DRegister(rn),
24589                                      DRegister(rm));
24590                               break;
24591                             }
24592                             case 0x00100000: {
24593                               // 0xfe100a00
24594                               unsigned rd = ExtractSRegister(instr, 22, 12);
24595                               unsigned rn = ExtractSRegister(instr, 7, 16);
24596                               unsigned rm = ExtractSRegister(instr, 5, 0);
24597                               // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
24598                               vselvs(F32,
24599                                      SRegister(rd),
24600                                      SRegister(rn),
24601                                      SRegister(rm));
24602                               break;
24603                             }
24604                             case 0x00100100: {
24605                               // 0xfe100b00
24606                               unsigned rd = ExtractDRegister(instr, 22, 12);
24607                               unsigned rn = ExtractDRegister(instr, 7, 16);
24608                               unsigned rm = ExtractDRegister(instr, 5, 0);
24609                               // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
24610                               vselvs(F64,
24611                                      DRegister(rd),
24612                                      DRegister(rn),
24613                                      DRegister(rm));
24614                               break;
24615                             }
24616                             case 0x00200000: {
24617                               // 0xfe200a00
24618                               unsigned rd = ExtractSRegister(instr, 22, 12);
24619                               unsigned rn = ExtractSRegister(instr, 7, 16);
24620                               unsigned rm = ExtractSRegister(instr, 5, 0);
24621                               // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
24622                               vselge(F32,
24623                                      SRegister(rd),
24624                                      SRegister(rn),
24625                                      SRegister(rm));
24626                               break;
24627                             }
24628                             case 0x00200100: {
24629                               // 0xfe200b00
24630                               unsigned rd = ExtractDRegister(instr, 22, 12);
24631                               unsigned rn = ExtractDRegister(instr, 7, 16);
24632                               unsigned rm = ExtractDRegister(instr, 5, 0);
24633                               // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
24634                               vselge(F64,
24635                                      DRegister(rd),
24636                                      DRegister(rn),
24637                                      DRegister(rm));
24638                               break;
24639                             }
24640                             case 0x00300000: {
24641                               // 0xfe300a00
24642                               unsigned rd = ExtractSRegister(instr, 22, 12);
24643                               unsigned rn = ExtractSRegister(instr, 7, 16);
24644                               unsigned rm = ExtractSRegister(instr, 5, 0);
24645                               // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
24646                               vselgt(F32,
24647                                      SRegister(rd),
24648                                      SRegister(rn),
24649                                      SRegister(rm));
24650                               break;
24651                             }
24652                             case 0x00300100: {
24653                               // 0xfe300b00
24654                               unsigned rd = ExtractDRegister(instr, 22, 12);
24655                               unsigned rn = ExtractDRegister(instr, 7, 16);
24656                               unsigned rm = ExtractDRegister(instr, 5, 0);
24657                               // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
24658                               vselgt(F64,
24659                                      DRegister(rd),
24660                                      DRegister(rn),
24661                                      DRegister(rm));
24662                               break;
24663                             }
24664                             case 0x00800000: {
24665                               // 0xfe800a00
24666                               unsigned rd = ExtractSRegister(instr, 22, 12);
24667                               unsigned rn = ExtractSRegister(instr, 7, 16);
24668                               unsigned rm = ExtractSRegister(instr, 5, 0);
24669                               // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24670                               vmaxnm(F32,
24671                                      SRegister(rd),
24672                                      SRegister(rn),
24673                                      SRegister(rm));
24674                               break;
24675                             }
24676                             case 0x00800040: {
24677                               // 0xfe800a40
24678                               unsigned rd = ExtractSRegister(instr, 22, 12);
24679                               unsigned rn = ExtractSRegister(instr, 7, 16);
24680                               unsigned rm = ExtractSRegister(instr, 5, 0);
24681                               // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
24682                               vminnm(F32,
24683                                      SRegister(rd),
24684                                      SRegister(rn),
24685                                      SRegister(rm));
24686                               break;
24687                             }
24688                             case 0x00800100: {
24689                               // 0xfe800b00
24690                               unsigned rd = ExtractDRegister(instr, 22, 12);
24691                               unsigned rn = ExtractDRegister(instr, 7, 16);
24692                               unsigned rm = ExtractDRegister(instr, 5, 0);
24693                               // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24694                               vmaxnm(F64,
24695                                      DRegister(rd),
24696                                      DRegister(rn),
24697                                      DRegister(rm));
24698                               break;
24699                             }
24700                             case 0x00800140: {
24701                               // 0xfe800b40
24702                               unsigned rd = ExtractDRegister(instr, 22, 12);
24703                               unsigned rn = ExtractDRegister(instr, 7, 16);
24704                               unsigned rm = ExtractDRegister(instr, 5, 0);
24705                               // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
24706                               vminnm(F64,
24707                                      DRegister(rd),
24708                                      DRegister(rn),
24709                                      DRegister(rm));
24710                               break;
24711                             }
24712                             case 0x00b00040: {
24713                               // 0xfeb00a40
24714                               switch (instr & 0x000f0000) {
24715                                 case 0x00080000: {
24716                                   // 0xfeb80a40
24717                                   if ((instr & 0x00000080) == 0x00000000) {
24718                                     unsigned rd =
24719                                         ExtractSRegister(instr, 22, 12);
24720                                     unsigned rm = ExtractSRegister(instr, 5, 0);
24721                                     // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; T1
24722                                     vrinta(F32,
24723                                            F32,
24724                                            SRegister(rd),
24725                                            SRegister(rm));
24726                                   } else {
24727                                     UnallocatedT32(instr);
24728                                   }
24729                                   break;
24730                                 }
24731                                 case 0x00090000: {
24732                                   // 0xfeb90a40
24733                                   if ((instr & 0x00000080) == 0x00000000) {
24734                                     unsigned rd =
24735                                         ExtractSRegister(instr, 22, 12);
24736                                     unsigned rm = ExtractSRegister(instr, 5, 0);
24737                                     // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; T1
24738                                     vrintn(F32,
24739                                            F32,
24740                                            SRegister(rd),
24741                                            SRegister(rm));
24742                                   } else {
24743                                     UnallocatedT32(instr);
24744                                   }
24745                                   break;
24746                                 }
24747                                 case 0x000a0000: {
24748                                   // 0xfeba0a40
24749                                   if ((instr & 0x00000080) == 0x00000000) {
24750                                     unsigned rd =
24751                                         ExtractSRegister(instr, 22, 12);
24752                                     unsigned rm = ExtractSRegister(instr, 5, 0);
24753                                     // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; T1
24754                                     vrintp(F32,
24755                                            F32,
24756                                            SRegister(rd),
24757                                            SRegister(rm));
24758                                   } else {
24759                                     UnallocatedT32(instr);
24760                                   }
24761                                   break;
24762                                 }
24763                                 case 0x000b0000: {
24764                                   // 0xfebb0a40
24765                                   if ((instr & 0x00000080) == 0x00000000) {
24766                                     unsigned rd =
24767                                         ExtractSRegister(instr, 22, 12);
24768                                     unsigned rm = ExtractSRegister(instr, 5, 0);
24769                                     // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; T1
24770                                     vrintm(F32,
24771                                            F32,
24772                                            SRegister(rd),
24773                                            SRegister(rm));
24774                                   } else {
24775                                     UnallocatedT32(instr);
24776                                   }
24777                                   break;
24778                                 }
24779                                 case 0x000c0000: {
24780                                   // 0xfebc0a40
24781                                   DataType dt =
24782                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24783                                   if (dt.Is(kDataTypeValueInvalid)) {
24784                                     UnallocatedT32(instr);
24785                                     return;
24786                                   }
24787                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24788                                   unsigned rm = ExtractSRegister(instr, 5, 0);
24789                                   // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24790                                   vcvta(dt, F32, SRegister(rd), SRegister(rm));
24791                                   break;
24792                                 }
24793                                 case 0x000d0000: {
24794                                   // 0xfebd0a40
24795                                   DataType dt =
24796                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24797                                   if (dt.Is(kDataTypeValueInvalid)) {
24798                                     UnallocatedT32(instr);
24799                                     return;
24800                                   }
24801                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24802                                   unsigned rm = ExtractSRegister(instr, 5, 0);
24803                                   // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24804                                   vcvtn(dt, F32, SRegister(rd), SRegister(rm));
24805                                   break;
24806                                 }
24807                                 case 0x000e0000: {
24808                                   // 0xfebe0a40
24809                                   DataType dt =
24810                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24811                                   if (dt.Is(kDataTypeValueInvalid)) {
24812                                     UnallocatedT32(instr);
24813                                     return;
24814                                   }
24815                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24816                                   unsigned rm = ExtractSRegister(instr, 5, 0);
24817                                   // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24818                                   vcvtp(dt, F32, SRegister(rd), SRegister(rm));
24819                                   break;
24820                                 }
24821                                 case 0x000f0000: {
24822                                   // 0xfebf0a40
24823                                   DataType dt =
24824                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24825                                   if (dt.Is(kDataTypeValueInvalid)) {
24826                                     UnallocatedT32(instr);
24827                                     return;
24828                                   }
24829                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24830                                   unsigned rm = ExtractSRegister(instr, 5, 0);
24831                                   // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
24832                                   vcvtm(dt, F32, SRegister(rd), SRegister(rm));
24833                                   break;
24834                                 }
24835                                 default:
24836                                   UnallocatedT32(instr);
24837                                   break;
24838                               }
24839                               break;
24840                             }
24841                             case 0x00b00140: {
24842                               // 0xfeb00b40
24843                               switch (instr & 0x000f0000) {
24844                                 case 0x00080000: {
24845                                   // 0xfeb80b40
24846                                   if ((instr & 0x00000080) == 0x00000000) {
24847                                     unsigned rd =
24848                                         ExtractDRegister(instr, 22, 12);
24849                                     unsigned rm = ExtractDRegister(instr, 5, 0);
24850                                     // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; T1
24851                                     vrinta(F64,
24852                                            F64,
24853                                            DRegister(rd),
24854                                            DRegister(rm));
24855                                   } else {
24856                                     UnallocatedT32(instr);
24857                                   }
24858                                   break;
24859                                 }
24860                                 case 0x00090000: {
24861                                   // 0xfeb90b40
24862                                   if ((instr & 0x00000080) == 0x00000000) {
24863                                     unsigned rd =
24864                                         ExtractDRegister(instr, 22, 12);
24865                                     unsigned rm = ExtractDRegister(instr, 5, 0);
24866                                     // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; T1
24867                                     vrintn(F64,
24868                                            F64,
24869                                            DRegister(rd),
24870                                            DRegister(rm));
24871                                   } else {
24872                                     UnallocatedT32(instr);
24873                                   }
24874                                   break;
24875                                 }
24876                                 case 0x000a0000: {
24877                                   // 0xfeba0b40
24878                                   if ((instr & 0x00000080) == 0x00000000) {
24879                                     unsigned rd =
24880                                         ExtractDRegister(instr, 22, 12);
24881                                     unsigned rm = ExtractDRegister(instr, 5, 0);
24882                                     // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; T1
24883                                     vrintp(F64,
24884                                            F64,
24885                                            DRegister(rd),
24886                                            DRegister(rm));
24887                                   } else {
24888                                     UnallocatedT32(instr);
24889                                   }
24890                                   break;
24891                                 }
24892                                 case 0x000b0000: {
24893                                   // 0xfebb0b40
24894                                   if ((instr & 0x00000080) == 0x00000000) {
24895                                     unsigned rd =
24896                                         ExtractDRegister(instr, 22, 12);
24897                                     unsigned rm = ExtractDRegister(instr, 5, 0);
24898                                     // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; T1
24899                                     vrintm(F64,
24900                                            F64,
24901                                            DRegister(rd),
24902                                            DRegister(rm));
24903                                   } else {
24904                                     UnallocatedT32(instr);
24905                                   }
24906                                   break;
24907                                 }
24908                                 case 0x000c0000: {
24909                                   // 0xfebc0b40
24910                                   DataType dt =
24911                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24912                                   if (dt.Is(kDataTypeValueInvalid)) {
24913                                     UnallocatedT32(instr);
24914                                     return;
24915                                   }
24916                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24917                                   unsigned rm = ExtractDRegister(instr, 5, 0);
24918                                   // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24919                                   vcvta(dt, F64, SRegister(rd), DRegister(rm));
24920                                   break;
24921                                 }
24922                                 case 0x000d0000: {
24923                                   // 0xfebd0b40
24924                                   DataType dt =
24925                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24926                                   if (dt.Is(kDataTypeValueInvalid)) {
24927                                     UnallocatedT32(instr);
24928                                     return;
24929                                   }
24930                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24931                                   unsigned rm = ExtractDRegister(instr, 5, 0);
24932                                   // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24933                                   vcvtn(dt, F64, SRegister(rd), DRegister(rm));
24934                                   break;
24935                                 }
24936                                 case 0x000e0000: {
24937                                   // 0xfebe0b40
24938                                   DataType dt =
24939                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24940                                   if (dt.Is(kDataTypeValueInvalid)) {
24941                                     UnallocatedT32(instr);
24942                                     return;
24943                                   }
24944                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24945                                   unsigned rm = ExtractDRegister(instr, 5, 0);
24946                                   // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24947                                   vcvtp(dt, F64, SRegister(rd), DRegister(rm));
24948                                   break;
24949                                 }
24950                                 case 0x000f0000: {
24951                                   // 0xfebf0b40
24952                                   DataType dt =
24953                                       Dt_op_2_Decode((instr >> 7) & 0x1);
24954                                   if (dt.Is(kDataTypeValueInvalid)) {
24955                                     UnallocatedT32(instr);
24956                                     return;
24957                                   }
24958                                   unsigned rd = ExtractSRegister(instr, 22, 12);
24959                                   unsigned rm = ExtractDRegister(instr, 5, 0);
24960                                   // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
24961                                   vcvtm(dt, F64, SRegister(rd), DRegister(rm));
24962                                   break;
24963                                 }
24964                                 default:
24965                                   UnallocatedT32(instr);
24966                                   break;
24967                               }
24968                               break;
24969                             }
24970                             default:
24971                               UnallocatedT32(instr);
24972                               break;
24973                           }
24974                           break;
24975                         }
24976                         default: {
24977                           if (((instr & 0xe00) == 0xa00)) {
24978                             UnallocatedT32(instr);
24979                             return;
24980                           }
24981                           UnimplementedT32_32("CDP2", instr);
24982                           break;
24983                         }
24984                       }
24985                       break;
24986                     }
24987                   }
24988                   break;
24989                 }
24990                 case 0x00000010: {
24991                   // 0xee000010
24992                   switch (instr & 0x10100000) {
24993                     case 0x00000000: {
24994                       // 0xee000010
24995                       switch (instr & 0x00000e00) {
24996                         case 0x00000a00: {
24997                           // 0xee000a10
24998                           switch (instr & 0x00800100) {
24999                             case 0x00000000: {
25000                               // 0xee000a10
25001                               if ((instr & 0x00600000) == 0x00000000) {
25002                                 unsigned rn = ExtractSRegister(instr, 7, 16);
25003                                 unsigned rt = (instr >> 12) & 0xf;
25004                                 // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
25005                                 vmov(CurrentCond(),
25006                                      SRegister(rn),
25007                                      Register(rt));
25008                                 if (((instr & 0xfff00f7f) != 0xee000a10)) {
25009                                   UnpredictableT32(instr);
25010                                 }
25011                               } else {
25012                                 UnallocatedT32(instr);
25013                               }
25014                               break;
25015                             }
25016                             case 0x00000100: {
25017                               // 0xee000b10
25018                               unsigned lane;
25019                               DataType dt =
25020                                   Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
25021                                                             ((instr >> 19) &
25022                                                              0xc),
25023                                                         &lane);
25024                               if (dt.Is(kDataTypeValueInvalid)) {
25025                                 UnallocatedT32(instr);
25026                                 return;
25027                               }
25028                               unsigned rd = ExtractDRegister(instr, 7, 16);
25029                               unsigned rt = (instr >> 12) & 0xf;
25030                               // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
25031                               vmov(CurrentCond(),
25032                                    dt,
25033                                    DRegisterLane(rd, lane),
25034                                    Register(rt));
25035                               if (((instr & 0xff900f1f) != 0xee000b10)) {
25036                                 UnpredictableT32(instr);
25037                               }
25038                               break;
25039                             }
25040                             case 0x00800000: {
25041                               // 0xee800a10
25042                               if ((instr & 0x00600000) == 0x00600000) {
25043                                 unsigned spec_reg = (instr >> 16) & 0xf;
25044                                 unsigned rt = (instr >> 12) & 0xf;
25045                                 switch (spec_reg) {
25046                                   case 0x0:
25047                                   case 0x1:
25048                                   case 0x8: {
25049                                     // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
25050                                     vmsr(CurrentCond(),
25051                                          SpecialFPRegister(spec_reg),
25052                                          Register(rt));
25053                                     if (((instr & 0xfff00fff) != 0xeee00a10)) {
25054                                       UnpredictableT32(instr);
25055                                     }
25056                                     break;
25057                                   }
25058                                   default:
25059                                     UnallocatedT32(instr);
25060                                     break;
25061                                 }
25062                               } else {
25063                                 UnallocatedT32(instr);
25064                               }
25065                               break;
25066                             }
25067                             case 0x00800100: {
25068                               // 0xee800b10
25069                               switch (instr & 0x00200040) {
25070                                 case 0x00000000: {
25071                                   // 0xee800b10
25072                                   DataType dt =
25073                                       Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
25074                                                       ((instr >> 21) & 0x2));
25075                                   if (dt.Is(kDataTypeValueInvalid)) {
25076                                     UnallocatedT32(instr);
25077                                     return;
25078                                   }
25079                                   unsigned rd = ExtractDRegister(instr, 7, 16);
25080                                   unsigned rt = (instr >> 12) & 0xf;
25081                                   // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
25082                                   vdup(CurrentCond(),
25083                                        dt,
25084                                        DRegister(rd),
25085                                        Register(rt));
25086                                   if (((instr & 0xffb00f5f) != 0xee800b10)) {
25087                                     UnpredictableT32(instr);
25088                                   }
25089                                   break;
25090                                 }
25091                                 case 0x00200000: {
25092                                   // 0xeea00b10
25093                                   DataType dt =
25094                                       Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
25095                                                       ((instr >> 21) & 0x2));
25096                                   if (dt.Is(kDataTypeValueInvalid)) {
25097                                     UnallocatedT32(instr);
25098                                     return;
25099                                   }
25100                                   if (((instr >> 16) & 1) != 0) {
25101                                     UnallocatedT32(instr);
25102                                     return;
25103                                   }
25104                                   unsigned rd = ExtractQRegister(instr, 7, 16);
25105                                   unsigned rt = (instr >> 12) & 0xf;
25106                                   // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
25107                                   vdup(CurrentCond(),
25108                                        dt,
25109                                        QRegister(rd),
25110                                        Register(rt));
25111                                   if (((instr & 0xffb00f5f) != 0xeea00b10)) {
25112                                     UnpredictableT32(instr);
25113                                   }
25114                                   break;
25115                                 }
25116                                 default:
25117                                   UnallocatedT32(instr);
25118                                   break;
25119                               }
25120                               break;
25121                             }
25122                           }
25123                           break;
25124                         }
25125                         default: {
25126                           if (((instr & 0xe00) == 0xa00)) {
25127                             UnallocatedT32(instr);
25128                             return;
25129                           }
25130                           UnimplementedT32_32("MCR", instr);
25131                           break;
25132                         }
25133                       }
25134                       break;
25135                     }
25136                     case 0x00100000: {
25137                       // 0xee100010
25138                       switch (instr & 0x00000e00) {
25139                         case 0x00000a00: {
25140                           // 0xee100a10
25141                           switch (instr & 0x00000100) {
25142                             case 0x00000000: {
25143                               // 0xee100a10
25144                               switch (instr & 0x00e00000) {
25145                                 case 0x00000000: {
25146                                   // 0xee100a10
25147                                   unsigned rt = (instr >> 12) & 0xf;
25148                                   unsigned rn = ExtractSRegister(instr, 7, 16);
25149                                   // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
25150                                   vmov(CurrentCond(),
25151                                        Register(rt),
25152                                        SRegister(rn));
25153                                   if (((instr & 0xfff00f7f) != 0xee100a10)) {
25154                                     UnpredictableT32(instr);
25155                                   }
25156                                   break;
25157                                 }
25158                                 case 0x00e00000: {
25159                                   // 0xeef00a10
25160                                   unsigned rt = (instr >> 12) & 0xf;
25161                                   unsigned spec_reg = (instr >> 16) & 0xf;
25162                                   switch (spec_reg) {
25163                                     case 0x0:
25164                                     case 0x1:
25165                                     case 0x5:
25166                                     case 0x6:
25167                                     case 0x7:
25168                                     case 0x8: {
25169                                       // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
25170                                       vmrs(CurrentCond(),
25171                                            RegisterOrAPSR_nzcv(rt),
25172                                            SpecialFPRegister(spec_reg));
25173                                       if (((instr & 0xfff00fff) !=
25174                                            0xeef00a10)) {
25175                                         UnpredictableT32(instr);
25176                                       }
25177                                       break;
25178                                     }
25179                                     default:
25180                                       UnallocatedT32(instr);
25181                                       break;
25182                                   }
25183                                   break;
25184                                 }
25185                                 default:
25186                                   UnallocatedT32(instr);
25187                                   break;
25188                               }
25189                               break;
25190                             }
25191                             case 0x00000100: {
25192                               // 0xee100b10
25193                               unsigned lane;
25194                               DataType dt =
25195                                   Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
25196                                                               ((instr >> 19) &
25197                                                                0xc) |
25198                                                               ((instr >> 19) &
25199                                                                0x10),
25200                                                           &lane);
25201                               if (dt.Is(kDataTypeValueInvalid)) {
25202                                 UnallocatedT32(instr);
25203                                 return;
25204                               }
25205                               unsigned rt = (instr >> 12) & 0xf;
25206                               unsigned rn = ExtractDRegister(instr, 7, 16);
25207                               // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
25208                               vmov(CurrentCond(),
25209                                    dt,
25210                                    Register(rt),
25211                                    DRegisterLane(rn, lane));
25212                               if (((instr & 0xff100f1f) != 0xee100b10)) {
25213                                 UnpredictableT32(instr);
25214                               }
25215                               break;
25216                             }
25217                           }
25218                           break;
25219                         }
25220                         default: {
25221                           if (((instr & 0xe00) == 0xa00)) {
25222                             UnallocatedT32(instr);
25223                             return;
25224                           }
25225                           UnimplementedT32_32("MRC", instr);
25226                           break;
25227                         }
25228                       }
25229                       break;
25230                     }
25231                     case 0x10000000: {
25232                       // 0xfe000010
25233                       if (((instr & 0xe00) == 0xa00)) {
25234                         UnallocatedT32(instr);
25235                         return;
25236                       }
25237                       UnimplementedT32_32("MCR2", instr);
25238                       break;
25239                     }
25240                     case 0x10100000: {
25241                       // 0xfe100010
25242                       if (((instr & 0xe00) == 0xa00)) {
25243                         UnallocatedT32(instr);
25244                         return;
25245                       }
25246                       UnimplementedT32_32("MRC2", instr);
25247                       break;
25248                     }
25249                   }
25250                   break;
25251                 }
25252                 case 0x01000000: {
25253                   // 0xef000000
25254                   switch (instr & 0x00800000) {
25255                     case 0x00000000: {
25256                       // 0xef000000
25257                       switch (instr & 0x00000f40) {
25258                         case 0x00000000: {
25259                           // 0xef000000
25260                           DataType dt = Dt_U_size_1_Decode(
25261                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25262                           if (dt.Is(kDataTypeValueInvalid)) {
25263                             UnallocatedT32(instr);
25264                             return;
25265                           }
25266                           unsigned rd = ExtractDRegister(instr, 22, 12);
25267                           unsigned rn = ExtractDRegister(instr, 7, 16);
25268                           unsigned rm = ExtractDRegister(instr, 5, 0);
25269                           // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25270                           vhadd(CurrentCond(),
25271                                 dt,
25272                                 DRegister(rd),
25273                                 DRegister(rn),
25274                                 DRegister(rm));
25275                           break;
25276                         }
25277                         case 0x00000040: {
25278                           // 0xef000040
25279                           DataType dt = Dt_U_size_1_Decode(
25280                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25281                           if (dt.Is(kDataTypeValueInvalid)) {
25282                             UnallocatedT32(instr);
25283                             return;
25284                           }
25285                           if (((instr >> 12) & 1) != 0) {
25286                             UnallocatedT32(instr);
25287                             return;
25288                           }
25289                           unsigned rd = ExtractQRegister(instr, 22, 12);
25290                           if (((instr >> 16) & 1) != 0) {
25291                             UnallocatedT32(instr);
25292                             return;
25293                           }
25294                           unsigned rn = ExtractQRegister(instr, 7, 16);
25295                           if ((instr & 1) != 0) {
25296                             UnallocatedT32(instr);
25297                             return;
25298                           }
25299                           unsigned rm = ExtractQRegister(instr, 5, 0);
25300                           // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25301                           vhadd(CurrentCond(),
25302                                 dt,
25303                                 QRegister(rd),
25304                                 QRegister(rn),
25305                                 QRegister(rm));
25306                           break;
25307                         }
25308                         case 0x00000100: {
25309                           // 0xef000100
25310                           DataType dt = Dt_U_size_1_Decode(
25311                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25312                           if (dt.Is(kDataTypeValueInvalid)) {
25313                             UnallocatedT32(instr);
25314                             return;
25315                           }
25316                           unsigned rd = ExtractDRegister(instr, 22, 12);
25317                           unsigned rn = ExtractDRegister(instr, 7, 16);
25318                           unsigned rm = ExtractDRegister(instr, 5, 0);
25319                           // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25320                           vrhadd(CurrentCond(),
25321                                  dt,
25322                                  DRegister(rd),
25323                                  DRegister(rn),
25324                                  DRegister(rm));
25325                           break;
25326                         }
25327                         case 0x00000140: {
25328                           // 0xef000140
25329                           DataType dt = Dt_U_size_1_Decode(
25330                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25331                           if (dt.Is(kDataTypeValueInvalid)) {
25332                             UnallocatedT32(instr);
25333                             return;
25334                           }
25335                           if (((instr >> 12) & 1) != 0) {
25336                             UnallocatedT32(instr);
25337                             return;
25338                           }
25339                           unsigned rd = ExtractQRegister(instr, 22, 12);
25340                           if (((instr >> 16) & 1) != 0) {
25341                             UnallocatedT32(instr);
25342                             return;
25343                           }
25344                           unsigned rn = ExtractQRegister(instr, 7, 16);
25345                           if ((instr & 1) != 0) {
25346                             UnallocatedT32(instr);
25347                             return;
25348                           }
25349                           unsigned rm = ExtractQRegister(instr, 5, 0);
25350                           // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25351                           vrhadd(CurrentCond(),
25352                                  dt,
25353                                  QRegister(rd),
25354                                  QRegister(rn),
25355                                  QRegister(rm));
25356                           break;
25357                         }
25358                         case 0x00000200: {
25359                           // 0xef000200
25360                           DataType dt = Dt_U_size_1_Decode(
25361                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25362                           if (dt.Is(kDataTypeValueInvalid)) {
25363                             UnallocatedT32(instr);
25364                             return;
25365                           }
25366                           unsigned rd = ExtractDRegister(instr, 22, 12);
25367                           unsigned rn = ExtractDRegister(instr, 7, 16);
25368                           unsigned rm = ExtractDRegister(instr, 5, 0);
25369                           // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25370                           vhsub(CurrentCond(),
25371                                 dt,
25372                                 DRegister(rd),
25373                                 DRegister(rn),
25374                                 DRegister(rm));
25375                           break;
25376                         }
25377                         case 0x00000240: {
25378                           // 0xef000240
25379                           DataType dt = Dt_U_size_1_Decode(
25380                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25381                           if (dt.Is(kDataTypeValueInvalid)) {
25382                             UnallocatedT32(instr);
25383                             return;
25384                           }
25385                           if (((instr >> 12) & 1) != 0) {
25386                             UnallocatedT32(instr);
25387                             return;
25388                           }
25389                           unsigned rd = ExtractQRegister(instr, 22, 12);
25390                           if (((instr >> 16) & 1) != 0) {
25391                             UnallocatedT32(instr);
25392                             return;
25393                           }
25394                           unsigned rn = ExtractQRegister(instr, 7, 16);
25395                           if ((instr & 1) != 0) {
25396                             UnallocatedT32(instr);
25397                             return;
25398                           }
25399                           unsigned rm = ExtractQRegister(instr, 5, 0);
25400                           // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25401                           vhsub(CurrentCond(),
25402                                 dt,
25403                                 QRegister(rd),
25404                                 QRegister(rn),
25405                                 QRegister(rm));
25406                           break;
25407                         }
25408                         case 0x00000300: {
25409                           // 0xef000300
25410                           DataType dt = Dt_U_size_1_Decode(
25411                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25412                           if (dt.Is(kDataTypeValueInvalid)) {
25413                             UnallocatedT32(instr);
25414                             return;
25415                           }
25416                           unsigned rd = ExtractDRegister(instr, 22, 12);
25417                           unsigned rn = ExtractDRegister(instr, 7, 16);
25418                           unsigned rm = ExtractDRegister(instr, 5, 0);
25419                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25420                           vcgt(CurrentCond(),
25421                                dt,
25422                                DRegister(rd),
25423                                DRegister(rn),
25424                                DRegister(rm));
25425                           break;
25426                         }
25427                         case 0x00000340: {
25428                           // 0xef000340
25429                           DataType dt = Dt_U_size_1_Decode(
25430                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25431                           if (dt.Is(kDataTypeValueInvalid)) {
25432                             UnallocatedT32(instr);
25433                             return;
25434                           }
25435                           if (((instr >> 12) & 1) != 0) {
25436                             UnallocatedT32(instr);
25437                             return;
25438                           }
25439                           unsigned rd = ExtractQRegister(instr, 22, 12);
25440                           if (((instr >> 16) & 1) != 0) {
25441                             UnallocatedT32(instr);
25442                             return;
25443                           }
25444                           unsigned rn = ExtractQRegister(instr, 7, 16);
25445                           if ((instr & 1) != 0) {
25446                             UnallocatedT32(instr);
25447                             return;
25448                           }
25449                           unsigned rm = ExtractQRegister(instr, 5, 0);
25450                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25451                           vcgt(CurrentCond(),
25452                                dt,
25453                                QRegister(rd),
25454                                QRegister(rn),
25455                                QRegister(rm));
25456                           break;
25457                         }
25458                         case 0x00000400: {
25459                           // 0xef000400
25460                           DataType dt = Dt_U_size_3_Decode(
25461                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25462                           if (dt.Is(kDataTypeValueInvalid)) {
25463                             UnallocatedT32(instr);
25464                             return;
25465                           }
25466                           unsigned rd = ExtractDRegister(instr, 22, 12);
25467                           unsigned rm = ExtractDRegister(instr, 5, 0);
25468                           unsigned rn = ExtractDRegister(instr, 7, 16);
25469                           // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25470                           vshl(CurrentCond(),
25471                                dt,
25472                                DRegister(rd),
25473                                DRegister(rm),
25474                                DRegister(rn));
25475                           break;
25476                         }
25477                         case 0x00000440: {
25478                           // 0xef000440
25479                           DataType dt = Dt_U_size_3_Decode(
25480                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25481                           if (dt.Is(kDataTypeValueInvalid)) {
25482                             UnallocatedT32(instr);
25483                             return;
25484                           }
25485                           if (((instr >> 12) & 1) != 0) {
25486                             UnallocatedT32(instr);
25487                             return;
25488                           }
25489                           unsigned rd = ExtractQRegister(instr, 22, 12);
25490                           if ((instr & 1) != 0) {
25491                             UnallocatedT32(instr);
25492                             return;
25493                           }
25494                           unsigned rm = ExtractQRegister(instr, 5, 0);
25495                           if (((instr >> 16) & 1) != 0) {
25496                             UnallocatedT32(instr);
25497                             return;
25498                           }
25499                           unsigned rn = ExtractQRegister(instr, 7, 16);
25500                           // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25501                           vshl(CurrentCond(),
25502                                dt,
25503                                QRegister(rd),
25504                                QRegister(rm),
25505                                QRegister(rn));
25506                           break;
25507                         }
25508                         case 0x00000500: {
25509                           // 0xef000500
25510                           DataType dt = Dt_U_size_3_Decode(
25511                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25512                           if (dt.Is(kDataTypeValueInvalid)) {
25513                             UnallocatedT32(instr);
25514                             return;
25515                           }
25516                           unsigned rd = ExtractDRegister(instr, 22, 12);
25517                           unsigned rm = ExtractDRegister(instr, 5, 0);
25518                           unsigned rn = ExtractDRegister(instr, 7, 16);
25519                           // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
25520                           vrshl(CurrentCond(),
25521                                 dt,
25522                                 DRegister(rd),
25523                                 DRegister(rm),
25524                                 DRegister(rn));
25525                           break;
25526                         }
25527                         case 0x00000540: {
25528                           // 0xef000540
25529                           DataType dt = Dt_U_size_3_Decode(
25530                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25531                           if (dt.Is(kDataTypeValueInvalid)) {
25532                             UnallocatedT32(instr);
25533                             return;
25534                           }
25535                           if (((instr >> 12) & 1) != 0) {
25536                             UnallocatedT32(instr);
25537                             return;
25538                           }
25539                           unsigned rd = ExtractQRegister(instr, 22, 12);
25540                           if ((instr & 1) != 0) {
25541                             UnallocatedT32(instr);
25542                             return;
25543                           }
25544                           unsigned rm = ExtractQRegister(instr, 5, 0);
25545                           if (((instr >> 16) & 1) != 0) {
25546                             UnallocatedT32(instr);
25547                             return;
25548                           }
25549                           unsigned rn = ExtractQRegister(instr, 7, 16);
25550                           // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
25551                           vrshl(CurrentCond(),
25552                                 dt,
25553                                 QRegister(rd),
25554                                 QRegister(rm),
25555                                 QRegister(rn));
25556                           break;
25557                         }
25558                         case 0x00000600: {
25559                           // 0xef000600
25560                           DataType dt = Dt_U_size_1_Decode(
25561                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25562                           if (dt.Is(kDataTypeValueInvalid)) {
25563                             UnallocatedT32(instr);
25564                             return;
25565                           }
25566                           unsigned rd = ExtractDRegister(instr, 22, 12);
25567                           unsigned rn = ExtractDRegister(instr, 7, 16);
25568                           unsigned rm = ExtractDRegister(instr, 5, 0);
25569                           // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25570                           vmax(CurrentCond(),
25571                                dt,
25572                                DRegister(rd),
25573                                DRegister(rn),
25574                                DRegister(rm));
25575                           break;
25576                         }
25577                         case 0x00000640: {
25578                           // 0xef000640
25579                           DataType dt = Dt_U_size_1_Decode(
25580                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25581                           if (dt.Is(kDataTypeValueInvalid)) {
25582                             UnallocatedT32(instr);
25583                             return;
25584                           }
25585                           if (((instr >> 12) & 1) != 0) {
25586                             UnallocatedT32(instr);
25587                             return;
25588                           }
25589                           unsigned rd = ExtractQRegister(instr, 22, 12);
25590                           if (((instr >> 16) & 1) != 0) {
25591                             UnallocatedT32(instr);
25592                             return;
25593                           }
25594                           unsigned rn = ExtractQRegister(instr, 7, 16);
25595                           if ((instr & 1) != 0) {
25596                             UnallocatedT32(instr);
25597                             return;
25598                           }
25599                           unsigned rm = ExtractQRegister(instr, 5, 0);
25600                           // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25601                           vmax(CurrentCond(),
25602                                dt,
25603                                QRegister(rd),
25604                                QRegister(rn),
25605                                QRegister(rm));
25606                           break;
25607                         }
25608                         case 0x00000700: {
25609                           // 0xef000700
25610                           DataType dt = Dt_U_size_1_Decode(
25611                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25612                           if (dt.Is(kDataTypeValueInvalid)) {
25613                             UnallocatedT32(instr);
25614                             return;
25615                           }
25616                           unsigned rd = ExtractDRegister(instr, 22, 12);
25617                           unsigned rn = ExtractDRegister(instr, 7, 16);
25618                           unsigned rm = ExtractDRegister(instr, 5, 0);
25619                           // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25620                           vabd(CurrentCond(),
25621                                dt,
25622                                DRegister(rd),
25623                                DRegister(rn),
25624                                DRegister(rm));
25625                           break;
25626                         }
25627                         case 0x00000740: {
25628                           // 0xef000740
25629                           DataType dt = Dt_U_size_1_Decode(
25630                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25631                           if (dt.Is(kDataTypeValueInvalid)) {
25632                             UnallocatedT32(instr);
25633                             return;
25634                           }
25635                           if (((instr >> 12) & 1) != 0) {
25636                             UnallocatedT32(instr);
25637                             return;
25638                           }
25639                           unsigned rd = ExtractQRegister(instr, 22, 12);
25640                           if (((instr >> 16) & 1) != 0) {
25641                             UnallocatedT32(instr);
25642                             return;
25643                           }
25644                           unsigned rn = ExtractQRegister(instr, 7, 16);
25645                           if ((instr & 1) != 0) {
25646                             UnallocatedT32(instr);
25647                             return;
25648                           }
25649                           unsigned rm = ExtractQRegister(instr, 5, 0);
25650                           // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25651                           vabd(CurrentCond(),
25652                                dt,
25653                                QRegister(rd),
25654                                QRegister(rn),
25655                                QRegister(rm));
25656                           break;
25657                         }
25658                         case 0x00000800: {
25659                           // 0xef000800
25660                           switch (instr & 0x10000000) {
25661                             case 0x00000000: {
25662                               // 0xef000800
25663                               DataType dt =
25664                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25665                               if (dt.Is(kDataTypeValueInvalid)) {
25666                                 UnallocatedT32(instr);
25667                                 return;
25668                               }
25669                               unsigned rd = ExtractDRegister(instr, 22, 12);
25670                               unsigned rn = ExtractDRegister(instr, 7, 16);
25671                               unsigned rm = ExtractDRegister(instr, 5, 0);
25672                               // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25673                               vadd(CurrentCond(),
25674                                    dt,
25675                                    DRegister(rd),
25676                                    DRegister(rn),
25677                                    DRegister(rm));
25678                               break;
25679                             }
25680                             case 0x10000000: {
25681                               // 0xff000800
25682                               DataType dt =
25683                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25684                               if (dt.Is(kDataTypeValueInvalid)) {
25685                                 UnallocatedT32(instr);
25686                                 return;
25687                               }
25688                               unsigned rd = ExtractDRegister(instr, 22, 12);
25689                               unsigned rn = ExtractDRegister(instr, 7, 16);
25690                               unsigned rm = ExtractDRegister(instr, 5, 0);
25691                               // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25692                               vsub(CurrentCond(),
25693                                    dt,
25694                                    DRegister(rd),
25695                                    DRegister(rn),
25696                                    DRegister(rm));
25697                               break;
25698                             }
25699                           }
25700                           break;
25701                         }
25702                         case 0x00000840: {
25703                           // 0xef000840
25704                           switch (instr & 0x10000000) {
25705                             case 0x00000000: {
25706                               // 0xef000840
25707                               DataType dt =
25708                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25709                               if (dt.Is(kDataTypeValueInvalid)) {
25710                                 UnallocatedT32(instr);
25711                                 return;
25712                               }
25713                               if (((instr >> 12) & 1) != 0) {
25714                                 UnallocatedT32(instr);
25715                                 return;
25716                               }
25717                               unsigned rd = ExtractQRegister(instr, 22, 12);
25718                               if (((instr >> 16) & 1) != 0) {
25719                                 UnallocatedT32(instr);
25720                                 return;
25721                               }
25722                               unsigned rn = ExtractQRegister(instr, 7, 16);
25723                               if ((instr & 1) != 0) {
25724                                 UnallocatedT32(instr);
25725                                 return;
25726                               }
25727                               unsigned rm = ExtractQRegister(instr, 5, 0);
25728                               // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25729                               vadd(CurrentCond(),
25730                                    dt,
25731                                    QRegister(rd),
25732                                    QRegister(rn),
25733                                    QRegister(rm));
25734                               break;
25735                             }
25736                             case 0x10000000: {
25737                               // 0xff000840
25738                               DataType dt =
25739                                   Dt_size_2_Decode((instr >> 20) & 0x3);
25740                               if (dt.Is(kDataTypeValueInvalid)) {
25741                                 UnallocatedT32(instr);
25742                                 return;
25743                               }
25744                               if (((instr >> 12) & 1) != 0) {
25745                                 UnallocatedT32(instr);
25746                                 return;
25747                               }
25748                               unsigned rd = ExtractQRegister(instr, 22, 12);
25749                               if (((instr >> 16) & 1) != 0) {
25750                                 UnallocatedT32(instr);
25751                                 return;
25752                               }
25753                               unsigned rn = ExtractQRegister(instr, 7, 16);
25754                               if ((instr & 1) != 0) {
25755                                 UnallocatedT32(instr);
25756                                 return;
25757                               }
25758                               unsigned rm = ExtractQRegister(instr, 5, 0);
25759                               // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25760                               vsub(CurrentCond(),
25761                                    dt,
25762                                    QRegister(rd),
25763                                    QRegister(rn),
25764                                    QRegister(rm));
25765                               break;
25766                             }
25767                           }
25768                           break;
25769                         }
25770                         case 0x00000900: {
25771                           // 0xef000900
25772                           switch (instr & 0x10000000) {
25773                             case 0x00000000: {
25774                               // 0xef000900
25775                               DataType dt =
25776                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25777                               if (dt.Is(kDataTypeValueInvalid)) {
25778                                 UnallocatedT32(instr);
25779                                 return;
25780                               }
25781                               unsigned rd = ExtractDRegister(instr, 22, 12);
25782                               unsigned rn = ExtractDRegister(instr, 7, 16);
25783                               unsigned rm = ExtractDRegister(instr, 5, 0);
25784                               // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25785                               vmla(CurrentCond(),
25786                                    dt,
25787                                    DRegister(rd),
25788                                    DRegister(rn),
25789                                    DRegister(rm));
25790                               break;
25791                             }
25792                             case 0x10000000: {
25793                               // 0xff000900
25794                               DataType dt =
25795                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25796                               if (dt.Is(kDataTypeValueInvalid)) {
25797                                 UnallocatedT32(instr);
25798                                 return;
25799                               }
25800                               unsigned rd = ExtractDRegister(instr, 22, 12);
25801                               unsigned rn = ExtractDRegister(instr, 7, 16);
25802                               unsigned rm = ExtractDRegister(instr, 5, 0);
25803                               // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
25804                               vmls(CurrentCond(),
25805                                    dt,
25806                                    DRegister(rd),
25807                                    DRegister(rn),
25808                                    DRegister(rm));
25809                               break;
25810                             }
25811                           }
25812                           break;
25813                         }
25814                         case 0x00000940: {
25815                           // 0xef000940
25816                           switch (instr & 0x10000000) {
25817                             case 0x00000000: {
25818                               // 0xef000940
25819                               DataType dt =
25820                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25821                               if (dt.Is(kDataTypeValueInvalid)) {
25822                                 UnallocatedT32(instr);
25823                                 return;
25824                               }
25825                               if (((instr >> 12) & 1) != 0) {
25826                                 UnallocatedT32(instr);
25827                                 return;
25828                               }
25829                               unsigned rd = ExtractQRegister(instr, 22, 12);
25830                               if (((instr >> 16) & 1) != 0) {
25831                                 UnallocatedT32(instr);
25832                                 return;
25833                               }
25834                               unsigned rn = ExtractQRegister(instr, 7, 16);
25835                               if ((instr & 1) != 0) {
25836                                 UnallocatedT32(instr);
25837                                 return;
25838                               }
25839                               unsigned rm = ExtractQRegister(instr, 5, 0);
25840                               // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25841                               vmla(CurrentCond(),
25842                                    dt,
25843                                    QRegister(rd),
25844                                    QRegister(rn),
25845                                    QRegister(rm));
25846                               break;
25847                             }
25848                             case 0x10000000: {
25849                               // 0xff000940
25850                               DataType dt =
25851                                   Dt_size_10_Decode((instr >> 20) & 0x3);
25852                               if (dt.Is(kDataTypeValueInvalid)) {
25853                                 UnallocatedT32(instr);
25854                                 return;
25855                               }
25856                               if (((instr >> 12) & 1) != 0) {
25857                                 UnallocatedT32(instr);
25858                                 return;
25859                               }
25860                               unsigned rd = ExtractQRegister(instr, 22, 12);
25861                               if (((instr >> 16) & 1) != 0) {
25862                                 UnallocatedT32(instr);
25863                                 return;
25864                               }
25865                               unsigned rn = ExtractQRegister(instr, 7, 16);
25866                               if ((instr & 1) != 0) {
25867                                 UnallocatedT32(instr);
25868                                 return;
25869                               }
25870                               unsigned rm = ExtractQRegister(instr, 5, 0);
25871                               // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
25872                               vmls(CurrentCond(),
25873                                    dt,
25874                                    QRegister(rd),
25875                                    QRegister(rn),
25876                                    QRegister(rm));
25877                               break;
25878                             }
25879                           }
25880                           break;
25881                         }
25882                         case 0x00000a00: {
25883                           // 0xef000a00
25884                           DataType dt = Dt_U_size_1_Decode(
25885                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
25886                           if (dt.Is(kDataTypeValueInvalid)) {
25887                             UnallocatedT32(instr);
25888                             return;
25889                           }
25890                           unsigned rd = ExtractDRegister(instr, 22, 12);
25891                           unsigned rn = ExtractDRegister(instr, 7, 16);
25892                           unsigned rm = ExtractDRegister(instr, 5, 0);
25893                           // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25894                           vpmax(CurrentCond(),
25895                                 dt,
25896                                 DRegister(rd),
25897                                 DRegister(rn),
25898                                 DRegister(rm));
25899                           break;
25900                         }
25901                         case 0x00000b00: {
25902                           // 0xef000b00
25903                           switch (instr & 0x10000000) {
25904                             case 0x00000000: {
25905                               // 0xef000b00
25906                               DataType dt =
25907                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25908                               if (dt.Is(kDataTypeValueInvalid)) {
25909                                 UnallocatedT32(instr);
25910                                 return;
25911                               }
25912                               unsigned rd = ExtractDRegister(instr, 22, 12);
25913                               unsigned rn = ExtractDRegister(instr, 7, 16);
25914                               unsigned rm = ExtractDRegister(instr, 5, 0);
25915                               // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25916                               vqdmulh(CurrentCond(),
25917                                       dt,
25918                                       DRegister(rd),
25919                                       DRegister(rn),
25920                                       DRegister(rm));
25921                               break;
25922                             }
25923                             case 0x10000000: {
25924                               // 0xff000b00
25925                               DataType dt =
25926                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25927                               if (dt.Is(kDataTypeValueInvalid)) {
25928                                 UnallocatedT32(instr);
25929                                 return;
25930                               }
25931                               unsigned rd = ExtractDRegister(instr, 22, 12);
25932                               unsigned rn = ExtractDRegister(instr, 7, 16);
25933                               unsigned rm = ExtractDRegister(instr, 5, 0);
25934                               // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
25935                               vqrdmulh(CurrentCond(),
25936                                        dt,
25937                                        DRegister(rd),
25938                                        DRegister(rn),
25939                                        DRegister(rm));
25940                               break;
25941                             }
25942                           }
25943                           break;
25944                         }
25945                         case 0x00000b40: {
25946                           // 0xef000b40
25947                           switch (instr & 0x10000000) {
25948                             case 0x00000000: {
25949                               // 0xef000b40
25950                               DataType dt =
25951                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25952                               if (dt.Is(kDataTypeValueInvalid)) {
25953                                 UnallocatedT32(instr);
25954                                 return;
25955                               }
25956                               if (((instr >> 12) & 1) != 0) {
25957                                 UnallocatedT32(instr);
25958                                 return;
25959                               }
25960                               unsigned rd = ExtractQRegister(instr, 22, 12);
25961                               if (((instr >> 16) & 1) != 0) {
25962                                 UnallocatedT32(instr);
25963                                 return;
25964                               }
25965                               unsigned rn = ExtractQRegister(instr, 7, 16);
25966                               if ((instr & 1) != 0) {
25967                                 UnallocatedT32(instr);
25968                                 return;
25969                               }
25970                               unsigned rm = ExtractQRegister(instr, 5, 0);
25971                               // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
25972                               vqdmulh(CurrentCond(),
25973                                       dt,
25974                                       QRegister(rd),
25975                                       QRegister(rn),
25976                                       QRegister(rm));
25977                               break;
25978                             }
25979                             case 0x10000000: {
25980                               // 0xff000b40
25981                               DataType dt =
25982                                   Dt_size_13_Decode((instr >> 20) & 0x3);
25983                               if (dt.Is(kDataTypeValueInvalid)) {
25984                                 UnallocatedT32(instr);
25985                                 return;
25986                               }
25987                               if (((instr >> 12) & 1) != 0) {
25988                                 UnallocatedT32(instr);
25989                                 return;
25990                               }
25991                               unsigned rd = ExtractQRegister(instr, 22, 12);
25992                               if (((instr >> 16) & 1) != 0) {
25993                                 UnallocatedT32(instr);
25994                                 return;
25995                               }
25996                               unsigned rn = ExtractQRegister(instr, 7, 16);
25997                               if ((instr & 1) != 0) {
25998                                 UnallocatedT32(instr);
25999                                 return;
26000                               }
26001                               unsigned rm = ExtractQRegister(instr, 5, 0);
26002                               // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
26003                               vqrdmulh(CurrentCond(),
26004                                        dt,
26005                                        QRegister(rd),
26006                                        QRegister(rn),
26007                                        QRegister(rm));
26008                               break;
26009                             }
26010                           }
26011                           break;
26012                         }
26013                         case 0x00000c40: {
26014                           // 0xef000c40
26015                           switch (instr & 0x10300000) {
26016                             case 0x00000000: {
26017                               // 0xef000c40
26018                               UnimplementedT32_32("SHA1C", instr);
26019                               break;
26020                             }
26021                             case 0x00100000: {
26022                               // 0xef100c40
26023                               UnimplementedT32_32("SHA1P", instr);
26024                               break;
26025                             }
26026                             case 0x00200000: {
26027                               // 0xef200c40
26028                               UnimplementedT32_32("SHA1M", instr);
26029                               break;
26030                             }
26031                             case 0x00300000: {
26032                               // 0xef300c40
26033                               UnimplementedT32_32("SHA1SU0", instr);
26034                               break;
26035                             }
26036                             case 0x10000000: {
26037                               // 0xff000c40
26038                               UnimplementedT32_32("SHA256H", instr);
26039                               break;
26040                             }
26041                             case 0x10100000: {
26042                               // 0xff100c40
26043                               UnimplementedT32_32("SHA256H2", instr);
26044                               break;
26045                             }
26046                             case 0x10200000: {
26047                               // 0xff200c40
26048                               UnimplementedT32_32("SHA256SU1", instr);
26049                               break;
26050                             }
26051                             default:
26052                               UnallocatedT32(instr);
26053                               break;
26054                           }
26055                           break;
26056                         }
26057                         case 0x00000d00: {
26058                           // 0xef000d00
26059                           switch (instr & 0x10300000) {
26060                             case 0x00000000: {
26061                               // 0xef000d00
26062                               unsigned rd = ExtractDRegister(instr, 22, 12);
26063                               unsigned rn = ExtractDRegister(instr, 7, 16);
26064                               unsigned rm = ExtractDRegister(instr, 5, 0);
26065                               // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26066                               vadd(CurrentCond(),
26067                                    F32,
26068                                    DRegister(rd),
26069                                    DRegister(rn),
26070                                    DRegister(rm));
26071                               break;
26072                             }
26073                             case 0x00200000: {
26074                               // 0xef200d00
26075                               unsigned rd = ExtractDRegister(instr, 22, 12);
26076                               unsigned rn = ExtractDRegister(instr, 7, 16);
26077                               unsigned rm = ExtractDRegister(instr, 5, 0);
26078                               // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26079                               vsub(CurrentCond(),
26080                                    F32,
26081                                    DRegister(rd),
26082                                    DRegister(rn),
26083                                    DRegister(rm));
26084                               break;
26085                             }
26086                             case 0x10000000: {
26087                               // 0xff000d00
26088                               unsigned rd = ExtractDRegister(instr, 22, 12);
26089                               unsigned rn = ExtractDRegister(instr, 7, 16);
26090                               unsigned rm = ExtractDRegister(instr, 5, 0);
26091                               // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26092                               vpadd(CurrentCond(),
26093                                     F32,
26094                                     DRegister(rd),
26095                                     DRegister(rn),
26096                                     DRegister(rm));
26097                               break;
26098                             }
26099                             case 0x10200000: {
26100                               // 0xff200d00
26101                               unsigned rd = ExtractDRegister(instr, 22, 12);
26102                               unsigned rn = ExtractDRegister(instr, 7, 16);
26103                               unsigned rm = ExtractDRegister(instr, 5, 0);
26104                               // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26105                               vabd(CurrentCond(),
26106                                    F32,
26107                                    DRegister(rd),
26108                                    DRegister(rn),
26109                                    DRegister(rm));
26110                               break;
26111                             }
26112                             default:
26113                               UnallocatedT32(instr);
26114                               break;
26115                           }
26116                           break;
26117                         }
26118                         case 0x00000d40: {
26119                           // 0xef000d40
26120                           switch (instr & 0x10300000) {
26121                             case 0x00000000: {
26122                               // 0xef000d40
26123                               if (((instr >> 12) & 1) != 0) {
26124                                 UnallocatedT32(instr);
26125                                 return;
26126                               }
26127                               unsigned rd = ExtractQRegister(instr, 22, 12);
26128                               if (((instr >> 16) & 1) != 0) {
26129                                 UnallocatedT32(instr);
26130                                 return;
26131                               }
26132                               unsigned rn = ExtractQRegister(instr, 7, 16);
26133                               if ((instr & 1) != 0) {
26134                                 UnallocatedT32(instr);
26135                                 return;
26136                               }
26137                               unsigned rm = ExtractQRegister(instr, 5, 0);
26138                               // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26139                               vadd(CurrentCond(),
26140                                    F32,
26141                                    QRegister(rd),
26142                                    QRegister(rn),
26143                                    QRegister(rm));
26144                               break;
26145                             }
26146                             case 0x00200000: {
26147                               // 0xef200d40
26148                               if (((instr >> 12) & 1) != 0) {
26149                                 UnallocatedT32(instr);
26150                                 return;
26151                               }
26152                               unsigned rd = ExtractQRegister(instr, 22, 12);
26153                               if (((instr >> 16) & 1) != 0) {
26154                                 UnallocatedT32(instr);
26155                                 return;
26156                               }
26157                               unsigned rn = ExtractQRegister(instr, 7, 16);
26158                               if ((instr & 1) != 0) {
26159                                 UnallocatedT32(instr);
26160                                 return;
26161                               }
26162                               unsigned rm = ExtractQRegister(instr, 5, 0);
26163                               // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26164                               vsub(CurrentCond(),
26165                                    F32,
26166                                    QRegister(rd),
26167                                    QRegister(rn),
26168                                    QRegister(rm));
26169                               break;
26170                             }
26171                             case 0x10200000: {
26172                               // 0xff200d40
26173                               if (((instr >> 12) & 1) != 0) {
26174                                 UnallocatedT32(instr);
26175                                 return;
26176                               }
26177                               unsigned rd = ExtractQRegister(instr, 22, 12);
26178                               if (((instr >> 16) & 1) != 0) {
26179                                 UnallocatedT32(instr);
26180                                 return;
26181                               }
26182                               unsigned rn = ExtractQRegister(instr, 7, 16);
26183                               if ((instr & 1) != 0) {
26184                                 UnallocatedT32(instr);
26185                                 return;
26186                               }
26187                               unsigned rm = ExtractQRegister(instr, 5, 0);
26188                               // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26189                               vabd(CurrentCond(),
26190                                    F32,
26191                                    QRegister(rd),
26192                                    QRegister(rn),
26193                                    QRegister(rm));
26194                               break;
26195                             }
26196                             default:
26197                               UnallocatedT32(instr);
26198                               break;
26199                           }
26200                           break;
26201                         }
26202                         case 0x00000e00: {
26203                           // 0xef000e00
26204                           switch (instr & 0x10200000) {
26205                             case 0x00000000: {
26206                               // 0xef000e00
26207                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
26208                               if (dt.Is(kDataTypeValueInvalid)) {
26209                                 UnallocatedT32(instr);
26210                                 return;
26211                               }
26212                               unsigned rd = ExtractDRegister(instr, 22, 12);
26213                               unsigned rn = ExtractDRegister(instr, 7, 16);
26214                               unsigned rm = ExtractDRegister(instr, 5, 0);
26215                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
26216                               vceq(CurrentCond(),
26217                                    dt,
26218                                    DRegister(rd),
26219                                    DRegister(rn),
26220                                    DRegister(rm));
26221                               break;
26222                             }
26223                             case 0x10000000: {
26224                               // 0xff000e00
26225                               if ((instr & 0x00100000) == 0x00000000) {
26226                                 unsigned rd = ExtractDRegister(instr, 22, 12);
26227                                 unsigned rn = ExtractDRegister(instr, 7, 16);
26228                                 unsigned rm = ExtractDRegister(instr, 5, 0);
26229                                 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
26230                                 vcge(CurrentCond(),
26231                                      F32,
26232                                      DRegister(rd),
26233                                      DRegister(rn),
26234                                      DRegister(rm));
26235                               } else {
26236                                 UnallocatedT32(instr);
26237                               }
26238                               break;
26239                             }
26240                             case 0x10200000: {
26241                               // 0xff200e00
26242                               if ((instr & 0x00100000) == 0x00000000) {
26243                                 unsigned rd = ExtractDRegister(instr, 22, 12);
26244                                 unsigned rn = ExtractDRegister(instr, 7, 16);
26245                                 unsigned rm = ExtractDRegister(instr, 5, 0);
26246                                 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
26247                                 vcgt(CurrentCond(),
26248                                      F32,
26249                                      DRegister(rd),
26250                                      DRegister(rn),
26251                                      DRegister(rm));
26252                               } else {
26253                                 UnallocatedT32(instr);
26254                               }
26255                               break;
26256                             }
26257                             default:
26258                               UnallocatedT32(instr);
26259                               break;
26260                           }
26261                           break;
26262                         }
26263                         case 0x00000e40: {
26264                           // 0xef000e40
26265                           switch (instr & 0x10200000) {
26266                             case 0x00000000: {
26267                               // 0xef000e40
26268                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
26269                               if (dt.Is(kDataTypeValueInvalid)) {
26270                                 UnallocatedT32(instr);
26271                                 return;
26272                               }
26273                               if (((instr >> 12) & 1) != 0) {
26274                                 UnallocatedT32(instr);
26275                                 return;
26276                               }
26277                               unsigned rd = ExtractQRegister(instr, 22, 12);
26278                               if (((instr >> 16) & 1) != 0) {
26279                                 UnallocatedT32(instr);
26280                                 return;
26281                               }
26282                               unsigned rn = ExtractQRegister(instr, 7, 16);
26283                               if ((instr & 1) != 0) {
26284                                 UnallocatedT32(instr);
26285                                 return;
26286                               }
26287                               unsigned rm = ExtractQRegister(instr, 5, 0);
26288                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
26289                               vceq(CurrentCond(),
26290                                    dt,
26291                                    QRegister(rd),
26292                                    QRegister(rn),
26293                                    QRegister(rm));
26294                               break;
26295                             }
26296                             case 0x10000000: {
26297                               // 0xff000e40
26298                               if ((instr & 0x00100000) == 0x00000000) {
26299                                 if (((instr >> 12) & 1) != 0) {
26300                                   UnallocatedT32(instr);
26301                                   return;
26302                                 }
26303                                 unsigned rd = ExtractQRegister(instr, 22, 12);
26304                                 if (((instr >> 16) & 1) != 0) {
26305                                   UnallocatedT32(instr);
26306                                   return;
26307                                 }
26308                                 unsigned rn = ExtractQRegister(instr, 7, 16);
26309                                 if ((instr & 1) != 0) {
26310                                   UnallocatedT32(instr);
26311                                   return;
26312                                 }
26313                                 unsigned rm = ExtractQRegister(instr, 5, 0);
26314                                 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
26315                                 vcge(CurrentCond(),
26316                                      F32,
26317                                      QRegister(rd),
26318                                      QRegister(rn),
26319                                      QRegister(rm));
26320                               } else {
26321                                 UnallocatedT32(instr);
26322                               }
26323                               break;
26324                             }
26325                             case 0x10200000: {
26326                               // 0xff200e40
26327                               if ((instr & 0x00100000) == 0x00000000) {
26328                                 if (((instr >> 12) & 1) != 0) {
26329                                   UnallocatedT32(instr);
26330                                   return;
26331                                 }
26332                                 unsigned rd = ExtractQRegister(instr, 22, 12);
26333                                 if (((instr >> 16) & 1) != 0) {
26334                                   UnallocatedT32(instr);
26335                                   return;
26336                                 }
26337                                 unsigned rn = ExtractQRegister(instr, 7, 16);
26338                                 if ((instr & 1) != 0) {
26339                                   UnallocatedT32(instr);
26340                                   return;
26341                                 }
26342                                 unsigned rm = ExtractQRegister(instr, 5, 0);
26343                                 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
26344                                 vcgt(CurrentCond(),
26345                                      F32,
26346                                      QRegister(rd),
26347                                      QRegister(rn),
26348                                      QRegister(rm));
26349                               } else {
26350                                 UnallocatedT32(instr);
26351                               }
26352                               break;
26353                             }
26354                             default:
26355                               UnallocatedT32(instr);
26356                               break;
26357                           }
26358                           break;
26359                         }
26360                         case 0x00000f00: {
26361                           // 0xef000f00
26362                           switch (instr & 0x10300000) {
26363                             case 0x00000000: {
26364                               // 0xef000f00
26365                               unsigned rd = ExtractDRegister(instr, 22, 12);
26366                               unsigned rn = ExtractDRegister(instr, 7, 16);
26367                               unsigned rm = ExtractDRegister(instr, 5, 0);
26368                               // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26369                               vmax(CurrentCond(),
26370                                    F32,
26371                                    DRegister(rd),
26372                                    DRegister(rn),
26373                                    DRegister(rm));
26374                               break;
26375                             }
26376                             case 0x00200000: {
26377                               // 0xef200f00
26378                               unsigned rd = ExtractDRegister(instr, 22, 12);
26379                               unsigned rn = ExtractDRegister(instr, 7, 16);
26380                               unsigned rm = ExtractDRegister(instr, 5, 0);
26381                               // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26382                               vmin(CurrentCond(),
26383                                    F32,
26384                                    DRegister(rd),
26385                                    DRegister(rn),
26386                                    DRegister(rm));
26387                               break;
26388                             }
26389                             case 0x10000000: {
26390                               // 0xff000f00
26391                               unsigned rd = ExtractDRegister(instr, 22, 12);
26392                               unsigned rn = ExtractDRegister(instr, 7, 16);
26393                               unsigned rm = ExtractDRegister(instr, 5, 0);
26394                               // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26395                               vpmax(CurrentCond(),
26396                                     F32,
26397                                     DRegister(rd),
26398                                     DRegister(rn),
26399                                     DRegister(rm));
26400                               break;
26401                             }
26402                             case 0x10200000: {
26403                               // 0xff200f00
26404                               unsigned rd = ExtractDRegister(instr, 22, 12);
26405                               unsigned rn = ExtractDRegister(instr, 7, 16);
26406                               unsigned rm = ExtractDRegister(instr, 5, 0);
26407                               // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
26408                               vpmin(CurrentCond(),
26409                                     F32,
26410                                     DRegister(rd),
26411                                     DRegister(rn),
26412                                     DRegister(rm));
26413                               break;
26414                             }
26415                             default:
26416                               UnallocatedT32(instr);
26417                               break;
26418                           }
26419                           break;
26420                         }
26421                         case 0x00000f40: {
26422                           // 0xef000f40
26423                           switch (instr & 0x10300000) {
26424                             case 0x00000000: {
26425                               // 0xef000f40
26426                               if (((instr >> 12) & 1) != 0) {
26427                                 UnallocatedT32(instr);
26428                                 return;
26429                               }
26430                               unsigned rd = ExtractQRegister(instr, 22, 12);
26431                               if (((instr >> 16) & 1) != 0) {
26432                                 UnallocatedT32(instr);
26433                                 return;
26434                               }
26435                               unsigned rn = ExtractQRegister(instr, 7, 16);
26436                               if ((instr & 1) != 0) {
26437                                 UnallocatedT32(instr);
26438                                 return;
26439                               }
26440                               unsigned rm = ExtractQRegister(instr, 5, 0);
26441                               // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26442                               vmax(CurrentCond(),
26443                                    F32,
26444                                    QRegister(rd),
26445                                    QRegister(rn),
26446                                    QRegister(rm));
26447                               break;
26448                             }
26449                             case 0x00200000: {
26450                               // 0xef200f40
26451                               if (((instr >> 12) & 1) != 0) {
26452                                 UnallocatedT32(instr);
26453                                 return;
26454                               }
26455                               unsigned rd = ExtractQRegister(instr, 22, 12);
26456                               if (((instr >> 16) & 1) != 0) {
26457                                 UnallocatedT32(instr);
26458                                 return;
26459                               }
26460                               unsigned rn = ExtractQRegister(instr, 7, 16);
26461                               if ((instr & 1) != 0) {
26462                                 UnallocatedT32(instr);
26463                                 return;
26464                               }
26465                               unsigned rm = ExtractQRegister(instr, 5, 0);
26466                               // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
26467                               vmin(CurrentCond(),
26468                                    F32,
26469                                    QRegister(rd),
26470                                    QRegister(rn),
26471                                    QRegister(rm));
26472                               break;
26473                             }
26474                             default:
26475                               UnallocatedT32(instr);
26476                               break;
26477                           }
26478                           break;
26479                         }
26480                         default:
26481                           UnallocatedT32(instr);
26482                           break;
26483                       }
26484                       break;
26485                     }
26486                     case 0x00800000: {
26487                       // 0xef800000
26488                       switch (instr & 0x00300000) {
26489                         case 0x00300000: {
26490                           // 0xefb00000
26491                           switch (instr & 0x10000000) {
26492                             case 0x00000000: {
26493                               // 0xefb00000
26494                               switch (instr & 0x00000040) {
26495                                 case 0x00000000: {
26496                                   // 0xefb00000
26497                                   if (((instr & 0x800) == 0x800)) {
26498                                     UnallocatedT32(instr);
26499                                     return;
26500                                   }
26501                                   unsigned rd = ExtractDRegister(instr, 22, 12);
26502                                   unsigned rn = ExtractDRegister(instr, 7, 16);
26503                                   unsigned rm = ExtractDRegister(instr, 5, 0);
26504                                   uint32_t imm = (instr >> 8) & 0xf;
26505                                   // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26506                                   vext(CurrentCond(),
26507                                        Untyped8,
26508                                        DRegister(rd),
26509                                        DRegister(rn),
26510                                        DRegister(rm),
26511                                        imm);
26512                                   break;
26513                                 }
26514                                 case 0x00000040: {
26515                                   // 0xefb00040
26516                                   if (((instr >> 12) & 1) != 0) {
26517                                     UnallocatedT32(instr);
26518                                     return;
26519                                   }
26520                                   unsigned rd = ExtractQRegister(instr, 22, 12);
26521                                   if (((instr >> 16) & 1) != 0) {
26522                                     UnallocatedT32(instr);
26523                                     return;
26524                                   }
26525                                   unsigned rn = ExtractQRegister(instr, 7, 16);
26526                                   if ((instr & 1) != 0) {
26527                                     UnallocatedT32(instr);
26528                                     return;
26529                                   }
26530                                   unsigned rm = ExtractQRegister(instr, 5, 0);
26531                                   uint32_t imm = (instr >> 8) & 0xf;
26532                                   // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
26533                                   vext(CurrentCond(),
26534                                        Untyped8,
26535                                        QRegister(rd),
26536                                        QRegister(rn),
26537                                        QRegister(rm),
26538                                        imm);
26539                                   break;
26540                                 }
26541                               }
26542                               break;
26543                             }
26544                             case 0x10000000: {
26545                               // 0xffb00000
26546                               switch (instr & 0x00000800) {
26547                                 case 0x00000000: {
26548                                   // 0xffb00000
26549                                   switch (instr & 0x00030200) {
26550                                     case 0x00000000: {
26551                                       // 0xffb00000
26552                                       switch (instr & 0x000005c0) {
26553                                         case 0x00000000: {
26554                                           // 0xffb00000
26555                                           DataType dt = Dt_size_7_Decode(
26556                                               (instr >> 18) & 0x3);
26557                                           if (dt.Is(kDataTypeValueInvalid)) {
26558                                             UnallocatedT32(instr);
26559                                             return;
26560                                           }
26561                                           unsigned rd =
26562                                               ExtractDRegister(instr, 22, 12);
26563                                           unsigned rm =
26564                                               ExtractDRegister(instr, 5, 0);
26565                                           // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26566                                           vrev64(CurrentCond(),
26567                                                  dt,
26568                                                  DRegister(rd),
26569                                                  DRegister(rm));
26570                                           break;
26571                                         }
26572                                         case 0x00000040: {
26573                                           // 0xffb00040
26574                                           DataType dt = Dt_size_7_Decode(
26575                                               (instr >> 18) & 0x3);
26576                                           if (dt.Is(kDataTypeValueInvalid)) {
26577                                             UnallocatedT32(instr);
26578                                             return;
26579                                           }
26580                                           if (((instr >> 12) & 1) != 0) {
26581                                             UnallocatedT32(instr);
26582                                             return;
26583                                           }
26584                                           unsigned rd =
26585                                               ExtractQRegister(instr, 22, 12);
26586                                           if ((instr & 1) != 0) {
26587                                             UnallocatedT32(instr);
26588                                             return;
26589                                           }
26590                                           unsigned rm =
26591                                               ExtractQRegister(instr, 5, 0);
26592                                           // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26593                                           vrev64(CurrentCond(),
26594                                                  dt,
26595                                                  QRegister(rd),
26596                                                  QRegister(rm));
26597                                           break;
26598                                         }
26599                                         case 0x00000080: {
26600                                           // 0xffb00080
26601                                           DataType dt = Dt_size_15_Decode(
26602                                               (instr >> 18) & 0x3);
26603                                           if (dt.Is(kDataTypeValueInvalid)) {
26604                                             UnallocatedT32(instr);
26605                                             return;
26606                                           }
26607                                           unsigned rd =
26608                                               ExtractDRegister(instr, 22, 12);
26609                                           unsigned rm =
26610                                               ExtractDRegister(instr, 5, 0);
26611                                           // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26612                                           vrev32(CurrentCond(),
26613                                                  dt,
26614                                                  DRegister(rd),
26615                                                  DRegister(rm));
26616                                           break;
26617                                         }
26618                                         case 0x000000c0: {
26619                                           // 0xffb000c0
26620                                           DataType dt = Dt_size_15_Decode(
26621                                               (instr >> 18) & 0x3);
26622                                           if (dt.Is(kDataTypeValueInvalid)) {
26623                                             UnallocatedT32(instr);
26624                                             return;
26625                                           }
26626                                           if (((instr >> 12) & 1) != 0) {
26627                                             UnallocatedT32(instr);
26628                                             return;
26629                                           }
26630                                           unsigned rd =
26631                                               ExtractQRegister(instr, 22, 12);
26632                                           if ((instr & 1) != 0) {
26633                                             UnallocatedT32(instr);
26634                                             return;
26635                                           }
26636                                           unsigned rm =
26637                                               ExtractQRegister(instr, 5, 0);
26638                                           // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26639                                           vrev32(CurrentCond(),
26640                                                  dt,
26641                                                  QRegister(rd),
26642                                                  QRegister(rm));
26643                                           break;
26644                                         }
26645                                         case 0x00000100: {
26646                                           // 0xffb00100
26647                                           DataType dt = Dt_size_1_Decode(
26648                                               (instr >> 18) & 0x3);
26649                                           if (dt.Is(kDataTypeValueInvalid)) {
26650                                             UnallocatedT32(instr);
26651                                             return;
26652                                           }
26653                                           unsigned rd =
26654                                               ExtractDRegister(instr, 22, 12);
26655                                           unsigned rm =
26656                                               ExtractDRegister(instr, 5, 0);
26657                                           // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26658                                           vrev16(CurrentCond(),
26659                                                  dt,
26660                                                  DRegister(rd),
26661                                                  DRegister(rm));
26662                                           break;
26663                                         }
26664                                         case 0x00000140: {
26665                                           // 0xffb00140
26666                                           DataType dt = Dt_size_1_Decode(
26667                                               (instr >> 18) & 0x3);
26668                                           if (dt.Is(kDataTypeValueInvalid)) {
26669                                             UnallocatedT32(instr);
26670                                             return;
26671                                           }
26672                                           if (((instr >> 12) & 1) != 0) {
26673                                             UnallocatedT32(instr);
26674                                             return;
26675                                           }
26676                                           unsigned rd =
26677                                               ExtractQRegister(instr, 22, 12);
26678                                           if ((instr & 1) != 0) {
26679                                             UnallocatedT32(instr);
26680                                             return;
26681                                           }
26682                                           unsigned rm =
26683                                               ExtractQRegister(instr, 5, 0);
26684                                           // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26685                                           vrev16(CurrentCond(),
26686                                                  dt,
26687                                                  QRegister(rd),
26688                                                  QRegister(rm));
26689                                           break;
26690                                         }
26691                                         case 0x00000400: {
26692                                           // 0xffb00400
26693                                           DataType dt = Dt_size_5_Decode(
26694                                               (instr >> 18) & 0x3);
26695                                           if (dt.Is(kDataTypeValueInvalid)) {
26696                                             UnallocatedT32(instr);
26697                                             return;
26698                                           }
26699                                           unsigned rd =
26700                                               ExtractDRegister(instr, 22, 12);
26701                                           unsigned rm =
26702                                               ExtractDRegister(instr, 5, 0);
26703                                           // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26704                                           vcls(CurrentCond(),
26705                                                dt,
26706                                                DRegister(rd),
26707                                                DRegister(rm));
26708                                           break;
26709                                         }
26710                                         case 0x00000440: {
26711                                           // 0xffb00440
26712                                           DataType dt = Dt_size_5_Decode(
26713                                               (instr >> 18) & 0x3);
26714                                           if (dt.Is(kDataTypeValueInvalid)) {
26715                                             UnallocatedT32(instr);
26716                                             return;
26717                                           }
26718                                           if (((instr >> 12) & 1) != 0) {
26719                                             UnallocatedT32(instr);
26720                                             return;
26721                                           }
26722                                           unsigned rd =
26723                                               ExtractQRegister(instr, 22, 12);
26724                                           if ((instr & 1) != 0) {
26725                                             UnallocatedT32(instr);
26726                                             return;
26727                                           }
26728                                           unsigned rm =
26729                                               ExtractQRegister(instr, 5, 0);
26730                                           // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26731                                           vcls(CurrentCond(),
26732                                                dt,
26733                                                QRegister(rd),
26734                                                QRegister(rm));
26735                                           break;
26736                                         }
26737                                         case 0x00000480: {
26738                                           // 0xffb00480
26739                                           DataType dt = Dt_size_4_Decode(
26740                                               (instr >> 18) & 0x3);
26741                                           if (dt.Is(kDataTypeValueInvalid)) {
26742                                             UnallocatedT32(instr);
26743                                             return;
26744                                           }
26745                                           unsigned rd =
26746                                               ExtractDRegister(instr, 22, 12);
26747                                           unsigned rm =
26748                                               ExtractDRegister(instr, 5, 0);
26749                                           // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
26750                                           vclz(CurrentCond(),
26751                                                dt,
26752                                                DRegister(rd),
26753                                                DRegister(rm));
26754                                           break;
26755                                         }
26756                                         case 0x000004c0: {
26757                                           // 0xffb004c0
26758                                           DataType dt = Dt_size_4_Decode(
26759                                               (instr >> 18) & 0x3);
26760                                           if (dt.Is(kDataTypeValueInvalid)) {
26761                                             UnallocatedT32(instr);
26762                                             return;
26763                                           }
26764                                           if (((instr >> 12) & 1) != 0) {
26765                                             UnallocatedT32(instr);
26766                                             return;
26767                                           }
26768                                           unsigned rd =
26769                                               ExtractQRegister(instr, 22, 12);
26770                                           if ((instr & 1) != 0) {
26771                                             UnallocatedT32(instr);
26772                                             return;
26773                                           }
26774                                           unsigned rm =
26775                                               ExtractQRegister(instr, 5, 0);
26776                                           // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
26777                                           vclz(CurrentCond(),
26778                                                dt,
26779                                                QRegister(rd),
26780                                                QRegister(rm));
26781                                           break;
26782                                         }
26783                                         case 0x00000500: {
26784                                           // 0xffb00500
26785                                           if ((instr & 0x000c0000) ==
26786                                               0x00000000) {
26787                                             unsigned rd =
26788                                                 ExtractDRegister(instr, 22, 12);
26789                                             unsigned rm =
26790                                                 ExtractDRegister(instr, 5, 0);
26791                                             // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
26792                                             vcnt(CurrentCond(),
26793                                                  Untyped8,
26794                                                  DRegister(rd),
26795                                                  DRegister(rm));
26796                                           } else {
26797                                             UnallocatedT32(instr);
26798                                           }
26799                                           break;
26800                                         }
26801                                         case 0x00000540: {
26802                                           // 0xffb00540
26803                                           if ((instr & 0x000c0000) ==
26804                                               0x00000000) {
26805                                             if (((instr >> 12) & 1) != 0) {
26806                                               UnallocatedT32(instr);
26807                                               return;
26808                                             }
26809                                             unsigned rd =
26810                                                 ExtractQRegister(instr, 22, 12);
26811                                             if ((instr & 1) != 0) {
26812                                               UnallocatedT32(instr);
26813                                               return;
26814                                             }
26815                                             unsigned rm =
26816                                                 ExtractQRegister(instr, 5, 0);
26817                                             // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
26818                                             vcnt(CurrentCond(),
26819                                                  Untyped8,
26820                                                  QRegister(rd),
26821                                                  QRegister(rm));
26822                                           } else {
26823                                             UnallocatedT32(instr);
26824                                           }
26825                                           break;
26826                                         }
26827                                         case 0x00000580: {
26828                                           // 0xffb00580
26829                                           if ((instr & 0x000c0000) ==
26830                                               0x00000000) {
26831                                             unsigned rd =
26832                                                 ExtractDRegister(instr, 22, 12);
26833                                             unsigned rm =
26834                                                 ExtractDRegister(instr, 5, 0);
26835                                             // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26836                                             vmvn(CurrentCond(),
26837                                                  kDataTypeValueNone,
26838                                                  DRegister(rd),
26839                                                  DRegister(rm));
26840                                           } else {
26841                                             UnallocatedT32(instr);
26842                                           }
26843                                           break;
26844                                         }
26845                                         case 0x000005c0: {
26846                                           // 0xffb005c0
26847                                           if ((instr & 0x000c0000) ==
26848                                               0x00000000) {
26849                                             if (((instr >> 12) & 1) != 0) {
26850                                               UnallocatedT32(instr);
26851                                               return;
26852                                             }
26853                                             unsigned rd =
26854                                                 ExtractQRegister(instr, 22, 12);
26855                                             if ((instr & 1) != 0) {
26856                                               UnallocatedT32(instr);
26857                                               return;
26858                                             }
26859                                             unsigned rm =
26860                                                 ExtractQRegister(instr, 5, 0);
26861                                             // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26862                                             vmvn(CurrentCond(),
26863                                                  kDataTypeValueNone,
26864                                                  QRegister(rd),
26865                                                  QRegister(rm));
26866                                           } else {
26867                                             UnallocatedT32(instr);
26868                                           }
26869                                           break;
26870                                         }
26871                                         default:
26872                                           UnallocatedT32(instr);
26873                                           break;
26874                                       }
26875                                       break;
26876                                     }
26877                                     case 0x00000200: {
26878                                       // 0xffb00200
26879                                       switch (instr & 0x00000540) {
26880                                         case 0x00000000: {
26881                                           // 0xffb00200
26882                                           DataType dt = Dt_op_size_2_Decode(
26883                                               ((instr >> 18) & 0x3) |
26884                                               ((instr >> 5) & 0x4));
26885                                           if (dt.Is(kDataTypeValueInvalid)) {
26886                                             UnallocatedT32(instr);
26887                                             return;
26888                                           }
26889                                           unsigned rd =
26890                                               ExtractDRegister(instr, 22, 12);
26891                                           unsigned rm =
26892                                               ExtractDRegister(instr, 5, 0);
26893                                           // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26894                                           vpaddl(CurrentCond(),
26895                                                  dt,
26896                                                  DRegister(rd),
26897                                                  DRegister(rm));
26898                                           break;
26899                                         }
26900                                         case 0x00000040: {
26901                                           // 0xffb00240
26902                                           DataType dt = Dt_op_size_2_Decode(
26903                                               ((instr >> 18) & 0x3) |
26904                                               ((instr >> 5) & 0x4));
26905                                           if (dt.Is(kDataTypeValueInvalid)) {
26906                                             UnallocatedT32(instr);
26907                                             return;
26908                                           }
26909                                           if (((instr >> 12) & 1) != 0) {
26910                                             UnallocatedT32(instr);
26911                                             return;
26912                                           }
26913                                           unsigned rd =
26914                                               ExtractQRegister(instr, 22, 12);
26915                                           if ((instr & 1) != 0) {
26916                                             UnallocatedT32(instr);
26917                                             return;
26918                                           }
26919                                           unsigned rm =
26920                                               ExtractQRegister(instr, 5, 0);
26921                                           // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
26922                                           vpaddl(CurrentCond(),
26923                                                  dt,
26924                                                  QRegister(rd),
26925                                                  QRegister(rm));
26926                                           break;
26927                                         }
26928                                         case 0x00000100: {
26929                                           // 0xffb00300
26930                                           switch (instr & 0x00000080) {
26931                                             case 0x00000000: {
26932                                               // 0xffb00300
26933                                               UnimplementedT32_32("AESE",
26934                                                                   instr);
26935                                               break;
26936                                             }
26937                                             case 0x00000080: {
26938                                               // 0xffb00380
26939                                               UnimplementedT32_32("AESMC",
26940                                                                   instr);
26941                                               break;
26942                                             }
26943                                           }
26944                                           break;
26945                                         }
26946                                         case 0x00000140: {
26947                                           // 0xffb00340
26948                                           switch (instr & 0x00000080) {
26949                                             case 0x00000000: {
26950                                               // 0xffb00340
26951                                               UnimplementedT32_32("AESD",
26952                                                                   instr);
26953                                               break;
26954                                             }
26955                                             case 0x00000080: {
26956                                               // 0xffb003c0
26957                                               UnimplementedT32_32("AESIMC",
26958                                                                   instr);
26959                                               break;
26960                                             }
26961                                           }
26962                                           break;
26963                                         }
26964                                         case 0x00000400: {
26965                                           // 0xffb00600
26966                                           DataType dt = Dt_op_size_2_Decode(
26967                                               ((instr >> 18) & 0x3) |
26968                                               ((instr >> 5) & 0x4));
26969                                           if (dt.Is(kDataTypeValueInvalid)) {
26970                                             UnallocatedT32(instr);
26971                                             return;
26972                                           }
26973                                           unsigned rd =
26974                                               ExtractDRegister(instr, 22, 12);
26975                                           unsigned rm =
26976                                               ExtractDRegister(instr, 5, 0);
26977                                           // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
26978                                           vpadal(CurrentCond(),
26979                                                  dt,
26980                                                  DRegister(rd),
26981                                                  DRegister(rm));
26982                                           break;
26983                                         }
26984                                         case 0x00000440: {
26985                                           // 0xffb00640
26986                                           DataType dt = Dt_op_size_2_Decode(
26987                                               ((instr >> 18) & 0x3) |
26988                                               ((instr >> 5) & 0x4));
26989                                           if (dt.Is(kDataTypeValueInvalid)) {
26990                                             UnallocatedT32(instr);
26991                                             return;
26992                                           }
26993                                           if (((instr >> 12) & 1) != 0) {
26994                                             UnallocatedT32(instr);
26995                                             return;
26996                                           }
26997                                           unsigned rd =
26998                                               ExtractQRegister(instr, 22, 12);
26999                                           if ((instr & 1) != 0) {
27000                                             UnallocatedT32(instr);
27001                                             return;
27002                                           }
27003                                           unsigned rm =
27004                                               ExtractQRegister(instr, 5, 0);
27005                                           // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27006                                           vpadal(CurrentCond(),
27007                                                  dt,
27008                                                  QRegister(rd),
27009                                                  QRegister(rm));
27010                                           break;
27011                                         }
27012                                         case 0x00000500: {
27013                                           // 0xffb00700
27014                                           switch (instr & 0x00000080) {
27015                                             case 0x00000000: {
27016                                               // 0xffb00700
27017                                               DataType dt = Dt_size_5_Decode(
27018                                                   (instr >> 18) & 0x3);
27019                                               if (dt.Is(
27020                                                       kDataTypeValueInvalid)) {
27021                                                 UnallocatedT32(instr);
27022                                                 return;
27023                                               }
27024                                               unsigned rd =
27025                                                   ExtractDRegister(instr,
27026                                                                    22,
27027                                                                    12);
27028                                               unsigned rm =
27029                                                   ExtractDRegister(instr, 5, 0);
27030                                               // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27031                                               vqabs(CurrentCond(),
27032                                                     dt,
27033                                                     DRegister(rd),
27034                                                     DRegister(rm));
27035                                               break;
27036                                             }
27037                                             case 0x00000080: {
27038                                               // 0xffb00780
27039                                               DataType dt = Dt_size_5_Decode(
27040                                                   (instr >> 18) & 0x3);
27041                                               if (dt.Is(
27042                                                       kDataTypeValueInvalid)) {
27043                                                 UnallocatedT32(instr);
27044                                                 return;
27045                                               }
27046                                               unsigned rd =
27047                                                   ExtractDRegister(instr,
27048                                                                    22,
27049                                                                    12);
27050                                               unsigned rm =
27051                                                   ExtractDRegister(instr, 5, 0);
27052                                               // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27053                                               vqneg(CurrentCond(),
27054                                                     dt,
27055                                                     DRegister(rd),
27056                                                     DRegister(rm));
27057                                               break;
27058                                             }
27059                                           }
27060                                           break;
27061                                         }
27062                                         case 0x00000540: {
27063                                           // 0xffb00740
27064                                           switch (instr & 0x00000080) {
27065                                             case 0x00000000: {
27066                                               // 0xffb00740
27067                                               DataType dt = Dt_size_5_Decode(
27068                                                   (instr >> 18) & 0x3);
27069                                               if (dt.Is(
27070                                                       kDataTypeValueInvalid)) {
27071                                                 UnallocatedT32(instr);
27072                                                 return;
27073                                               }
27074                                               if (((instr >> 12) & 1) != 0) {
27075                                                 UnallocatedT32(instr);
27076                                                 return;
27077                                               }
27078                                               unsigned rd =
27079                                                   ExtractQRegister(instr,
27080                                                                    22,
27081                                                                    12);
27082                                               if ((instr & 1) != 0) {
27083                                                 UnallocatedT32(instr);
27084                                                 return;
27085                                               }
27086                                               unsigned rm =
27087                                                   ExtractQRegister(instr, 5, 0);
27088                                               // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27089                                               vqabs(CurrentCond(),
27090                                                     dt,
27091                                                     QRegister(rd),
27092                                                     QRegister(rm));
27093                                               break;
27094                                             }
27095                                             case 0x00000080: {
27096                                               // 0xffb007c0
27097                                               DataType dt = Dt_size_5_Decode(
27098                                                   (instr >> 18) & 0x3);
27099                                               if (dt.Is(
27100                                                       kDataTypeValueInvalid)) {
27101                                                 UnallocatedT32(instr);
27102                                                 return;
27103                                               }
27104                                               if (((instr >> 12) & 1) != 0) {
27105                                                 UnallocatedT32(instr);
27106                                                 return;
27107                                               }
27108                                               unsigned rd =
27109                                                   ExtractQRegister(instr,
27110                                                                    22,
27111                                                                    12);
27112                                               if ((instr & 1) != 0) {
27113                                                 UnallocatedT32(instr);
27114                                                 return;
27115                                               }
27116                                               unsigned rm =
27117                                                   ExtractQRegister(instr, 5, 0);
27118                                               // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27119                                               vqneg(CurrentCond(),
27120                                                     dt,
27121                                                     QRegister(rd),
27122                                                     QRegister(rm));
27123                                               break;
27124                                             }
27125                                           }
27126                                           break;
27127                                         }
27128                                       }
27129                                       break;
27130                                     }
27131                                     case 0x00010000: {
27132                                       // 0xffb10000
27133                                       switch (instr & 0x000001c0) {
27134                                         case 0x00000000: {
27135                                           // 0xffb10000
27136                                           DataType dt = Dt_F_size_1_Decode(
27137                                               ((instr >> 18) & 0x3) |
27138                                               ((instr >> 8) & 0x4));
27139                                           if (dt.Is(kDataTypeValueInvalid)) {
27140                                             UnallocatedT32(instr);
27141                                             return;
27142                                           }
27143                                           unsigned rd =
27144                                               ExtractDRegister(instr, 22, 12);
27145                                           unsigned rm =
27146                                               ExtractDRegister(instr, 5, 0);
27147                                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27148                                           vcgt(CurrentCond(),
27149                                                dt,
27150                                                DRegister(rd),
27151                                                DRegister(rm),
27152                                                UINT32_C(0));
27153                                           break;
27154                                         }
27155                                         case 0x00000040: {
27156                                           // 0xffb10040
27157                                           DataType dt = Dt_F_size_1_Decode(
27158                                               ((instr >> 18) & 0x3) |
27159                                               ((instr >> 8) & 0x4));
27160                                           if (dt.Is(kDataTypeValueInvalid)) {
27161                                             UnallocatedT32(instr);
27162                                             return;
27163                                           }
27164                                           if (((instr >> 12) & 1) != 0) {
27165                                             UnallocatedT32(instr);
27166                                             return;
27167                                           }
27168                                           unsigned rd =
27169                                               ExtractQRegister(instr, 22, 12);
27170                                           if ((instr & 1) != 0) {
27171                                             UnallocatedT32(instr);
27172                                             return;
27173                                           }
27174                                           unsigned rm =
27175                                               ExtractQRegister(instr, 5, 0);
27176                                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27177                                           vcgt(CurrentCond(),
27178                                                dt,
27179                                                QRegister(rd),
27180                                                QRegister(rm),
27181                                                UINT32_C(0));
27182                                           break;
27183                                         }
27184                                         case 0x00000080: {
27185                                           // 0xffb10080
27186                                           DataType dt = Dt_F_size_1_Decode(
27187                                               ((instr >> 18) & 0x3) |
27188                                               ((instr >> 8) & 0x4));
27189                                           if (dt.Is(kDataTypeValueInvalid)) {
27190                                             UnallocatedT32(instr);
27191                                             return;
27192                                           }
27193                                           unsigned rd =
27194                                               ExtractDRegister(instr, 22, 12);
27195                                           unsigned rm =
27196                                               ExtractDRegister(instr, 5, 0);
27197                                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27198                                           vcge(CurrentCond(),
27199                                                dt,
27200                                                DRegister(rd),
27201                                                DRegister(rm),
27202                                                UINT32_C(0));
27203                                           break;
27204                                         }
27205                                         case 0x000000c0: {
27206                                           // 0xffb100c0
27207                                           DataType dt = Dt_F_size_1_Decode(
27208                                               ((instr >> 18) & 0x3) |
27209                                               ((instr >> 8) & 0x4));
27210                                           if (dt.Is(kDataTypeValueInvalid)) {
27211                                             UnallocatedT32(instr);
27212                                             return;
27213                                           }
27214                                           if (((instr >> 12) & 1) != 0) {
27215                                             UnallocatedT32(instr);
27216                                             return;
27217                                           }
27218                                           unsigned rd =
27219                                               ExtractQRegister(instr, 22, 12);
27220                                           if ((instr & 1) != 0) {
27221                                             UnallocatedT32(instr);
27222                                             return;
27223                                           }
27224                                           unsigned rm =
27225                                               ExtractQRegister(instr, 5, 0);
27226                                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27227                                           vcge(CurrentCond(),
27228                                                dt,
27229                                                QRegister(rd),
27230                                                QRegister(rm),
27231                                                UINT32_C(0));
27232                                           break;
27233                                         }
27234                                         case 0x00000100: {
27235                                           // 0xffb10100
27236                                           DataType dt = Dt_F_size_2_Decode(
27237                                               ((instr >> 18) & 0x3) |
27238                                               ((instr >> 8) & 0x4));
27239                                           if (dt.Is(kDataTypeValueInvalid)) {
27240                                             UnallocatedT32(instr);
27241                                             return;
27242                                           }
27243                                           unsigned rd =
27244                                               ExtractDRegister(instr, 22, 12);
27245                                           unsigned rm =
27246                                               ExtractDRegister(instr, 5, 0);
27247                                           // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27248                                           vceq(CurrentCond(),
27249                                                dt,
27250                                                DRegister(rd),
27251                                                DRegister(rm),
27252                                                UINT32_C(0));
27253                                           break;
27254                                         }
27255                                         case 0x00000140: {
27256                                           // 0xffb10140
27257                                           DataType dt = Dt_F_size_2_Decode(
27258                                               ((instr >> 18) & 0x3) |
27259                                               ((instr >> 8) & 0x4));
27260                                           if (dt.Is(kDataTypeValueInvalid)) {
27261                                             UnallocatedT32(instr);
27262                                             return;
27263                                           }
27264                                           if (((instr >> 12) & 1) != 0) {
27265                                             UnallocatedT32(instr);
27266                                             return;
27267                                           }
27268                                           unsigned rd =
27269                                               ExtractQRegister(instr, 22, 12);
27270                                           if ((instr & 1) != 0) {
27271                                             UnallocatedT32(instr);
27272                                             return;
27273                                           }
27274                                           unsigned rm =
27275                                               ExtractQRegister(instr, 5, 0);
27276                                           // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27277                                           vceq(CurrentCond(),
27278                                                dt,
27279                                                QRegister(rd),
27280                                                QRegister(rm),
27281                                                UINT32_C(0));
27282                                           break;
27283                                         }
27284                                         case 0x00000180: {
27285                                           // 0xffb10180
27286                                           DataType dt = Dt_F_size_1_Decode(
27287                                               ((instr >> 18) & 0x3) |
27288                                               ((instr >> 8) & 0x4));
27289                                           if (dt.Is(kDataTypeValueInvalid)) {
27290                                             UnallocatedT32(instr);
27291                                             return;
27292                                           }
27293                                           unsigned rd =
27294                                               ExtractDRegister(instr, 22, 12);
27295                                           unsigned rm =
27296                                               ExtractDRegister(instr, 5, 0);
27297                                           // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27298                                           vcle(CurrentCond(),
27299                                                dt,
27300                                                DRegister(rd),
27301                                                DRegister(rm),
27302                                                UINT32_C(0));
27303                                           break;
27304                                         }
27305                                         case 0x000001c0: {
27306                                           // 0xffb101c0
27307                                           DataType dt = Dt_F_size_1_Decode(
27308                                               ((instr >> 18) & 0x3) |
27309                                               ((instr >> 8) & 0x4));
27310                                           if (dt.Is(kDataTypeValueInvalid)) {
27311                                             UnallocatedT32(instr);
27312                                             return;
27313                                           }
27314                                           if (((instr >> 12) & 1) != 0) {
27315                                             UnallocatedT32(instr);
27316                                             return;
27317                                           }
27318                                           unsigned rd =
27319                                               ExtractQRegister(instr, 22, 12);
27320                                           if ((instr & 1) != 0) {
27321                                             UnallocatedT32(instr);
27322                                             return;
27323                                           }
27324                                           unsigned rm =
27325                                               ExtractQRegister(instr, 5, 0);
27326                                           // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27327                                           vcle(CurrentCond(),
27328                                                dt,
27329                                                QRegister(rd),
27330                                                QRegister(rm),
27331                                                UINT32_C(0));
27332                                           break;
27333                                         }
27334                                       }
27335                                       break;
27336                                     }
27337                                     case 0x00010200: {
27338                                       // 0xffb10200
27339                                       switch (instr & 0x000001c0) {
27340                                         case 0x00000000: {
27341                                           // 0xffb10200
27342                                           DataType dt = Dt_F_size_1_Decode(
27343                                               ((instr >> 18) & 0x3) |
27344                                               ((instr >> 8) & 0x4));
27345                                           if (dt.Is(kDataTypeValueInvalid)) {
27346                                             UnallocatedT32(instr);
27347                                             return;
27348                                           }
27349                                           unsigned rd =
27350                                               ExtractDRegister(instr, 22, 12);
27351                                           unsigned rm =
27352                                               ExtractDRegister(instr, 5, 0);
27353                                           // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
27354                                           vclt(CurrentCond(),
27355                                                dt,
27356                                                DRegister(rd),
27357                                                DRegister(rm),
27358                                                UINT32_C(0));
27359                                           break;
27360                                         }
27361                                         case 0x00000040: {
27362                                           // 0xffb10240
27363                                           DataType dt = Dt_F_size_1_Decode(
27364                                               ((instr >> 18) & 0x3) |
27365                                               ((instr >> 8) & 0x4));
27366                                           if (dt.Is(kDataTypeValueInvalid)) {
27367                                             UnallocatedT32(instr);
27368                                             return;
27369                                           }
27370                                           if (((instr >> 12) & 1) != 0) {
27371                                             UnallocatedT32(instr);
27372                                             return;
27373                                           }
27374                                           unsigned rd =
27375                                               ExtractQRegister(instr, 22, 12);
27376                                           if ((instr & 1) != 0) {
27377                                             UnallocatedT32(instr);
27378                                             return;
27379                                           }
27380                                           unsigned rm =
27381                                               ExtractQRegister(instr, 5, 0);
27382                                           // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
27383                                           vclt(CurrentCond(),
27384                                                dt,
27385                                                QRegister(rd),
27386                                                QRegister(rm),
27387                                                UINT32_C(0));
27388                                           break;
27389                                         }
27390                                         case 0x000000c0: {
27391                                           // 0xffb102c0
27392                                           if ((instr & 0x000c0400) ==
27393                                               0x00080000) {
27394                                             UnimplementedT32_32("SHA1H", instr);
27395                                           } else {
27396                                             UnallocatedT32(instr);
27397                                           }
27398                                           break;
27399                                         }
27400                                         case 0x00000100: {
27401                                           // 0xffb10300
27402                                           DataType dt = Dt_F_size_1_Decode(
27403                                               ((instr >> 18) & 0x3) |
27404                                               ((instr >> 8) & 0x4));
27405                                           if (dt.Is(kDataTypeValueInvalid)) {
27406                                             UnallocatedT32(instr);
27407                                             return;
27408                                           }
27409                                           unsigned rd =
27410                                               ExtractDRegister(instr, 22, 12);
27411                                           unsigned rm =
27412                                               ExtractDRegister(instr, 5, 0);
27413                                           // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27414                                           vabs(CurrentCond(),
27415                                                dt,
27416                                                DRegister(rd),
27417                                                DRegister(rm));
27418                                           break;
27419                                         }
27420                                         case 0x00000140: {
27421                                           // 0xffb10340
27422                                           DataType dt = Dt_F_size_1_Decode(
27423                                               ((instr >> 18) & 0x3) |
27424                                               ((instr >> 8) & 0x4));
27425                                           if (dt.Is(kDataTypeValueInvalid)) {
27426                                             UnallocatedT32(instr);
27427                                             return;
27428                                           }
27429                                           if (((instr >> 12) & 1) != 0) {
27430                                             UnallocatedT32(instr);
27431                                             return;
27432                                           }
27433                                           unsigned rd =
27434                                               ExtractQRegister(instr, 22, 12);
27435                                           if ((instr & 1) != 0) {
27436                                             UnallocatedT32(instr);
27437                                             return;
27438                                           }
27439                                           unsigned rm =
27440                                               ExtractQRegister(instr, 5, 0);
27441                                           // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27442                                           vabs(CurrentCond(),
27443                                                dt,
27444                                                QRegister(rd),
27445                                                QRegister(rm));
27446                                           break;
27447                                         }
27448                                         case 0x00000180: {
27449                                           // 0xffb10380
27450                                           DataType dt = Dt_F_size_1_Decode(
27451                                               ((instr >> 18) & 0x3) |
27452                                               ((instr >> 8) & 0x4));
27453                                           if (dt.Is(kDataTypeValueInvalid)) {
27454                                             UnallocatedT32(instr);
27455                                             return;
27456                                           }
27457                                           unsigned rd =
27458                                               ExtractDRegister(instr, 22, 12);
27459                                           unsigned rm =
27460                                               ExtractDRegister(instr, 5, 0);
27461                                           // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27462                                           vneg(CurrentCond(),
27463                                                dt,
27464                                                DRegister(rd),
27465                                                DRegister(rm));
27466                                           break;
27467                                         }
27468                                         case 0x000001c0: {
27469                                           // 0xffb103c0
27470                                           DataType dt = Dt_F_size_1_Decode(
27471                                               ((instr >> 18) & 0x3) |
27472                                               ((instr >> 8) & 0x4));
27473                                           if (dt.Is(kDataTypeValueInvalid)) {
27474                                             UnallocatedT32(instr);
27475                                             return;
27476                                           }
27477                                           if (((instr >> 12) & 1) != 0) {
27478                                             UnallocatedT32(instr);
27479                                             return;
27480                                           }
27481                                           unsigned rd =
27482                                               ExtractQRegister(instr, 22, 12);
27483                                           if ((instr & 1) != 0) {
27484                                             UnallocatedT32(instr);
27485                                             return;
27486                                           }
27487                                           unsigned rm =
27488                                               ExtractQRegister(instr, 5, 0);
27489                                           // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27490                                           vneg(CurrentCond(),
27491                                                dt,
27492                                                QRegister(rd),
27493                                                QRegister(rm));
27494                                           break;
27495                                         }
27496                                         default:
27497                                           UnallocatedT32(instr);
27498                                           break;
27499                                       }
27500                                       break;
27501                                     }
27502                                     case 0x00020000: {
27503                                       // 0xffb20000
27504                                       switch (instr & 0x000005c0) {
27505                                         case 0x00000000: {
27506                                           // 0xffb20000
27507                                           if ((instr & 0x000c0000) ==
27508                                               0x00000000) {
27509                                             unsigned rd =
27510                                                 ExtractDRegister(instr, 22, 12);
27511                                             unsigned rm =
27512                                                 ExtractDRegister(instr, 5, 0);
27513                                             // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27514                                             vswp(CurrentCond(),
27515                                                  kDataTypeValueNone,
27516                                                  DRegister(rd),
27517                                                  DRegister(rm));
27518                                           } else {
27519                                             UnallocatedT32(instr);
27520                                           }
27521                                           break;
27522                                         }
27523                                         case 0x00000040: {
27524                                           // 0xffb20040
27525                                           if ((instr & 0x000c0000) ==
27526                                               0x00000000) {
27527                                             if (((instr >> 12) & 1) != 0) {
27528                                               UnallocatedT32(instr);
27529                                               return;
27530                                             }
27531                                             unsigned rd =
27532                                                 ExtractQRegister(instr, 22, 12);
27533                                             if ((instr & 1) != 0) {
27534                                               UnallocatedT32(instr);
27535                                               return;
27536                                             }
27537                                             unsigned rm =
27538                                                 ExtractQRegister(instr, 5, 0);
27539                                             // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27540                                             vswp(CurrentCond(),
27541                                                  kDataTypeValueNone,
27542                                                  QRegister(rd),
27543                                                  QRegister(rm));
27544                                           } else {
27545                                             UnallocatedT32(instr);
27546                                           }
27547                                           break;
27548                                         }
27549                                         case 0x00000080: {
27550                                           // 0xffb20080
27551                                           DataType dt = Dt_size_7_Decode(
27552                                               (instr >> 18) & 0x3);
27553                                           if (dt.Is(kDataTypeValueInvalid)) {
27554                                             UnallocatedT32(instr);
27555                                             return;
27556                                           }
27557                                           unsigned rd =
27558                                               ExtractDRegister(instr, 22, 12);
27559                                           unsigned rm =
27560                                               ExtractDRegister(instr, 5, 0);
27561                                           // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27562                                           vtrn(CurrentCond(),
27563                                                dt,
27564                                                DRegister(rd),
27565                                                DRegister(rm));
27566                                           break;
27567                                         }
27568                                         case 0x000000c0: {
27569                                           // 0xffb200c0
27570                                           DataType dt = Dt_size_7_Decode(
27571                                               (instr >> 18) & 0x3);
27572                                           if (dt.Is(kDataTypeValueInvalid)) {
27573                                             UnallocatedT32(instr);
27574                                             return;
27575                                           }
27576                                           if (((instr >> 12) & 1) != 0) {
27577                                             UnallocatedT32(instr);
27578                                             return;
27579                                           }
27580                                           unsigned rd =
27581                                               ExtractQRegister(instr, 22, 12);
27582                                           if ((instr & 1) != 0) {
27583                                             UnallocatedT32(instr);
27584                                             return;
27585                                           }
27586                                           unsigned rm =
27587                                               ExtractQRegister(instr, 5, 0);
27588                                           // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27589                                           vtrn(CurrentCond(),
27590                                                dt,
27591                                                QRegister(rd),
27592                                                QRegister(rm));
27593                                           break;
27594                                         }
27595                                         case 0x00000100: {
27596                                           // 0xffb20100
27597                                           DataType dt = Dt_size_15_Decode(
27598                                               (instr >> 18) & 0x3);
27599                                           if (dt.Is(kDataTypeValueInvalid)) {
27600                                             UnallocatedT32(instr);
27601                                             return;
27602                                           }
27603                                           unsigned rd =
27604                                               ExtractDRegister(instr, 22, 12);
27605                                           unsigned rm =
27606                                               ExtractDRegister(instr, 5, 0);
27607                                           // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27608                                           vuzp(CurrentCond(),
27609                                                dt,
27610                                                DRegister(rd),
27611                                                DRegister(rm));
27612                                           break;
27613                                         }
27614                                         case 0x00000140: {
27615                                           // 0xffb20140
27616                                           DataType dt = Dt_size_7_Decode(
27617                                               (instr >> 18) & 0x3);
27618                                           if (dt.Is(kDataTypeValueInvalid)) {
27619                                             UnallocatedT32(instr);
27620                                             return;
27621                                           }
27622                                           if (((instr >> 12) & 1) != 0) {
27623                                             UnallocatedT32(instr);
27624                                             return;
27625                                           }
27626                                           unsigned rd =
27627                                               ExtractQRegister(instr, 22, 12);
27628                                           if ((instr & 1) != 0) {
27629                                             UnallocatedT32(instr);
27630                                             return;
27631                                           }
27632                                           unsigned rm =
27633                                               ExtractQRegister(instr, 5, 0);
27634                                           // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27635                                           vuzp(CurrentCond(),
27636                                                dt,
27637                                                QRegister(rd),
27638                                                QRegister(rm));
27639                                           break;
27640                                         }
27641                                         case 0x00000180: {
27642                                           // 0xffb20180
27643                                           DataType dt = Dt_size_15_Decode(
27644                                               (instr >> 18) & 0x3);
27645                                           if (dt.Is(kDataTypeValueInvalid)) {
27646                                             UnallocatedT32(instr);
27647                                             return;
27648                                           }
27649                                           unsigned rd =
27650                                               ExtractDRegister(instr, 22, 12);
27651                                           unsigned rm =
27652                                               ExtractDRegister(instr, 5, 0);
27653                                           // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
27654                                           vzip(CurrentCond(),
27655                                                dt,
27656                                                DRegister(rd),
27657                                                DRegister(rm));
27658                                           break;
27659                                         }
27660                                         case 0x000001c0: {
27661                                           // 0xffb201c0
27662                                           DataType dt = Dt_size_7_Decode(
27663                                               (instr >> 18) & 0x3);
27664                                           if (dt.Is(kDataTypeValueInvalid)) {
27665                                             UnallocatedT32(instr);
27666                                             return;
27667                                           }
27668                                           if (((instr >> 12) & 1) != 0) {
27669                                             UnallocatedT32(instr);
27670                                             return;
27671                                           }
27672                                           unsigned rd =
27673                                               ExtractQRegister(instr, 22, 12);
27674                                           if ((instr & 1) != 0) {
27675                                             UnallocatedT32(instr);
27676                                             return;
27677                                           }
27678                                           unsigned rm =
27679                                               ExtractQRegister(instr, 5, 0);
27680                                           // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
27681                                           vzip(CurrentCond(),
27682                                                dt,
27683                                                QRegister(rd),
27684                                                QRegister(rm));
27685                                           break;
27686                                         }
27687                                         case 0x00000400: {
27688                                           // 0xffb20400
27689                                           if ((instr & 0x000c0000) ==
27690                                               0x00080000) {
27691                                             unsigned rd =
27692                                                 ExtractDRegister(instr, 22, 12);
27693                                             unsigned rm =
27694                                                 ExtractDRegister(instr, 5, 0);
27695                                             // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27696                                             vrintn(F32,
27697                                                    F32,
27698                                                    DRegister(rd),
27699                                                    DRegister(rm));
27700                                           } else {
27701                                             UnallocatedT32(instr);
27702                                           }
27703                                           break;
27704                                         }
27705                                         case 0x00000440: {
27706                                           // 0xffb20440
27707                                           if ((instr & 0x000c0000) ==
27708                                               0x00080000) {
27709                                             if (((instr >> 12) & 1) != 0) {
27710                                               UnallocatedT32(instr);
27711                                               return;
27712                                             }
27713                                             unsigned rd =
27714                                                 ExtractQRegister(instr, 22, 12);
27715                                             if ((instr & 1) != 0) {
27716                                               UnallocatedT32(instr);
27717                                               return;
27718                                             }
27719                                             unsigned rm =
27720                                                 ExtractQRegister(instr, 5, 0);
27721                                             // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27722                                             vrintn(F32,
27723                                                    F32,
27724                                                    QRegister(rd),
27725                                                    QRegister(rm));
27726                                           } else {
27727                                             UnallocatedT32(instr);
27728                                           }
27729                                           break;
27730                                         }
27731                                         case 0x00000480: {
27732                                           // 0xffb20480
27733                                           if ((instr & 0x000c0000) ==
27734                                               0x00080000) {
27735                                             unsigned rd =
27736                                                 ExtractDRegister(instr, 22, 12);
27737                                             unsigned rm =
27738                                                 ExtractDRegister(instr, 5, 0);
27739                                             // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27740                                             vrintx(Condition::None(),
27741                                                    F32,
27742                                                    F32,
27743                                                    DRegister(rd),
27744                                                    DRegister(rm));
27745                                           } else {
27746                                             UnallocatedT32(instr);
27747                                           }
27748                                           break;
27749                                         }
27750                                         case 0x000004c0: {
27751                                           // 0xffb204c0
27752                                           if ((instr & 0x000c0000) ==
27753                                               0x00080000) {
27754                                             if (((instr >> 12) & 1) != 0) {
27755                                               UnallocatedT32(instr);
27756                                               return;
27757                                             }
27758                                             unsigned rd =
27759                                                 ExtractQRegister(instr, 22, 12);
27760                                             if ((instr & 1) != 0) {
27761                                               UnallocatedT32(instr);
27762                                               return;
27763                                             }
27764                                             unsigned rm =
27765                                                 ExtractQRegister(instr, 5, 0);
27766                                             // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27767                                             vrintx(F32,
27768                                                    F32,
27769                                                    QRegister(rd),
27770                                                    QRegister(rm));
27771                                           } else {
27772                                             UnallocatedT32(instr);
27773                                           }
27774                                           break;
27775                                         }
27776                                         case 0x00000500: {
27777                                           // 0xffb20500
27778                                           if ((instr & 0x000c0000) ==
27779                                               0x00080000) {
27780                                             unsigned rd =
27781                                                 ExtractDRegister(instr, 22, 12);
27782                                             unsigned rm =
27783                                                 ExtractDRegister(instr, 5, 0);
27784                                             // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27785                                             vrinta(F32,
27786                                                    F32,
27787                                                    DRegister(rd),
27788                                                    DRegister(rm));
27789                                           } else {
27790                                             UnallocatedT32(instr);
27791                                           }
27792                                           break;
27793                                         }
27794                                         case 0x00000540: {
27795                                           // 0xffb20540
27796                                           if ((instr & 0x000c0000) ==
27797                                               0x00080000) {
27798                                             if (((instr >> 12) & 1) != 0) {
27799                                               UnallocatedT32(instr);
27800                                               return;
27801                                             }
27802                                             unsigned rd =
27803                                                 ExtractQRegister(instr, 22, 12);
27804                                             if ((instr & 1) != 0) {
27805                                               UnallocatedT32(instr);
27806                                               return;
27807                                             }
27808                                             unsigned rm =
27809                                                 ExtractQRegister(instr, 5, 0);
27810                                             // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27811                                             vrinta(F32,
27812                                                    F32,
27813                                                    QRegister(rd),
27814                                                    QRegister(rm));
27815                                           } else {
27816                                             UnallocatedT32(instr);
27817                                           }
27818                                           break;
27819                                         }
27820                                         case 0x00000580: {
27821                                           // 0xffb20580
27822                                           if ((instr & 0x000c0000) ==
27823                                               0x00080000) {
27824                                             unsigned rd =
27825                                                 ExtractDRegister(instr, 22, 12);
27826                                             unsigned rm =
27827                                                 ExtractDRegister(instr, 5, 0);
27828                                             // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
27829                                             vrintz(Condition::None(),
27830                                                    F32,
27831                                                    F32,
27832                                                    DRegister(rd),
27833                                                    DRegister(rm));
27834                                           } else {
27835                                             UnallocatedT32(instr);
27836                                           }
27837                                           break;
27838                                         }
27839                                         case 0x000005c0: {
27840                                           // 0xffb205c0
27841                                           if ((instr & 0x000c0000) ==
27842                                               0x00080000) {
27843                                             if (((instr >> 12) & 1) != 0) {
27844                                               UnallocatedT32(instr);
27845                                               return;
27846                                             }
27847                                             unsigned rd =
27848                                                 ExtractQRegister(instr, 22, 12);
27849                                             if ((instr & 1) != 0) {
27850                                               UnallocatedT32(instr);
27851                                               return;
27852                                             }
27853                                             unsigned rm =
27854                                                 ExtractQRegister(instr, 5, 0);
27855                                             // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27856                                             vrintz(F32,
27857                                                    F32,
27858                                                    QRegister(rd),
27859                                                    QRegister(rm));
27860                                           } else {
27861                                             UnallocatedT32(instr);
27862                                           }
27863                                           break;
27864                                         }
27865                                       }
27866                                       break;
27867                                     }
27868                                     case 0x00020200: {
27869                                       // 0xffb20200
27870                                       switch (instr & 0x00000580) {
27871                                         case 0x00000000: {
27872                                           // 0xffb20200
27873                                           switch (instr & 0x00000040) {
27874                                             case 0x00000000: {
27875                                               // 0xffb20200
27876                                               DataType dt = Dt_size_3_Decode(
27877                                                   (instr >> 18) & 0x3);
27878                                               if (dt.Is(
27879                                                       kDataTypeValueInvalid)) {
27880                                                 UnallocatedT32(instr);
27881                                                 return;
27882                                               }
27883                                               unsigned rd =
27884                                                   ExtractDRegister(instr,
27885                                                                    22,
27886                                                                    12);
27887                                               if ((instr & 1) != 0) {
27888                                                 UnallocatedT32(instr);
27889                                                 return;
27890                                               }
27891                                               unsigned rm =
27892                                                   ExtractQRegister(instr, 5, 0);
27893                                               // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27894                                               vmovn(CurrentCond(),
27895                                                     dt,
27896                                                     DRegister(rd),
27897                                                     QRegister(rm));
27898                                               break;
27899                                             }
27900                                             case 0x00000040: {
27901                                               // 0xffb20240
27902                                               DataType dt = Dt_size_14_Decode(
27903                                                   (instr >> 18) & 0x3);
27904                                               if (dt.Is(
27905                                                       kDataTypeValueInvalid)) {
27906                                                 UnallocatedT32(instr);
27907                                                 return;
27908                                               }
27909                                               unsigned rd =
27910                                                   ExtractDRegister(instr,
27911                                                                    22,
27912                                                                    12);
27913                                               if ((instr & 1) != 0) {
27914                                                 UnallocatedT32(instr);
27915                                                 return;
27916                                               }
27917                                               unsigned rm =
27918                                                   ExtractQRegister(instr, 5, 0);
27919                                               // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27920                                               vqmovun(CurrentCond(),
27921                                                       dt,
27922                                                       DRegister(rd),
27923                                                       QRegister(rm));
27924                                               break;
27925                                             }
27926                                           }
27927                                           break;
27928                                         }
27929                                         case 0x00000080: {
27930                                           // 0xffb20280
27931                                           DataType dt = Dt_op_size_3_Decode(
27932                                               ((instr >> 18) & 0x3) |
27933                                               ((instr >> 4) & 0x4));
27934                                           if (dt.Is(kDataTypeValueInvalid)) {
27935                                             UnallocatedT32(instr);
27936                                             return;
27937                                           }
27938                                           unsigned rd =
27939                                               ExtractDRegister(instr, 22, 12);
27940                                           if ((instr & 1) != 0) {
27941                                             UnallocatedT32(instr);
27942                                             return;
27943                                           }
27944                                           unsigned rm =
27945                                               ExtractQRegister(instr, 5, 0);
27946                                           // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
27947                                           vqmovn(CurrentCond(),
27948                                                  dt,
27949                                                  DRegister(rd),
27950                                                  QRegister(rm));
27951                                           break;
27952                                         }
27953                                         case 0x00000100: {
27954                                           // 0xffb20300
27955                                           if ((instr & 0x00000040) ==
27956                                               0x00000000) {
27957                                             DataType dt = Dt_size_16_Decode(
27958                                                 (instr >> 18) & 0x3);
27959                                             if (dt.Is(kDataTypeValueInvalid)) {
27960                                               UnallocatedT32(instr);
27961                                               return;
27962                                             }
27963                                             if (((instr >> 12) & 1) != 0) {
27964                                               UnallocatedT32(instr);
27965                                               return;
27966                                             }
27967                                             unsigned rd =
27968                                                 ExtractQRegister(instr, 22, 12);
27969                                             unsigned rm =
27970                                                 ExtractDRegister(instr, 5, 0);
27971                                             uint32_t imm = dt.GetSize();
27972                                             // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
27973                                             vshll(CurrentCond(),
27974                                                   dt,
27975                                                   QRegister(rd),
27976                                                   DRegister(rm),
27977                                                   imm);
27978                                           } else {
27979                                             UnallocatedT32(instr);
27980                                           }
27981                                           break;
27982                                         }
27983                                         case 0x00000180: {
27984                                           // 0xffb20380
27985                                           switch (instr & 0x000c0040) {
27986                                             case 0x00080000: {
27987                                               // 0xffba0380
27988                                               UnimplementedT32_32("SHA1SU1",
27989                                                                   instr);
27990                                               break;
27991                                             }
27992                                             case 0x00080040: {
27993                                               // 0xffba03c0
27994                                               UnimplementedT32_32("SHA256SU0",
27995                                                                   instr);
27996                                               break;
27997                                             }
27998                                             default:
27999                                               UnallocatedT32(instr);
28000                                               break;
28001                                           }
28002                                           break;
28003                                         }
28004                                         case 0x00000400: {
28005                                           // 0xffb20600
28006                                           if ((instr & 0x000c0040) ==
28007                                               0x00040000) {
28008                                             unsigned rd =
28009                                                 ExtractDRegister(instr, 22, 12);
28010                                             if ((instr & 1) != 0) {
28011                                               UnallocatedT32(instr);
28012                                               return;
28013                                             }
28014                                             unsigned rm =
28015                                                 ExtractQRegister(instr, 5, 0);
28016                                             // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28017                                             vcvt(CurrentCond(),
28018                                                  F16,
28019                                                  F32,
28020                                                  DRegister(rd),
28021                                                  QRegister(rm));
28022                                           } else {
28023                                             UnallocatedT32(instr);
28024                                           }
28025                                           break;
28026                                         }
28027                                         case 0x00000480: {
28028                                           // 0xffb20680
28029                                           switch (instr & 0x000c0040) {
28030                                             case 0x00080000: {
28031                                               // 0xffba0680
28032                                               unsigned rd =
28033                                                   ExtractDRegister(instr,
28034                                                                    22,
28035                                                                    12);
28036                                               unsigned rm =
28037                                                   ExtractDRegister(instr, 5, 0);
28038                                               // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28039                                               vrintm(F32,
28040                                                      F32,
28041                                                      DRegister(rd),
28042                                                      DRegister(rm));
28043                                               break;
28044                                             }
28045                                             case 0x00080040: {
28046                                               // 0xffba06c0
28047                                               if (((instr >> 12) & 1) != 0) {
28048                                                 UnallocatedT32(instr);
28049                                                 return;
28050                                               }
28051                                               unsigned rd =
28052                                                   ExtractQRegister(instr,
28053                                                                    22,
28054                                                                    12);
28055                                               if ((instr & 1) != 0) {
28056                                                 UnallocatedT32(instr);
28057                                                 return;
28058                                               }
28059                                               unsigned rm =
28060                                                   ExtractQRegister(instr, 5, 0);
28061                                               // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28062                                               vrintm(F32,
28063                                                      F32,
28064                                                      QRegister(rd),
28065                                                      QRegister(rm));
28066                                               break;
28067                                             }
28068                                             default:
28069                                               UnallocatedT32(instr);
28070                                               break;
28071                                           }
28072                                           break;
28073                                         }
28074                                         case 0x00000500: {
28075                                           // 0xffb20700
28076                                           if ((instr & 0x000c0040) ==
28077                                               0x00040000) {
28078                                             if (((instr >> 12) & 1) != 0) {
28079                                               UnallocatedT32(instr);
28080                                               return;
28081                                             }
28082                                             unsigned rd =
28083                                                 ExtractQRegister(instr, 22, 12);
28084                                             unsigned rm =
28085                                                 ExtractDRegister(instr, 5, 0);
28086                                             // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28087                                             vcvt(CurrentCond(),
28088                                                  F32,
28089                                                  F16,
28090                                                  QRegister(rd),
28091                                                  DRegister(rm));
28092                                           } else {
28093                                             UnallocatedT32(instr);
28094                                           }
28095                                           break;
28096                                         }
28097                                         case 0x00000580: {
28098                                           // 0xffb20780
28099                                           switch (instr & 0x000c0040) {
28100                                             case 0x00080000: {
28101                                               // 0xffba0780
28102                                               unsigned rd =
28103                                                   ExtractDRegister(instr,
28104                                                                    22,
28105                                                                    12);
28106                                               unsigned rm =
28107                                                   ExtractDRegister(instr, 5, 0);
28108                                               // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28109                                               vrintp(F32,
28110                                                      F32,
28111                                                      DRegister(rd),
28112                                                      DRegister(rm));
28113                                               break;
28114                                             }
28115                                             case 0x00080040: {
28116                                               // 0xffba07c0
28117                                               if (((instr >> 12) & 1) != 0) {
28118                                                 UnallocatedT32(instr);
28119                                                 return;
28120                                               }
28121                                               unsigned rd =
28122                                                   ExtractQRegister(instr,
28123                                                                    22,
28124                                                                    12);
28125                                               if ((instr & 1) != 0) {
28126                                                 UnallocatedT32(instr);
28127                                                 return;
28128                                               }
28129                                               unsigned rm =
28130                                                   ExtractQRegister(instr, 5, 0);
28131                                               // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28132                                               vrintp(F32,
28133                                                      F32,
28134                                                      QRegister(rd),
28135                                                      QRegister(rm));
28136                                               break;
28137                                             }
28138                                             default:
28139                                               UnallocatedT32(instr);
28140                                               break;
28141                                           }
28142                                           break;
28143                                         }
28144                                       }
28145                                       break;
28146                                     }
28147                                     case 0x00030000: {
28148                                       // 0xffb30000
28149                                       switch (instr & 0x00000440) {
28150                                         case 0x00000000: {
28151                                           // 0xffb30000
28152                                           switch (instr & 0x000c0100) {
28153                                             case 0x00080000: {
28154                                               // 0xffbb0000
28155                                               DataType dt = Dt_op_3_Decode(
28156                                                   (instr >> 7) & 0x1);
28157                                               if (dt.Is(
28158                                                       kDataTypeValueInvalid)) {
28159                                                 UnallocatedT32(instr);
28160                                                 return;
28161                                               }
28162                                               unsigned rd =
28163                                                   ExtractDRegister(instr,
28164                                                                    22,
28165                                                                    12);
28166                                               unsigned rm =
28167                                                   ExtractDRegister(instr, 5, 0);
28168                                               // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28169                                               vcvta(dt,
28170                                                     F32,
28171                                                     DRegister(rd),
28172                                                     DRegister(rm));
28173                                               break;
28174                                             }
28175                                             case 0x00080100: {
28176                                               // 0xffbb0100
28177                                               DataType dt = Dt_op_3_Decode(
28178                                                   (instr >> 7) & 0x1);
28179                                               if (dt.Is(
28180                                                       kDataTypeValueInvalid)) {
28181                                                 UnallocatedT32(instr);
28182                                                 return;
28183                                               }
28184                                               unsigned rd =
28185                                                   ExtractDRegister(instr,
28186                                                                    22,
28187                                                                    12);
28188                                               unsigned rm =
28189                                                   ExtractDRegister(instr, 5, 0);
28190                                               // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28191                                               vcvtn(dt,
28192                                                     F32,
28193                                                     DRegister(rd),
28194                                                     DRegister(rm));
28195                                               break;
28196                                             }
28197                                             default:
28198                                               UnallocatedT32(instr);
28199                                               break;
28200                                           }
28201                                           break;
28202                                         }
28203                                         case 0x00000040: {
28204                                           // 0xffb30040
28205                                           switch (instr & 0x000c0100) {
28206                                             case 0x00080000: {
28207                                               // 0xffbb0040
28208                                               DataType dt = Dt_op_3_Decode(
28209                                                   (instr >> 7) & 0x1);
28210                                               if (dt.Is(
28211                                                       kDataTypeValueInvalid)) {
28212                                                 UnallocatedT32(instr);
28213                                                 return;
28214                                               }
28215                                               if (((instr >> 12) & 1) != 0) {
28216                                                 UnallocatedT32(instr);
28217                                                 return;
28218                                               }
28219                                               unsigned rd =
28220                                                   ExtractQRegister(instr,
28221                                                                    22,
28222                                                                    12);
28223                                               if ((instr & 1) != 0) {
28224                                                 UnallocatedT32(instr);
28225                                                 return;
28226                                               }
28227                                               unsigned rm =
28228                                                   ExtractQRegister(instr, 5, 0);
28229                                               // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28230                                               vcvta(dt,
28231                                                     F32,
28232                                                     QRegister(rd),
28233                                                     QRegister(rm));
28234                                               break;
28235                                             }
28236                                             case 0x00080100: {
28237                                               // 0xffbb0140
28238                                               DataType dt = Dt_op_3_Decode(
28239                                                   (instr >> 7) & 0x1);
28240                                               if (dt.Is(
28241                                                       kDataTypeValueInvalid)) {
28242                                                 UnallocatedT32(instr);
28243                                                 return;
28244                                               }
28245                                               if (((instr >> 12) & 1) != 0) {
28246                                                 UnallocatedT32(instr);
28247                                                 return;
28248                                               }
28249                                               unsigned rd =
28250                                                   ExtractQRegister(instr,
28251                                                                    22,
28252                                                                    12);
28253                                               if ((instr & 1) != 0) {
28254                                                 UnallocatedT32(instr);
28255                                                 return;
28256                                               }
28257                                               unsigned rm =
28258                                                   ExtractQRegister(instr, 5, 0);
28259                                               // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28260                                               vcvtn(dt,
28261                                                     F32,
28262                                                     QRegister(rd),
28263                                                     QRegister(rm));
28264                                               break;
28265                                             }
28266                                             default:
28267                                               UnallocatedT32(instr);
28268                                               break;
28269                                           }
28270                                           break;
28271                                         }
28272                                         case 0x00000400: {
28273                                           // 0xffb30400
28274                                           switch (instr & 0x00000080) {
28275                                             case 0x00000000: {
28276                                               // 0xffb30400
28277                                               DataType dt = Dt_F_size_4_Decode(
28278                                                   ((instr >> 18) & 0x3) |
28279                                                   ((instr >> 6) & 0x4));
28280                                               if (dt.Is(
28281                                                       kDataTypeValueInvalid)) {
28282                                                 UnallocatedT32(instr);
28283                                                 return;
28284                                               }
28285                                               unsigned rd =
28286                                                   ExtractDRegister(instr,
28287                                                                    22,
28288                                                                    12);
28289                                               unsigned rm =
28290                                                   ExtractDRegister(instr, 5, 0);
28291                                               // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28292                                               vrecpe(CurrentCond(),
28293                                                      dt,
28294                                                      DRegister(rd),
28295                                                      DRegister(rm));
28296                                               break;
28297                                             }
28298                                             case 0x00000080: {
28299                                               // 0xffb30480
28300                                               DataType dt = Dt_F_size_4_Decode(
28301                                                   ((instr >> 18) & 0x3) |
28302                                                   ((instr >> 6) & 0x4));
28303                                               if (dt.Is(
28304                                                       kDataTypeValueInvalid)) {
28305                                                 UnallocatedT32(instr);
28306                                                 return;
28307                                               }
28308                                               unsigned rd =
28309                                                   ExtractDRegister(instr,
28310                                                                    22,
28311                                                                    12);
28312                                               unsigned rm =
28313                                                   ExtractDRegister(instr, 5, 0);
28314                                               // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28315                                               vrsqrte(CurrentCond(),
28316                                                       dt,
28317                                                       DRegister(rd),
28318                                                       DRegister(rm));
28319                                               break;
28320                                             }
28321                                           }
28322                                           break;
28323                                         }
28324                                         case 0x00000440: {
28325                                           // 0xffb30440
28326                                           switch (instr & 0x00000080) {
28327                                             case 0x00000000: {
28328                                               // 0xffb30440
28329                                               DataType dt = Dt_F_size_4_Decode(
28330                                                   ((instr >> 18) & 0x3) |
28331                                                   ((instr >> 6) & 0x4));
28332                                               if (dt.Is(
28333                                                       kDataTypeValueInvalid)) {
28334                                                 UnallocatedT32(instr);
28335                                                 return;
28336                                               }
28337                                               if (((instr >> 12) & 1) != 0) {
28338                                                 UnallocatedT32(instr);
28339                                                 return;
28340                                               }
28341                                               unsigned rd =
28342                                                   ExtractQRegister(instr,
28343                                                                    22,
28344                                                                    12);
28345                                               if ((instr & 1) != 0) {
28346                                                 UnallocatedT32(instr);
28347                                                 return;
28348                                               }
28349                                               unsigned rm =
28350                                                   ExtractQRegister(instr, 5, 0);
28351                                               // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28352                                               vrecpe(CurrentCond(),
28353                                                      dt,
28354                                                      QRegister(rd),
28355                                                      QRegister(rm));
28356                                               break;
28357                                             }
28358                                             case 0x00000080: {
28359                                               // 0xffb304c0
28360                                               DataType dt = Dt_F_size_4_Decode(
28361                                                   ((instr >> 18) & 0x3) |
28362                                                   ((instr >> 6) & 0x4));
28363                                               if (dt.Is(
28364                                                       kDataTypeValueInvalid)) {
28365                                                 UnallocatedT32(instr);
28366                                                 return;
28367                                               }
28368                                               if (((instr >> 12) & 1) != 0) {
28369                                                 UnallocatedT32(instr);
28370                                                 return;
28371                                               }
28372                                               unsigned rd =
28373                                                   ExtractQRegister(instr,
28374                                                                    22,
28375                                                                    12);
28376                                               if ((instr & 1) != 0) {
28377                                                 UnallocatedT32(instr);
28378                                                 return;
28379                                               }
28380                                               unsigned rm =
28381                                                   ExtractQRegister(instr, 5, 0);
28382                                               // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28383                                               vrsqrte(CurrentCond(),
28384                                                       dt,
28385                                                       QRegister(rd),
28386                                                       QRegister(rm));
28387                                               break;
28388                                             }
28389                                           }
28390                                           break;
28391                                         }
28392                                       }
28393                                       break;
28394                                     }
28395                                     case 0x00030200: {
28396                                       // 0xffb30200
28397                                       switch (instr & 0x000c0440) {
28398                                         case 0x00080000: {
28399                                           // 0xffbb0200
28400                                           switch (instr & 0x00000100) {
28401                                             case 0x00000000: {
28402                                               // 0xffbb0200
28403                                               DataType dt = Dt_op_3_Decode(
28404                                                   (instr >> 7) & 0x1);
28405                                               if (dt.Is(
28406                                                       kDataTypeValueInvalid)) {
28407                                                 UnallocatedT32(instr);
28408                                                 return;
28409                                               }
28410                                               unsigned rd =
28411                                                   ExtractDRegister(instr,
28412                                                                    22,
28413                                                                    12);
28414                                               unsigned rm =
28415                                                   ExtractDRegister(instr, 5, 0);
28416                                               // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28417                                               vcvtp(dt,
28418                                                     F32,
28419                                                     DRegister(rd),
28420                                                     DRegister(rm));
28421                                               break;
28422                                             }
28423                                             case 0x00000100: {
28424                                               // 0xffbb0300
28425                                               DataType dt = Dt_op_3_Decode(
28426                                                   (instr >> 7) & 0x1);
28427                                               if (dt.Is(
28428                                                       kDataTypeValueInvalid)) {
28429                                                 UnallocatedT32(instr);
28430                                                 return;
28431                                               }
28432                                               unsigned rd =
28433                                                   ExtractDRegister(instr,
28434                                                                    22,
28435                                                                    12);
28436                                               unsigned rm =
28437                                                   ExtractDRegister(instr, 5, 0);
28438                                               // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28439                                               vcvtm(dt,
28440                                                     F32,
28441                                                     DRegister(rd),
28442                                                     DRegister(rm));
28443                                               break;
28444                                             }
28445                                           }
28446                                           break;
28447                                         }
28448                                         case 0x00080040: {
28449                                           // 0xffbb0240
28450                                           switch (instr & 0x00000100) {
28451                                             case 0x00000000: {
28452                                               // 0xffbb0240
28453                                               DataType dt = Dt_op_3_Decode(
28454                                                   (instr >> 7) & 0x1);
28455                                               if (dt.Is(
28456                                                       kDataTypeValueInvalid)) {
28457                                                 UnallocatedT32(instr);
28458                                                 return;
28459                                               }
28460                                               if (((instr >> 12) & 1) != 0) {
28461                                                 UnallocatedT32(instr);
28462                                                 return;
28463                                               }
28464                                               unsigned rd =
28465                                                   ExtractQRegister(instr,
28466                                                                    22,
28467                                                                    12);
28468                                               if ((instr & 1) != 0) {
28469                                                 UnallocatedT32(instr);
28470                                                 return;
28471                                               }
28472                                               unsigned rm =
28473                                                   ExtractQRegister(instr, 5, 0);
28474                                               // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28475                                               vcvtp(dt,
28476                                                     F32,
28477                                                     QRegister(rd),
28478                                                     QRegister(rm));
28479                                               break;
28480                                             }
28481                                             case 0x00000100: {
28482                                               // 0xffbb0340
28483                                               DataType dt = Dt_op_3_Decode(
28484                                                   (instr >> 7) & 0x1);
28485                                               if (dt.Is(
28486                                                       kDataTypeValueInvalid)) {
28487                                                 UnallocatedT32(instr);
28488                                                 return;
28489                                               }
28490                                               if (((instr >> 12) & 1) != 0) {
28491                                                 UnallocatedT32(instr);
28492                                                 return;
28493                                               }
28494                                               unsigned rd =
28495                                                   ExtractQRegister(instr,
28496                                                                    22,
28497                                                                    12);
28498                                               if ((instr & 1) != 0) {
28499                                                 UnallocatedT32(instr);
28500                                                 return;
28501                                               }
28502                                               unsigned rm =
28503                                                   ExtractQRegister(instr, 5, 0);
28504                                               // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28505                                               vcvtm(dt,
28506                                                     F32,
28507                                                     QRegister(rd),
28508                                                     QRegister(rm));
28509                                               break;
28510                                             }
28511                                           }
28512                                           break;
28513                                         }
28514                                         case 0x00080400: {
28515                                           // 0xffbb0600
28516                                           DataType dt1 = Dt_op_1_Decode1(
28517                                               (instr >> 7) & 0x3);
28518                                           if (dt1.Is(kDataTypeValueInvalid)) {
28519                                             UnallocatedT32(instr);
28520                                             return;
28521                                           }
28522                                           DataType dt2 = Dt_op_1_Decode2(
28523                                               (instr >> 7) & 0x3);
28524                                           if (dt2.Is(kDataTypeValueInvalid)) {
28525                                             UnallocatedT32(instr);
28526                                             return;
28527                                           }
28528                                           unsigned rd =
28529                                               ExtractDRegister(instr, 22, 12);
28530                                           unsigned rm =
28531                                               ExtractDRegister(instr, 5, 0);
28532                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
28533                                           vcvt(CurrentCond(),
28534                                                dt1,
28535                                                dt2,
28536                                                DRegister(rd),
28537                                                DRegister(rm));
28538                                           break;
28539                                         }
28540                                         case 0x00080440: {
28541                                           // 0xffbb0640
28542                                           DataType dt1 = Dt_op_1_Decode1(
28543                                               (instr >> 7) & 0x3);
28544                                           if (dt1.Is(kDataTypeValueInvalid)) {
28545                                             UnallocatedT32(instr);
28546                                             return;
28547                                           }
28548                                           DataType dt2 = Dt_op_1_Decode2(
28549                                               (instr >> 7) & 0x3);
28550                                           if (dt2.Is(kDataTypeValueInvalid)) {
28551                                             UnallocatedT32(instr);
28552                                             return;
28553                                           }
28554                                           if (((instr >> 12) & 1) != 0) {
28555                                             UnallocatedT32(instr);
28556                                             return;
28557                                           }
28558                                           unsigned rd =
28559                                               ExtractQRegister(instr, 22, 12);
28560                                           if ((instr & 1) != 0) {
28561                                             UnallocatedT32(instr);
28562                                             return;
28563                                           }
28564                                           unsigned rm =
28565                                               ExtractQRegister(instr, 5, 0);
28566                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
28567                                           vcvt(CurrentCond(),
28568                                                dt1,
28569                                                dt2,
28570                                                QRegister(rd),
28571                                                QRegister(rm));
28572                                           break;
28573                                         }
28574                                         default:
28575                                           UnallocatedT32(instr);
28576                                           break;
28577                                       }
28578                                       break;
28579                                     }
28580                                   }
28581                                   break;
28582                                 }
28583                                 case 0x00000800: {
28584                                   // 0xffb00800
28585                                   switch (instr & 0x00000440) {
28586                                     case 0x00000000: {
28587                                       // 0xffb00800
28588                                       unsigned rd =
28589                                           ExtractDRegister(instr, 22, 12);
28590                                       unsigned first =
28591                                           ExtractDRegister(instr, 7, 16);
28592                                       unsigned length;
28593                                       SpacingType spacing = kSingle;
28594                                       switch ((instr >> 8) & 0x3) {
28595                                         default:
28596                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
28597                                         case 0x0:
28598                                           length = 1;
28599                                           break;
28600                                         case 0x1:
28601                                           length = 2;
28602                                           break;
28603                                         case 0x2:
28604                                           length = 3;
28605                                           break;
28606                                         case 0x3:
28607                                           length = 4;
28608                                           break;
28609                                       }
28610                                       unsigned last = first + length - 1;
28611                                       TransferType transfer = kMultipleLanes;
28612                                       unsigned rm =
28613                                           ExtractDRegister(instr, 5, 0);
28614                                       // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28615                                       vtbl(CurrentCond(),
28616                                            Untyped8,
28617                                            DRegister(rd),
28618                                            NeonRegisterList(DRegister(first),
28619                                                             DRegister(last),
28620                                                             spacing,
28621                                                             transfer),
28622                                            DRegister(rm));
28623                                       break;
28624                                     }
28625                                     case 0x00000040: {
28626                                       // 0xffb00840
28627                                       unsigned rd =
28628                                           ExtractDRegister(instr, 22, 12);
28629                                       unsigned first =
28630                                           ExtractDRegister(instr, 7, 16);
28631                                       unsigned length;
28632                                       SpacingType spacing = kSingle;
28633                                       switch ((instr >> 8) & 0x3) {
28634                                         default:
28635                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
28636                                         case 0x0:
28637                                           length = 1;
28638                                           break;
28639                                         case 0x1:
28640                                           length = 2;
28641                                           break;
28642                                         case 0x2:
28643                                           length = 3;
28644                                           break;
28645                                         case 0x3:
28646                                           length = 4;
28647                                           break;
28648                                       }
28649                                       unsigned last = first + length - 1;
28650                                       TransferType transfer = kMultipleLanes;
28651                                       unsigned rm =
28652                                           ExtractDRegister(instr, 5, 0);
28653                                       // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
28654                                       vtbx(CurrentCond(),
28655                                            Untyped8,
28656                                            DRegister(rd),
28657                                            NeonRegisterList(DRegister(first),
28658                                                             DRegister(last),
28659                                                             spacing,
28660                                                             transfer),
28661                                            DRegister(rm));
28662                                       break;
28663                                     }
28664                                     case 0x00000400: {
28665                                       // 0xffb00c00
28666                                       if ((instr & 0x00000380) == 0x00000000) {
28667                                         unsigned lane;
28668                                         DataType dt =
28669                                             Dt_imm4_1_Decode((instr >> 16) &
28670                                                                  0xf,
28671                                                              &lane);
28672                                         if (dt.Is(kDataTypeValueInvalid)) {
28673                                           UnallocatedT32(instr);
28674                                           return;
28675                                         }
28676                                         unsigned rd =
28677                                             ExtractDRegister(instr, 22, 12);
28678                                         unsigned rm =
28679                                             ExtractDRegister(instr, 5, 0);
28680                                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28681                                         vdup(CurrentCond(),
28682                                              dt,
28683                                              DRegister(rd),
28684                                              DRegisterLane(rm, lane));
28685                                       } else {
28686                                         UnallocatedT32(instr);
28687                                       }
28688                                       break;
28689                                     }
28690                                     case 0x00000440: {
28691                                       // 0xffb00c40
28692                                       if ((instr & 0x00000380) == 0x00000000) {
28693                                         unsigned lane;
28694                                         DataType dt =
28695                                             Dt_imm4_1_Decode((instr >> 16) &
28696                                                                  0xf,
28697                                                              &lane);
28698                                         if (dt.Is(kDataTypeValueInvalid)) {
28699                                           UnallocatedT32(instr);
28700                                           return;
28701                                         }
28702                                         if (((instr >> 12) & 1) != 0) {
28703                                           UnallocatedT32(instr);
28704                                           return;
28705                                         }
28706                                         unsigned rd =
28707                                             ExtractQRegister(instr, 22, 12);
28708                                         unsigned rm =
28709                                             ExtractDRegister(instr, 5, 0);
28710                                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28711                                         vdup(CurrentCond(),
28712                                              dt,
28713                                              QRegister(rd),
28714                                              DRegisterLane(rm, lane));
28715                                       } else {
28716                                         UnallocatedT32(instr);
28717                                       }
28718                                       break;
28719                                     }
28720                                   }
28721                                   break;
28722                                 }
28723                               }
28724                               break;
28725                             }
28726                           }
28727                           break;
28728                         }
28729                         default: {
28730                           switch (instr & 0x00000c40) {
28731                             case 0x00000000: {
28732                               // 0xef800000
28733                               switch (instr & 0x00000300) {
28734                                 case 0x00000000: {
28735                                   // 0xef800000
28736                                   if (((instr & 0x300000) == 0x300000)) {
28737                                     UnallocatedT32(instr);
28738                                     return;
28739                                   }
28740                                   DataType dt =
28741                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28742                                                          ((instr >> 26) & 0x4));
28743                                   if (dt.Is(kDataTypeValueInvalid)) {
28744                                     UnallocatedT32(instr);
28745                                     return;
28746                                   }
28747                                   if (((instr >> 12) & 1) != 0) {
28748                                     UnallocatedT32(instr);
28749                                     return;
28750                                   }
28751                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28752                                   unsigned rn = ExtractDRegister(instr, 7, 16);
28753                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28754                                   // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28755                                   vaddl(CurrentCond(),
28756                                         dt,
28757                                         QRegister(rd),
28758                                         DRegister(rn),
28759                                         DRegister(rm));
28760                                   break;
28761                                 }
28762                                 case 0x00000100: {
28763                                   // 0xef800100
28764                                   if (((instr & 0x300000) == 0x300000)) {
28765                                     UnallocatedT32(instr);
28766                                     return;
28767                                   }
28768                                   DataType dt =
28769                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28770                                                          ((instr >> 26) & 0x4));
28771                                   if (dt.Is(kDataTypeValueInvalid)) {
28772                                     UnallocatedT32(instr);
28773                                     return;
28774                                   }
28775                                   if (((instr >> 12) & 1) != 0) {
28776                                     UnallocatedT32(instr);
28777                                     return;
28778                                   }
28779                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28780                                   if (((instr >> 16) & 1) != 0) {
28781                                     UnallocatedT32(instr);
28782                                     return;
28783                                   }
28784                                   unsigned rn = ExtractQRegister(instr, 7, 16);
28785                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28786                                   // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28787                                   vaddw(CurrentCond(),
28788                                         dt,
28789                                         QRegister(rd),
28790                                         QRegister(rn),
28791                                         DRegister(rm));
28792                                   break;
28793                                 }
28794                                 case 0x00000200: {
28795                                   // 0xef800200
28796                                   if (((instr & 0x300000) == 0x300000)) {
28797                                     UnallocatedT32(instr);
28798                                     return;
28799                                   }
28800                                   DataType dt =
28801                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28802                                                          ((instr >> 26) & 0x4));
28803                                   if (dt.Is(kDataTypeValueInvalid)) {
28804                                     UnallocatedT32(instr);
28805                                     return;
28806                                   }
28807                                   if (((instr >> 12) & 1) != 0) {
28808                                     UnallocatedT32(instr);
28809                                     return;
28810                                   }
28811                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28812                                   unsigned rn = ExtractDRegister(instr, 7, 16);
28813                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28814                                   // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
28815                                   vsubl(CurrentCond(),
28816                                         dt,
28817                                         QRegister(rd),
28818                                         DRegister(rn),
28819                                         DRegister(rm));
28820                                   break;
28821                                 }
28822                                 case 0x00000300: {
28823                                   // 0xef800300
28824                                   if (((instr & 0x300000) == 0x300000)) {
28825                                     UnallocatedT32(instr);
28826                                     return;
28827                                   }
28828                                   DataType dt =
28829                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
28830                                                          ((instr >> 26) & 0x4));
28831                                   if (dt.Is(kDataTypeValueInvalid)) {
28832                                     UnallocatedT32(instr);
28833                                     return;
28834                                   }
28835                                   if (((instr >> 12) & 1) != 0) {
28836                                     UnallocatedT32(instr);
28837                                     return;
28838                                   }
28839                                   unsigned rd = ExtractQRegister(instr, 22, 12);
28840                                   if (((instr >> 16) & 1) != 0) {
28841                                     UnallocatedT32(instr);
28842                                     return;
28843                                   }
28844                                   unsigned rn = ExtractQRegister(instr, 7, 16);
28845                                   unsigned rm = ExtractDRegister(instr, 5, 0);
28846                                   // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
28847                                   vsubw(CurrentCond(),
28848                                         dt,
28849                                         QRegister(rd),
28850                                         QRegister(rn),
28851                                         DRegister(rm));
28852                                   break;
28853                                 }
28854                               }
28855                               break;
28856                             }
28857                             case 0x00000040: {
28858                               // 0xef800040
28859                               switch (instr & 0x00000200) {
28860                                 case 0x00000000: {
28861                                   // 0xef800040
28862                                   switch (instr & 0x10000000) {
28863                                     case 0x00000000: {
28864                                       // 0xef800040
28865                                       if (((instr & 0x300000) == 0x300000)) {
28866                                         UnallocatedT32(instr);
28867                                         return;
28868                                       }
28869                                       DataType dt =
28870                                           Dt_size_9_Decode((instr >> 20) & 0x3,
28871                                                            (instr >> 8) & 0x1);
28872                                       if (dt.Is(kDataTypeValueInvalid)) {
28873                                         UnallocatedT32(instr);
28874                                         return;
28875                                       }
28876                                       unsigned rd =
28877                                           ExtractDRegister(instr, 22, 12);
28878                                       unsigned rn =
28879                                           ExtractDRegister(instr, 7, 16);
28880                                       int lane;
28881                                       unsigned rm =
28882                                           ExtractDRegisterAndLane(instr,
28883                                                                   dt,
28884                                                                   5,
28885                                                                   0,
28886                                                                   &lane);
28887                                       // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28888                                       vmla(CurrentCond(),
28889                                            dt,
28890                                            DRegister(rd),
28891                                            DRegister(rn),
28892                                            DRegisterLane(rm, lane));
28893                                       break;
28894                                     }
28895                                     case 0x10000000: {
28896                                       // 0xff800040
28897                                       if (((instr & 0x300000) == 0x300000)) {
28898                                         UnallocatedT32(instr);
28899                                         return;
28900                                       }
28901                                       DataType dt =
28902                                           Dt_size_9_Decode((instr >> 20) & 0x3,
28903                                                            (instr >> 8) & 0x1);
28904                                       if (dt.Is(kDataTypeValueInvalid)) {
28905                                         UnallocatedT32(instr);
28906                                         return;
28907                                       }
28908                                       if (((instr >> 12) & 1) != 0) {
28909                                         UnallocatedT32(instr);
28910                                         return;
28911                                       }
28912                                       unsigned rd =
28913                                           ExtractQRegister(instr, 22, 12);
28914                                       if (((instr >> 16) & 1) != 0) {
28915                                         UnallocatedT32(instr);
28916                                         return;
28917                                       }
28918                                       unsigned rn =
28919                                           ExtractQRegister(instr, 7, 16);
28920                                       int lane;
28921                                       unsigned rm =
28922                                           ExtractDRegisterAndLane(instr,
28923                                                                   dt,
28924                                                                   5,
28925                                                                   0,
28926                                                                   &lane);
28927                                       // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28928                                       vmla(CurrentCond(),
28929                                            dt,
28930                                            QRegister(rd),
28931                                            QRegister(rn),
28932                                            DRegisterLane(rm, lane));
28933                                       break;
28934                                     }
28935                                   }
28936                                   break;
28937                                 }
28938                                 case 0x00000200: {
28939                                   // 0xef800240
28940                                   switch (instr & 0x00000100) {
28941                                     case 0x00000000: {
28942                                       // 0xef800240
28943                                       if (((instr & 0x300000) == 0x300000)) {
28944                                         UnallocatedT32(instr);
28945                                         return;
28946                                       }
28947                                       DataType dt =
28948                                           Dt_size_11_Decode((instr >> 20) & 0x3,
28949                                                             (instr >> 28) &
28950                                                                 0x1);
28951                                       if (dt.Is(kDataTypeValueInvalid)) {
28952                                         UnallocatedT32(instr);
28953                                         return;
28954                                       }
28955                                       if (((instr >> 12) & 1) != 0) {
28956                                         UnallocatedT32(instr);
28957                                         return;
28958                                       }
28959                                       unsigned rd =
28960                                           ExtractQRegister(instr, 22, 12);
28961                                       unsigned rn =
28962                                           ExtractDRegister(instr, 7, 16);
28963                                       int lane;
28964                                       unsigned rm =
28965                                           ExtractDRegisterAndLane(instr,
28966                                                                   dt,
28967                                                                   5,
28968                                                                   0,
28969                                                                   &lane);
28970                                       // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
28971                                       vmlal(CurrentCond(),
28972                                             dt,
28973                                             QRegister(rd),
28974                                             DRegister(rn),
28975                                             DRegisterLane(rm, lane));
28976                                       break;
28977                                     }
28978                                     case 0x00000100: {
28979                                       // 0xef800340
28980                                       if ((instr & 0x10000000) == 0x00000000) {
28981                                         if (((instr & 0x300000) == 0x300000)) {
28982                                           UnallocatedT32(instr);
28983                                           return;
28984                                         }
28985                                         DataType dt = Dt_size_13_Decode(
28986                                             (instr >> 20) & 0x3);
28987                                         if (dt.Is(kDataTypeValueInvalid)) {
28988                                           UnallocatedT32(instr);
28989                                           return;
28990                                         }
28991                                         if (((instr >> 12) & 1) != 0) {
28992                                           UnallocatedT32(instr);
28993                                           return;
28994                                         }
28995                                         unsigned rd =
28996                                             ExtractQRegister(instr, 22, 12);
28997                                         unsigned rn =
28998                                             ExtractDRegister(instr, 7, 16);
28999                                         uint32_t mvm = (instr & 0xf) |
29000                                                        ((instr >> 1) & 0x10);
29001                                         uint32_t shift = 4;
29002                                         if (dt.Is(S16)) {
29003                                           shift = 3;
29004                                         }
29005                                         uint32_t vm = mvm & ((1 << shift) - 1);
29006                                         uint32_t index = mvm >> shift;
29007                                         // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
29008                                         vqdmlal(CurrentCond(),
29009                                                 dt,
29010                                                 QRegister(rd),
29011                                                 DRegister(rn),
29012                                                 DRegister(vm),
29013                                                 index);
29014                                       } else {
29015                                         UnallocatedT32(instr);
29016                                       }
29017                                       break;
29018                                     }
29019                                   }
29020                                   break;
29021                                 }
29022                               }
29023                               break;
29024                             }
29025                             case 0x00000400: {
29026                               // 0xef800400
29027                               switch (instr & 0x00000300) {
29028                                 case 0x00000000: {
29029                                   // 0xef800400
29030                                   switch (instr & 0x10000000) {
29031                                     case 0x00000000: {
29032                                       // 0xef800400
29033                                       if (((instr & 0x300000) == 0x300000)) {
29034                                         UnallocatedT32(instr);
29035                                         return;
29036                                       }
29037                                       DataType dt =
29038                                           Dt_size_3_Decode((instr >> 20) & 0x3);
29039                                       if (dt.Is(kDataTypeValueInvalid)) {
29040                                         UnallocatedT32(instr);
29041                                         return;
29042                                       }
29043                                       unsigned rd =
29044                                           ExtractDRegister(instr, 22, 12);
29045                                       if (((instr >> 16) & 1) != 0) {
29046                                         UnallocatedT32(instr);
29047                                         return;
29048                                       }
29049                                       unsigned rn =
29050                                           ExtractQRegister(instr, 7, 16);
29051                                       if ((instr & 1) != 0) {
29052                                         UnallocatedT32(instr);
29053                                         return;
29054                                       }
29055                                       unsigned rm =
29056                                           ExtractQRegister(instr, 5, 0);
29057                                       // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29058                                       vaddhn(CurrentCond(),
29059                                              dt,
29060                                              DRegister(rd),
29061                                              QRegister(rn),
29062                                              QRegister(rm));
29063                                       break;
29064                                     }
29065                                     case 0x10000000: {
29066                                       // 0xff800400
29067                                       if (((instr & 0x300000) == 0x300000)) {
29068                                         UnallocatedT32(instr);
29069                                         return;
29070                                       }
29071                                       DataType dt =
29072                                           Dt_size_3_Decode((instr >> 20) & 0x3);
29073                                       if (dt.Is(kDataTypeValueInvalid)) {
29074                                         UnallocatedT32(instr);
29075                                         return;
29076                                       }
29077                                       unsigned rd =
29078                                           ExtractDRegister(instr, 22, 12);
29079                                       if (((instr >> 16) & 1) != 0) {
29080                                         UnallocatedT32(instr);
29081                                         return;
29082                                       }
29083                                       unsigned rn =
29084                                           ExtractQRegister(instr, 7, 16);
29085                                       if ((instr & 1) != 0) {
29086                                         UnallocatedT32(instr);
29087                                         return;
29088                                       }
29089                                       unsigned rm =
29090                                           ExtractQRegister(instr, 5, 0);
29091                                       // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29092                                       vraddhn(CurrentCond(),
29093                                               dt,
29094                                               DRegister(rd),
29095                                               QRegister(rn),
29096                                               QRegister(rm));
29097                                       break;
29098                                     }
29099                                   }
29100                                   break;
29101                                 }
29102                                 case 0x00000100: {
29103                                   // 0xef800500
29104                                   if (((instr & 0x300000) == 0x300000)) {
29105                                     UnallocatedT32(instr);
29106                                     return;
29107                                   }
29108                                   DataType dt =
29109                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
29110                                                          ((instr >> 26) & 0x4));
29111                                   if (dt.Is(kDataTypeValueInvalid)) {
29112                                     UnallocatedT32(instr);
29113                                     return;
29114                                   }
29115                                   if (((instr >> 12) & 1) != 0) {
29116                                     UnallocatedT32(instr);
29117                                     return;
29118                                   }
29119                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29120                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29121                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29122                                   // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29123                                   vabal(CurrentCond(),
29124                                         dt,
29125                                         QRegister(rd),
29126                                         DRegister(rn),
29127                                         DRegister(rm));
29128                                   break;
29129                                 }
29130                                 case 0x00000200: {
29131                                   // 0xef800600
29132                                   switch (instr & 0x10000000) {
29133                                     case 0x00000000: {
29134                                       // 0xef800600
29135                                       if (((instr & 0x300000) == 0x300000)) {
29136                                         UnallocatedT32(instr);
29137                                         return;
29138                                       }
29139                                       DataType dt =
29140                                           Dt_size_3_Decode((instr >> 20) & 0x3);
29141                                       if (dt.Is(kDataTypeValueInvalid)) {
29142                                         UnallocatedT32(instr);
29143                                         return;
29144                                       }
29145                                       unsigned rd =
29146                                           ExtractDRegister(instr, 22, 12);
29147                                       if (((instr >> 16) & 1) != 0) {
29148                                         UnallocatedT32(instr);
29149                                         return;
29150                                       }
29151                                       unsigned rn =
29152                                           ExtractQRegister(instr, 7, 16);
29153                                       if ((instr & 1) != 0) {
29154                                         UnallocatedT32(instr);
29155                                         return;
29156                                       }
29157                                       unsigned rm =
29158                                           ExtractQRegister(instr, 5, 0);
29159                                       // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29160                                       vsubhn(CurrentCond(),
29161                                              dt,
29162                                              DRegister(rd),
29163                                              QRegister(rn),
29164                                              QRegister(rm));
29165                                       break;
29166                                     }
29167                                     case 0x10000000: {
29168                                       // 0xff800600
29169                                       if (((instr & 0x300000) == 0x300000)) {
29170                                         UnallocatedT32(instr);
29171                                         return;
29172                                       }
29173                                       DataType dt =
29174                                           Dt_size_3_Decode((instr >> 20) & 0x3);
29175                                       if (dt.Is(kDataTypeValueInvalid)) {
29176                                         UnallocatedT32(instr);
29177                                         return;
29178                                       }
29179                                       unsigned rd =
29180                                           ExtractDRegister(instr, 22, 12);
29181                                       if (((instr >> 16) & 1) != 0) {
29182                                         UnallocatedT32(instr);
29183                                         return;
29184                                       }
29185                                       unsigned rn =
29186                                           ExtractQRegister(instr, 7, 16);
29187                                       if ((instr & 1) != 0) {
29188                                         UnallocatedT32(instr);
29189                                         return;
29190                                       }
29191                                       unsigned rm =
29192                                           ExtractQRegister(instr, 5, 0);
29193                                       // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
29194                                       vrsubhn(CurrentCond(),
29195                                               dt,
29196                                               DRegister(rd),
29197                                               QRegister(rn),
29198                                               QRegister(rm));
29199                                       break;
29200                                     }
29201                                   }
29202                                   break;
29203                                 }
29204                                 case 0x00000300: {
29205                                   // 0xef800700
29206                                   if (((instr & 0x300000) == 0x300000)) {
29207                                     UnallocatedT32(instr);
29208                                     return;
29209                                   }
29210                                   DataType dt =
29211                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
29212                                                          ((instr >> 26) & 0x4));
29213                                   if (dt.Is(kDataTypeValueInvalid)) {
29214                                     UnallocatedT32(instr);
29215                                     return;
29216                                   }
29217                                   if (((instr >> 12) & 1) != 0) {
29218                                     UnallocatedT32(instr);
29219                                     return;
29220                                   }
29221                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29222                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29223                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29224                                   // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29225                                   vabdl(CurrentCond(),
29226                                         dt,
29227                                         QRegister(rd),
29228                                         DRegister(rn),
29229                                         DRegister(rm));
29230                                   break;
29231                                 }
29232                               }
29233                               break;
29234                             }
29235                             case 0x00000440: {
29236                               // 0xef800440
29237                               switch (instr & 0x00000200) {
29238                                 case 0x00000000: {
29239                                   // 0xef800440
29240                                   switch (instr & 0x10000000) {
29241                                     case 0x00000000: {
29242                                       // 0xef800440
29243                                       if (((instr & 0x300000) == 0x300000)) {
29244                                         UnallocatedT32(instr);
29245                                         return;
29246                                       }
29247                                       DataType dt =
29248                                           Dt_size_9_Decode((instr >> 20) & 0x3,
29249                                                            (instr >> 8) & 0x1);
29250                                       if (dt.Is(kDataTypeValueInvalid)) {
29251                                         UnallocatedT32(instr);
29252                                         return;
29253                                       }
29254                                       unsigned rd =
29255                                           ExtractDRegister(instr, 22, 12);
29256                                       unsigned rn =
29257                                           ExtractDRegister(instr, 7, 16);
29258                                       int lane;
29259                                       unsigned rm =
29260                                           ExtractDRegisterAndLane(instr,
29261                                                                   dt,
29262                                                                   5,
29263                                                                   0,
29264                                                                   &lane);
29265                                       // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29266                                       vmls(CurrentCond(),
29267                                            dt,
29268                                            DRegister(rd),
29269                                            DRegister(rn),
29270                                            DRegisterLane(rm, lane));
29271                                       break;
29272                                     }
29273                                     case 0x10000000: {
29274                                       // 0xff800440
29275                                       if (((instr & 0x300000) == 0x300000)) {
29276                                         UnallocatedT32(instr);
29277                                         return;
29278                                       }
29279                                       DataType dt =
29280                                           Dt_size_9_Decode((instr >> 20) & 0x3,
29281                                                            (instr >> 8) & 0x1);
29282                                       if (dt.Is(kDataTypeValueInvalid)) {
29283                                         UnallocatedT32(instr);
29284                                         return;
29285                                       }
29286                                       if (((instr >> 12) & 1) != 0) {
29287                                         UnallocatedT32(instr);
29288                                         return;
29289                                       }
29290                                       unsigned rd =
29291                                           ExtractQRegister(instr, 22, 12);
29292                                       if (((instr >> 16) & 1) != 0) {
29293                                         UnallocatedT32(instr);
29294                                         return;
29295                                       }
29296                                       unsigned rn =
29297                                           ExtractQRegister(instr, 7, 16);
29298                                       int lane;
29299                                       unsigned rm =
29300                                           ExtractDRegisterAndLane(instr,
29301                                                                   dt,
29302                                                                   5,
29303                                                                   0,
29304                                                                   &lane);
29305                                       // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29306                                       vmls(CurrentCond(),
29307                                            dt,
29308                                            QRegister(rd),
29309                                            QRegister(rn),
29310                                            DRegisterLane(rm, lane));
29311                                       break;
29312                                     }
29313                                   }
29314                                   break;
29315                                 }
29316                                 case 0x00000200: {
29317                                   // 0xef800640
29318                                   switch (instr & 0x00000100) {
29319                                     case 0x00000000: {
29320                                       // 0xef800640
29321                                       if (((instr & 0x300000) == 0x300000)) {
29322                                         UnallocatedT32(instr);
29323                                         return;
29324                                       }
29325                                       DataType dt =
29326                                           Dt_size_11_Decode((instr >> 20) & 0x3,
29327                                                             (instr >> 28) &
29328                                                                 0x1);
29329                                       if (dt.Is(kDataTypeValueInvalid)) {
29330                                         UnallocatedT32(instr);
29331                                         return;
29332                                       }
29333                                       if (((instr >> 12) & 1) != 0) {
29334                                         UnallocatedT32(instr);
29335                                         return;
29336                                       }
29337                                       unsigned rd =
29338                                           ExtractQRegister(instr, 22, 12);
29339                                       unsigned rn =
29340                                           ExtractDRegister(instr, 7, 16);
29341                                       int lane;
29342                                       unsigned rm =
29343                                           ExtractDRegisterAndLane(instr,
29344                                                                   dt,
29345                                                                   5,
29346                                                                   0,
29347                                                                   &lane);
29348                                       // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
29349                                       vmlsl(CurrentCond(),
29350                                             dt,
29351                                             QRegister(rd),
29352                                             DRegister(rn),
29353                                             DRegisterLane(rm, lane));
29354                                       break;
29355                                     }
29356                                     case 0x00000100: {
29357                                       // 0xef800740
29358                                       if ((instr & 0x10000000) == 0x00000000) {
29359                                         if (((instr & 0x300000) == 0x300000)) {
29360                                           UnallocatedT32(instr);
29361                                           return;
29362                                         }
29363                                         DataType dt = Dt_size_13_Decode(
29364                                             (instr >> 20) & 0x3);
29365                                         if (dt.Is(kDataTypeValueInvalid)) {
29366                                           UnallocatedT32(instr);
29367                                           return;
29368                                         }
29369                                         if (((instr >> 12) & 1) != 0) {
29370                                           UnallocatedT32(instr);
29371                                           return;
29372                                         }
29373                                         unsigned rd =
29374                                             ExtractQRegister(instr, 22, 12);
29375                                         unsigned rn =
29376                                             ExtractDRegister(instr, 7, 16);
29377                                         uint32_t mvm = (instr & 0xf) |
29378                                                        ((instr >> 1) & 0x10);
29379                                         uint32_t shift = 4;
29380                                         if (dt.Is(S16)) {
29381                                           shift = 3;
29382                                         }
29383                                         uint32_t vm = mvm & ((1 << shift) - 1);
29384                                         uint32_t index = mvm >> shift;
29385                                         // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
29386                                         vqdmlsl(CurrentCond(),
29387                                                 dt,
29388                                                 QRegister(rd),
29389                                                 DRegister(rn),
29390                                                 DRegister(vm),
29391                                                 index);
29392                                       } else {
29393                                         UnallocatedT32(instr);
29394                                       }
29395                                       break;
29396                                     }
29397                                   }
29398                                   break;
29399                                 }
29400                               }
29401                               break;
29402                             }
29403                             case 0x00000800: {
29404                               // 0xef800800
29405                               switch (instr & 0x00000300) {
29406                                 case 0x00000000: {
29407                                   // 0xef800800
29408                                   if (((instr & 0x300000) == 0x300000)) {
29409                                     UnallocatedT32(instr);
29410                                     return;
29411                                   }
29412                                   DataType dt =
29413                                       Dt_size_12_Decode((instr >> 20) & 0x3,
29414                                                         (instr >> 28) & 0x1);
29415                                   if (dt.Is(kDataTypeValueInvalid)) {
29416                                     UnallocatedT32(instr);
29417                                     return;
29418                                   }
29419                                   if (((instr >> 12) & 1) != 0) {
29420                                     UnallocatedT32(instr);
29421                                     return;
29422                                   }
29423                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29424                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29425                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29426                                   // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29427                                   vmlal(CurrentCond(),
29428                                         dt,
29429                                         QRegister(rd),
29430                                         DRegister(rn),
29431                                         DRegister(rm));
29432                                   break;
29433                                 }
29434                                 case 0x00000100: {
29435                                   // 0xef800900
29436                                   if ((instr & 0x10000000) == 0x00000000) {
29437                                     if (((instr & 0x300000) == 0x300000)) {
29438                                       UnallocatedT32(instr);
29439                                       return;
29440                                     }
29441                                     DataType dt =
29442                                         Dt_size_13_Decode((instr >> 20) & 0x3);
29443                                     if (dt.Is(kDataTypeValueInvalid)) {
29444                                       UnallocatedT32(instr);
29445                                       return;
29446                                     }
29447                                     if (((instr >> 12) & 1) != 0) {
29448                                       UnallocatedT32(instr);
29449                                       return;
29450                                     }
29451                                     unsigned rd =
29452                                         ExtractQRegister(instr, 22, 12);
29453                                     unsigned rn =
29454                                         ExtractDRegister(instr, 7, 16);
29455                                     unsigned rm = ExtractDRegister(instr, 5, 0);
29456                                     // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29457                                     vqdmlal(CurrentCond(),
29458                                             dt,
29459                                             QRegister(rd),
29460                                             DRegister(rn),
29461                                             DRegister(rm));
29462                                   } else {
29463                                     UnallocatedT32(instr);
29464                                   }
29465                                   break;
29466                                 }
29467                                 case 0x00000200: {
29468                                   // 0xef800a00
29469                                   if (((instr & 0x300000) == 0x300000)) {
29470                                     UnallocatedT32(instr);
29471                                     return;
29472                                   }
29473                                   DataType dt =
29474                                       Dt_size_12_Decode((instr >> 20) & 0x3,
29475                                                         (instr >> 28) & 0x1);
29476                                   if (dt.Is(kDataTypeValueInvalid)) {
29477                                     UnallocatedT32(instr);
29478                                     return;
29479                                   }
29480                                   if (((instr >> 12) & 1) != 0) {
29481                                     UnallocatedT32(instr);
29482                                     return;
29483                                   }
29484                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29485                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29486                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29487                                   // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29488                                   vmlsl(CurrentCond(),
29489                                         dt,
29490                                         QRegister(rd),
29491                                         DRegister(rn),
29492                                         DRegister(rm));
29493                                   break;
29494                                 }
29495                                 case 0x00000300: {
29496                                   // 0xef800b00
29497                                   if ((instr & 0x10000000) == 0x00000000) {
29498                                     if (((instr & 0x300000) == 0x300000)) {
29499                                       UnallocatedT32(instr);
29500                                       return;
29501                                     }
29502                                     DataType dt =
29503                                         Dt_size_13_Decode((instr >> 20) & 0x3);
29504                                     if (dt.Is(kDataTypeValueInvalid)) {
29505                                       UnallocatedT32(instr);
29506                                       return;
29507                                     }
29508                                     if (((instr >> 12) & 1) != 0) {
29509                                       UnallocatedT32(instr);
29510                                       return;
29511                                     }
29512                                     unsigned rd =
29513                                         ExtractQRegister(instr, 22, 12);
29514                                     unsigned rn =
29515                                         ExtractDRegister(instr, 7, 16);
29516                                     unsigned rm = ExtractDRegister(instr, 5, 0);
29517                                     // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29518                                     vqdmlsl(CurrentCond(),
29519                                             dt,
29520                                             QRegister(rd),
29521                                             DRegister(rn),
29522                                             DRegister(rm));
29523                                   } else {
29524                                     UnallocatedT32(instr);
29525                                   }
29526                                   break;
29527                                 }
29528                               }
29529                               break;
29530                             }
29531                             case 0x00000840: {
29532                               // 0xef800840
29533                               switch (instr & 0x00000200) {
29534                                 case 0x00000000: {
29535                                   // 0xef800840
29536                                   switch (instr & 0x10000000) {
29537                                     case 0x00000000: {
29538                                       // 0xef800840
29539                                       if (((instr & 0x300000) == 0x300000)) {
29540                                         UnallocatedT32(instr);
29541                                         return;
29542                                       }
29543                                       DataType dt = Dt_F_size_3_Decode(
29544                                           ((instr >> 20) & 0x3) |
29545                                           ((instr >> 6) & 0x4));
29546                                       if (dt.Is(kDataTypeValueInvalid)) {
29547                                         UnallocatedT32(instr);
29548                                         return;
29549                                       }
29550                                       unsigned rd =
29551                                           ExtractDRegister(instr, 22, 12);
29552                                       unsigned rn =
29553                                           ExtractDRegister(instr, 7, 16);
29554                                       uint32_t mvm =
29555                                           (instr & 0xf) | ((instr >> 1) & 0x10);
29556                                       uint32_t shift = 4;
29557                                       if (dt.Is(I16)) {
29558                                         shift = 3;
29559                                       }
29560                                       uint32_t vm = mvm & ((1 << shift) - 1);
29561                                       uint32_t index = mvm >> shift;
29562                                       // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29563                                       vmul(CurrentCond(),
29564                                            dt,
29565                                            DRegister(rd),
29566                                            DRegister(rn),
29567                                            DRegister(vm),
29568                                            index);
29569                                       break;
29570                                     }
29571                                     case 0x10000000: {
29572                                       // 0xff800840
29573                                       if (((instr & 0x300000) == 0x300000)) {
29574                                         UnallocatedT32(instr);
29575                                         return;
29576                                       }
29577                                       DataType dt = Dt_F_size_3_Decode(
29578                                           ((instr >> 20) & 0x3) |
29579                                           ((instr >> 6) & 0x4));
29580                                       if (dt.Is(kDataTypeValueInvalid)) {
29581                                         UnallocatedT32(instr);
29582                                         return;
29583                                       }
29584                                       if (((instr >> 12) & 1) != 0) {
29585                                         UnallocatedT32(instr);
29586                                         return;
29587                                       }
29588                                       unsigned rd =
29589                                           ExtractQRegister(instr, 22, 12);
29590                                       if (((instr >> 16) & 1) != 0) {
29591                                         UnallocatedT32(instr);
29592                                         return;
29593                                       }
29594                                       unsigned rn =
29595                                           ExtractQRegister(instr, 7, 16);
29596                                       uint32_t mvm =
29597                                           (instr & 0xf) | ((instr >> 1) & 0x10);
29598                                       uint32_t shift = 4;
29599                                       if (dt.Is(I16)) {
29600                                         shift = 3;
29601                                       }
29602                                       uint32_t vm = mvm & ((1 << shift) - 1);
29603                                       uint32_t index = mvm >> shift;
29604                                       // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29605                                       vmul(CurrentCond(),
29606                                            dt,
29607                                            QRegister(rd),
29608                                            QRegister(rn),
29609                                            DRegister(vm),
29610                                            index);
29611                                       break;
29612                                     }
29613                                   }
29614                                   break;
29615                                 }
29616                                 case 0x00000200: {
29617                                   // 0xef800a40
29618                                   switch (instr & 0x00000100) {
29619                                     case 0x00000000: {
29620                                       // 0xef800a40
29621                                       if (((instr & 0x300000) == 0x300000)) {
29622                                         UnallocatedT32(instr);
29623                                         return;
29624                                       }
29625                                       DataType dt = Dt_U_size_2_Decode(
29626                                           ((instr >> 20) & 0x3) |
29627                                           ((instr >> 26) & 0x4));
29628                                       if (dt.Is(kDataTypeValueInvalid)) {
29629                                         UnallocatedT32(instr);
29630                                         return;
29631                                       }
29632                                       if (((instr >> 12) & 1) != 0) {
29633                                         UnallocatedT32(instr);
29634                                         return;
29635                                       }
29636                                       unsigned rd =
29637                                           ExtractQRegister(instr, 22, 12);
29638                                       unsigned rn =
29639                                           ExtractDRegister(instr, 7, 16);
29640                                       uint32_t mvm =
29641                                           (instr & 0xf) | ((instr >> 1) & 0x10);
29642                                       uint32_t shift = 4;
29643                                       if (dt.Is(S16) || dt.Is(U16)) {
29644                                         shift = 3;
29645                                       }
29646                                       uint32_t vm = mvm & ((1 << shift) - 1);
29647                                       uint32_t index = mvm >> shift;
29648                                       // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
29649                                       vmull(CurrentCond(),
29650                                             dt,
29651                                             QRegister(rd),
29652                                             DRegister(rn),
29653                                             DRegister(vm),
29654                                             index);
29655                                       break;
29656                                     }
29657                                     case 0x00000100: {
29658                                       // 0xef800b40
29659                                       if ((instr & 0x10000000) == 0x00000000) {
29660                                         if (((instr & 0x300000) == 0x300000)) {
29661                                           UnallocatedT32(instr);
29662                                           return;
29663                                         }
29664                                         DataType dt = Dt_size_13_Decode(
29665                                             (instr >> 20) & 0x3);
29666                                         if (dt.Is(kDataTypeValueInvalid)) {
29667                                           UnallocatedT32(instr);
29668                                           return;
29669                                         }
29670                                         if (((instr >> 12) & 1) != 0) {
29671                                           UnallocatedT32(instr);
29672                                           return;
29673                                         }
29674                                         unsigned rd =
29675                                             ExtractQRegister(instr, 22, 12);
29676                                         unsigned rn =
29677                                             ExtractDRegister(instr, 7, 16);
29678                                         int lane;
29679                                         unsigned rm =
29680                                             ExtractDRegisterAndLane(instr,
29681                                                                     dt,
29682                                                                     5,
29683                                                                     0,
29684                                                                     &lane);
29685                                         // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29686                                         vqdmull(CurrentCond(),
29687                                                 dt,
29688                                                 QRegister(rd),
29689                                                 DRegister(rn),
29690                                                 DRegisterLane(rm, lane));
29691                                       } else {
29692                                         UnallocatedT32(instr);
29693                                       }
29694                                       break;
29695                                     }
29696                                   }
29697                                   break;
29698                                 }
29699                               }
29700                               break;
29701                             }
29702                             case 0x00000c00: {
29703                               // 0xef800c00
29704                               switch (instr & 0x00000100) {
29705                                 case 0x00000000: {
29706                                   // 0xef800c00
29707                                   if (((instr & 0x300000) == 0x300000)) {
29708                                     UnallocatedT32(instr);
29709                                     return;
29710                                   }
29711                                   DataType dt = Dt_op_U_size_1_Decode(
29712                                       ((instr >> 20) & 0x3) |
29713                                       ((instr >> 26) & 0x4) |
29714                                       ((instr >> 6) & 0x8));
29715                                   if (dt.Is(kDataTypeValueInvalid)) {
29716                                     UnallocatedT32(instr);
29717                                     return;
29718                                   }
29719                                   if (((instr >> 12) & 1) != 0) {
29720                                     UnallocatedT32(instr);
29721                                     return;
29722                                   }
29723                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29724                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29725                                   unsigned rm = ExtractDRegister(instr, 5, 0);
29726                                   // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
29727                                   vmull(CurrentCond(),
29728                                         dt,
29729                                         QRegister(rd),
29730                                         DRegister(rn),
29731                                         DRegister(rm));
29732                                   break;
29733                                 }
29734                                 case 0x00000100: {
29735                                   // 0xef800d00
29736                                   if ((instr & 0x10000200) == 0x00000000) {
29737                                     if (((instr & 0x300000) == 0x300000)) {
29738                                       UnallocatedT32(instr);
29739                                       return;
29740                                     }
29741                                     DataType dt =
29742                                         Dt_size_13_Decode((instr >> 20) & 0x3);
29743                                     if (dt.Is(kDataTypeValueInvalid)) {
29744                                       UnallocatedT32(instr);
29745                                       return;
29746                                     }
29747                                     if (((instr >> 12) & 1) != 0) {
29748                                       UnallocatedT32(instr);
29749                                       return;
29750                                     }
29751                                     unsigned rd =
29752                                         ExtractQRegister(instr, 22, 12);
29753                                     unsigned rn =
29754                                         ExtractDRegister(instr, 7, 16);
29755                                     unsigned rm = ExtractDRegister(instr, 5, 0);
29756                                     // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
29757                                     vqdmull(CurrentCond(),
29758                                             dt,
29759                                             QRegister(rd),
29760                                             DRegister(rn),
29761                                             DRegister(rm));
29762                                   } else {
29763                                     UnallocatedT32(instr);
29764                                   }
29765                                   break;
29766                                 }
29767                               }
29768                               break;
29769                             }
29770                             case 0x00000c40: {
29771                               // 0xef800c40
29772                               switch (instr & 0x10000300) {
29773                                 case 0x00000000: {
29774                                   // 0xef800c40
29775                                   if (((instr & 0x300000) == 0x300000)) {
29776                                     UnallocatedT32(instr);
29777                                     return;
29778                                   }
29779                                   DataType dt =
29780                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29781                                   if (dt.Is(kDataTypeValueInvalid)) {
29782                                     UnallocatedT32(instr);
29783                                     return;
29784                                   }
29785                                   unsigned rd = ExtractDRegister(instr, 22, 12);
29786                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29787                                   int lane;
29788                                   unsigned rm = ExtractDRegisterAndLane(instr,
29789                                                                         dt,
29790                                                                         5,
29791                                                                         0,
29792                                                                         &lane);
29793                                   // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29794                                   vqdmulh(CurrentCond(),
29795                                           dt,
29796                                           DRegister(rd),
29797                                           DRegister(rn),
29798                                           DRegisterLane(rm, lane));
29799                                   break;
29800                                 }
29801                                 case 0x00000100: {
29802                                   // 0xef800d40
29803                                   if (((instr & 0x300000) == 0x300000)) {
29804                                     UnallocatedT32(instr);
29805                                     return;
29806                                   }
29807                                   DataType dt =
29808                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29809                                   if (dt.Is(kDataTypeValueInvalid)) {
29810                                     UnallocatedT32(instr);
29811                                     return;
29812                                   }
29813                                   unsigned rd = ExtractDRegister(instr, 22, 12);
29814                                   unsigned rn = ExtractDRegister(instr, 7, 16);
29815                                   int lane;
29816                                   unsigned rm = ExtractDRegisterAndLane(instr,
29817                                                                         dt,
29818                                                                         5,
29819                                                                         0,
29820                                                                         &lane);
29821                                   // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29822                                   vqrdmulh(CurrentCond(),
29823                                            dt,
29824                                            DRegister(rd),
29825                                            DRegister(rn),
29826                                            DRegisterLane(rm, lane));
29827                                   break;
29828                                 }
29829                                 case 0x10000000: {
29830                                   // 0xff800c40
29831                                   if (((instr & 0x300000) == 0x300000)) {
29832                                     UnallocatedT32(instr);
29833                                     return;
29834                                   }
29835                                   DataType dt =
29836                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29837                                   if (dt.Is(kDataTypeValueInvalid)) {
29838                                     UnallocatedT32(instr);
29839                                     return;
29840                                   }
29841                                   if (((instr >> 12) & 1) != 0) {
29842                                     UnallocatedT32(instr);
29843                                     return;
29844                                   }
29845                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29846                                   if (((instr >> 16) & 1) != 0) {
29847                                     UnallocatedT32(instr);
29848                                     return;
29849                                   }
29850                                   unsigned rn = ExtractQRegister(instr, 7, 16);
29851                                   int lane;
29852                                   unsigned rm = ExtractDRegisterAndLane(instr,
29853                                                                         dt,
29854                                                                         5,
29855                                                                         0,
29856                                                                         &lane);
29857                                   // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29858                                   vqdmulh(CurrentCond(),
29859                                           dt,
29860                                           QRegister(rd),
29861                                           QRegister(rn),
29862                                           DRegisterLane(rm, lane));
29863                                   break;
29864                                 }
29865                                 case 0x10000100: {
29866                                   // 0xff800d40
29867                                   if (((instr & 0x300000) == 0x300000)) {
29868                                     UnallocatedT32(instr);
29869                                     return;
29870                                   }
29871                                   DataType dt =
29872                                       Dt_size_13_Decode((instr >> 20) & 0x3);
29873                                   if (dt.Is(kDataTypeValueInvalid)) {
29874                                     UnallocatedT32(instr);
29875                                     return;
29876                                   }
29877                                   if (((instr >> 12) & 1) != 0) {
29878                                     UnallocatedT32(instr);
29879                                     return;
29880                                   }
29881                                   unsigned rd = ExtractQRegister(instr, 22, 12);
29882                                   if (((instr >> 16) & 1) != 0) {
29883                                     UnallocatedT32(instr);
29884                                     return;
29885                                   }
29886                                   unsigned rn = ExtractQRegister(instr, 7, 16);
29887                                   int lane;
29888                                   unsigned rm = ExtractDRegisterAndLane(instr,
29889                                                                         dt,
29890                                                                         5,
29891                                                                         0,
29892                                                                         &lane);
29893                                   // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
29894                                   vqrdmulh(CurrentCond(),
29895                                            dt,
29896                                            QRegister(rd),
29897                                            QRegister(rn),
29898                                            DRegisterLane(rm, lane));
29899                                   break;
29900                                 }
29901                                 default:
29902                                   UnallocatedT32(instr);
29903                                   break;
29904                               }
29905                               break;
29906                             }
29907                           }
29908                           break;
29909                         }
29910                       }
29911                       break;
29912                     }
29913                   }
29914                   break;
29915                 }
29916                 case 0x01000010: {
29917                   // 0xef000010
29918                   switch (instr & 0x00800040) {
29919                     case 0x00000000: {
29920                       // 0xef000010
29921                       switch (instr & 0x00000f00) {
29922                         case 0x00000000: {
29923                           // 0xef000010
29924                           DataType dt = Dt_U_size_3_Decode(
29925                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
29926                           if (dt.Is(kDataTypeValueInvalid)) {
29927                             UnallocatedT32(instr);
29928                             return;
29929                           }
29930                           unsigned rd = ExtractDRegister(instr, 22, 12);
29931                           unsigned rn = ExtractDRegister(instr, 7, 16);
29932                           unsigned rm = ExtractDRegister(instr, 5, 0);
29933                           // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
29934                           vqadd(CurrentCond(),
29935                                 dt,
29936                                 DRegister(rd),
29937                                 DRegister(rn),
29938                                 DRegister(rm));
29939                           break;
29940                         }
29941                         case 0x00000100: {
29942                           // 0xef000110
29943                           switch (instr & 0x10300000) {
29944                             case 0x00000000: {
29945                               // 0xef000110
29946                               unsigned rd = ExtractDRegister(instr, 22, 12);
29947                               unsigned rn = ExtractDRegister(instr, 7, 16);
29948                               unsigned rm = ExtractDRegister(instr, 5, 0);
29949                               // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29950                               vand(CurrentCond(),
29951                                    kDataTypeValueNone,
29952                                    DRegister(rd),
29953                                    DRegister(rn),
29954                                    DRegister(rm));
29955                               break;
29956                             }
29957                             case 0x00100000: {
29958                               // 0xef100110
29959                               unsigned rd = ExtractDRegister(instr, 22, 12);
29960                               unsigned rn = ExtractDRegister(instr, 7, 16);
29961                               unsigned rm = ExtractDRegister(instr, 5, 0);
29962                               // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29963                               vbic(CurrentCond(),
29964                                    kDataTypeValueNone,
29965                                    DRegister(rd),
29966                                    DRegister(rn),
29967                                    DRegister(rm));
29968                               break;
29969                             }
29970                             case 0x00200000: {
29971                               // 0xef200110
29972                               if (((instr & 0x00000040) == 0x00000000) &&
29973                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
29974                                      << 4) |
29975                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
29976                                    (((Uint32((instr >> 5)) & Uint32(0x1))
29977                                      << 4) |
29978                                     (Uint32(instr) & Uint32(0xf))))) {
29979                                 unsigned rd = ExtractDRegister(instr, 22, 12);
29980                                 unsigned rm = ExtractDRegister(instr, 7, 16);
29981                                 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
29982                                 vmov(CurrentCond(),
29983                                      kDataTypeValueNone,
29984                                      DRegister(rd),
29985                                      DRegister(rm));
29986                                 return;
29987                               }
29988                               unsigned rd = ExtractDRegister(instr, 22, 12);
29989                               unsigned rn = ExtractDRegister(instr, 7, 16);
29990                               unsigned rm = ExtractDRegister(instr, 5, 0);
29991                               // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
29992                               vorr(CurrentCond(),
29993                                    kDataTypeValueNone,
29994                                    DRegister(rd),
29995                                    DRegister(rn),
29996                                    DRegister(rm));
29997                               break;
29998                             }
29999                             case 0x00300000: {
30000                               // 0xef300110
30001                               unsigned rd = ExtractDRegister(instr, 22, 12);
30002                               unsigned rn = ExtractDRegister(instr, 7, 16);
30003                               unsigned rm = ExtractDRegister(instr, 5, 0);
30004                               // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30005                               vorn(CurrentCond(),
30006                                    kDataTypeValueNone,
30007                                    DRegister(rd),
30008                                    DRegister(rn),
30009                                    DRegister(rm));
30010                               break;
30011                             }
30012                             case 0x10000000: {
30013                               // 0xff000110
30014                               unsigned rd = ExtractDRegister(instr, 22, 12);
30015                               unsigned rn = ExtractDRegister(instr, 7, 16);
30016                               unsigned rm = ExtractDRegister(instr, 5, 0);
30017                               // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30018                               veor(CurrentCond(),
30019                                    kDataTypeValueNone,
30020                                    DRegister(rd),
30021                                    DRegister(rn),
30022                                    DRegister(rm));
30023                               break;
30024                             }
30025                             case 0x10100000: {
30026                               // 0xff100110
30027                               unsigned rd = ExtractDRegister(instr, 22, 12);
30028                               unsigned rn = ExtractDRegister(instr, 7, 16);
30029                               unsigned rm = ExtractDRegister(instr, 5, 0);
30030                               // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30031                               vbsl(CurrentCond(),
30032                                    kDataTypeValueNone,
30033                                    DRegister(rd),
30034                                    DRegister(rn),
30035                                    DRegister(rm));
30036                               break;
30037                             }
30038                             case 0x10200000: {
30039                               // 0xff200110
30040                               unsigned rd = ExtractDRegister(instr, 22, 12);
30041                               unsigned rn = ExtractDRegister(instr, 7, 16);
30042                               unsigned rm = ExtractDRegister(instr, 5, 0);
30043                               // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30044                               vbit(CurrentCond(),
30045                                    kDataTypeValueNone,
30046                                    DRegister(rd),
30047                                    DRegister(rn),
30048                                    DRegister(rm));
30049                               break;
30050                             }
30051                             case 0x10300000: {
30052                               // 0xff300110
30053                               unsigned rd = ExtractDRegister(instr, 22, 12);
30054                               unsigned rn = ExtractDRegister(instr, 7, 16);
30055                               unsigned rm = ExtractDRegister(instr, 5, 0);
30056                               // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
30057                               vbif(CurrentCond(),
30058                                    kDataTypeValueNone,
30059                                    DRegister(rd),
30060                                    DRegister(rn),
30061                                    DRegister(rm));
30062                               break;
30063                             }
30064                           }
30065                           break;
30066                         }
30067                         case 0x00000200: {
30068                           // 0xef000210
30069                           DataType dt = Dt_U_size_3_Decode(
30070                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30071                           if (dt.Is(kDataTypeValueInvalid)) {
30072                             UnallocatedT32(instr);
30073                             return;
30074                           }
30075                           unsigned rd = ExtractDRegister(instr, 22, 12);
30076                           unsigned rn = ExtractDRegister(instr, 7, 16);
30077                           unsigned rm = ExtractDRegister(instr, 5, 0);
30078                           // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30079                           vqsub(CurrentCond(),
30080                                 dt,
30081                                 DRegister(rd),
30082                                 DRegister(rn),
30083                                 DRegister(rm));
30084                           break;
30085                         }
30086                         case 0x00000300: {
30087                           // 0xef000310
30088                           DataType dt = Dt_U_size_1_Decode(
30089                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30090                           if (dt.Is(kDataTypeValueInvalid)) {
30091                             UnallocatedT32(instr);
30092                             return;
30093                           }
30094                           unsigned rd = ExtractDRegister(instr, 22, 12);
30095                           unsigned rn = ExtractDRegister(instr, 7, 16);
30096                           unsigned rm = ExtractDRegister(instr, 5, 0);
30097                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30098                           vcge(CurrentCond(),
30099                                dt,
30100                                DRegister(rd),
30101                                DRegister(rn),
30102                                DRegister(rm));
30103                           break;
30104                         }
30105                         case 0x00000400: {
30106                           // 0xef000410
30107                           DataType dt = Dt_U_size_3_Decode(
30108                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30109                           if (dt.Is(kDataTypeValueInvalid)) {
30110                             UnallocatedT32(instr);
30111                             return;
30112                           }
30113                           unsigned rd = ExtractDRegister(instr, 22, 12);
30114                           unsigned rm = ExtractDRegister(instr, 5, 0);
30115                           unsigned rn = ExtractDRegister(instr, 7, 16);
30116                           // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
30117                           vqshl(CurrentCond(),
30118                                 dt,
30119                                 DRegister(rd),
30120                                 DRegister(rm),
30121                                 DRegister(rn));
30122                           break;
30123                         }
30124                         case 0x00000500: {
30125                           // 0xef000510
30126                           DataType dt = Dt_U_size_3_Decode(
30127                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30128                           if (dt.Is(kDataTypeValueInvalid)) {
30129                             UnallocatedT32(instr);
30130                             return;
30131                           }
30132                           unsigned rd = ExtractDRegister(instr, 22, 12);
30133                           unsigned rm = ExtractDRegister(instr, 5, 0);
30134                           unsigned rn = ExtractDRegister(instr, 7, 16);
30135                           // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
30136                           vqrshl(CurrentCond(),
30137                                  dt,
30138                                  DRegister(rd),
30139                                  DRegister(rm),
30140                                  DRegister(rn));
30141                           break;
30142                         }
30143                         case 0x00000600: {
30144                           // 0xef000610
30145                           DataType dt = Dt_U_size_1_Decode(
30146                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30147                           if (dt.Is(kDataTypeValueInvalid)) {
30148                             UnallocatedT32(instr);
30149                             return;
30150                           }
30151                           unsigned rd = ExtractDRegister(instr, 22, 12);
30152                           unsigned rn = ExtractDRegister(instr, 7, 16);
30153                           unsigned rm = ExtractDRegister(instr, 5, 0);
30154                           // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30155                           vmin(CurrentCond(),
30156                                dt,
30157                                DRegister(rd),
30158                                DRegister(rn),
30159                                DRegister(rm));
30160                           break;
30161                         }
30162                         case 0x00000700: {
30163                           // 0xef000710
30164                           DataType dt = Dt_U_size_1_Decode(
30165                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30166                           if (dt.Is(kDataTypeValueInvalid)) {
30167                             UnallocatedT32(instr);
30168                             return;
30169                           }
30170                           unsigned rd = ExtractDRegister(instr, 22, 12);
30171                           unsigned rn = ExtractDRegister(instr, 7, 16);
30172                           unsigned rm = ExtractDRegister(instr, 5, 0);
30173                           // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
30174                           vaba(CurrentCond(),
30175                                dt,
30176                                DRegister(rd),
30177                                DRegister(rn),
30178                                DRegister(rm));
30179                           break;
30180                         }
30181                         case 0x00000800: {
30182                           // 0xef000810
30183                           switch (instr & 0x10000000) {
30184                             case 0x00000000: {
30185                               // 0xef000810
30186                               DataType dt =
30187                                   Dt_size_7_Decode((instr >> 20) & 0x3);
30188                               if (dt.Is(kDataTypeValueInvalid)) {
30189                                 UnallocatedT32(instr);
30190                                 return;
30191                               }
30192                               unsigned rd = ExtractDRegister(instr, 22, 12);
30193                               unsigned rn = ExtractDRegister(instr, 7, 16);
30194                               unsigned rm = ExtractDRegister(instr, 5, 0);
30195                               // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30196                               vtst(CurrentCond(),
30197                                    dt,
30198                                    DRegister(rd),
30199                                    DRegister(rn),
30200                                    DRegister(rm));
30201                               break;
30202                             }
30203                             case 0x10000000: {
30204                               // 0xff000810
30205                               DataType dt =
30206                                   Dt_size_4_Decode((instr >> 20) & 0x3);
30207                               if (dt.Is(kDataTypeValueInvalid)) {
30208                                 UnallocatedT32(instr);
30209                                 return;
30210                               }
30211                               unsigned rd = ExtractDRegister(instr, 22, 12);
30212                               unsigned rn = ExtractDRegister(instr, 7, 16);
30213                               unsigned rm = ExtractDRegister(instr, 5, 0);
30214                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30215                               vceq(CurrentCond(),
30216                                    dt,
30217                                    DRegister(rd),
30218                                    DRegister(rn),
30219                                    DRegister(rm));
30220                               break;
30221                             }
30222                           }
30223                           break;
30224                         }
30225                         case 0x00000900: {
30226                           // 0xef000910
30227                           DataType dt = Dt_op_size_1_Decode(
30228                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30229                           if (dt.Is(kDataTypeValueInvalid)) {
30230                             UnallocatedT32(instr);
30231                             return;
30232                           }
30233                           unsigned rd = ExtractDRegister(instr, 22, 12);
30234                           unsigned rn = ExtractDRegister(instr, 7, 16);
30235                           unsigned rm = ExtractDRegister(instr, 5, 0);
30236                           // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30237                           vmul(CurrentCond(),
30238                                dt,
30239                                DRegister(rd),
30240                                DRegister(rn),
30241                                DRegister(rm));
30242                           break;
30243                         }
30244                         case 0x00000a00: {
30245                           // 0xef000a10
30246                           DataType dt = Dt_U_size_1_Decode(
30247                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30248                           if (dt.Is(kDataTypeValueInvalid)) {
30249                             UnallocatedT32(instr);
30250                             return;
30251                           }
30252                           unsigned rd = ExtractDRegister(instr, 22, 12);
30253                           unsigned rn = ExtractDRegister(instr, 7, 16);
30254                           unsigned rm = ExtractDRegister(instr, 5, 0);
30255                           // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30256                           vpmin(CurrentCond(),
30257                                 dt,
30258                                 DRegister(rd),
30259                                 DRegister(rn),
30260                                 DRegister(rm));
30261                           break;
30262                         }
30263                         case 0x00000b00: {
30264                           // 0xef000b10
30265                           if ((instr & 0x10000000) == 0x00000000) {
30266                             DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
30267                             if (dt.Is(kDataTypeValueInvalid)) {
30268                               UnallocatedT32(instr);
30269                               return;
30270                             }
30271                             unsigned rd = ExtractDRegister(instr, 22, 12);
30272                             unsigned rn = ExtractDRegister(instr, 7, 16);
30273                             unsigned rm = ExtractDRegister(instr, 5, 0);
30274                             // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
30275                             vpadd(CurrentCond(),
30276                                   dt,
30277                                   DRegister(rd),
30278                                   DRegister(rn),
30279                                   DRegister(rm));
30280                           } else {
30281                             UnallocatedT32(instr);
30282                           }
30283                           break;
30284                         }
30285                         case 0x00000c00: {
30286                           // 0xef000c10
30287                           switch (instr & 0x10300000) {
30288                             case 0x00000000: {
30289                               // 0xef000c10
30290                               unsigned rd = ExtractDRegister(instr, 22, 12);
30291                               unsigned rn = ExtractDRegister(instr, 7, 16);
30292                               unsigned rm = ExtractDRegister(instr, 5, 0);
30293                               // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30294                               vfma(CurrentCond(),
30295                                    F32,
30296                                    DRegister(rd),
30297                                    DRegister(rn),
30298                                    DRegister(rm));
30299                               break;
30300                             }
30301                             case 0x00200000: {
30302                               // 0xef200c10
30303                               unsigned rd = ExtractDRegister(instr, 22, 12);
30304                               unsigned rn = ExtractDRegister(instr, 7, 16);
30305                               unsigned rm = ExtractDRegister(instr, 5, 0);
30306                               // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30307                               vfms(CurrentCond(),
30308                                    F32,
30309                                    DRegister(rd),
30310                                    DRegister(rn),
30311                                    DRegister(rm));
30312                               break;
30313                             }
30314                             default:
30315                               UnallocatedT32(instr);
30316                               break;
30317                           }
30318                           break;
30319                         }
30320                         case 0x00000d00: {
30321                           // 0xef000d10
30322                           switch (instr & 0x10300000) {
30323                             case 0x00000000: {
30324                               // 0xef000d10
30325                               unsigned rd = ExtractDRegister(instr, 22, 12);
30326                               unsigned rn = ExtractDRegister(instr, 7, 16);
30327                               unsigned rm = ExtractDRegister(instr, 5, 0);
30328                               // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30329                               vmla(CurrentCond(),
30330                                    F32,
30331                                    DRegister(rd),
30332                                    DRegister(rn),
30333                                    DRegister(rm));
30334                               break;
30335                             }
30336                             case 0x00200000: {
30337                               // 0xef200d10
30338                               unsigned rd = ExtractDRegister(instr, 22, 12);
30339                               unsigned rn = ExtractDRegister(instr, 7, 16);
30340                               unsigned rm = ExtractDRegister(instr, 5, 0);
30341                               // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30342                               vmls(CurrentCond(),
30343                                    F32,
30344                                    DRegister(rd),
30345                                    DRegister(rn),
30346                                    DRegister(rm));
30347                               break;
30348                             }
30349                             case 0x10000000: {
30350                               // 0xff000d10
30351                               unsigned rd = ExtractDRegister(instr, 22, 12);
30352                               unsigned rn = ExtractDRegister(instr, 7, 16);
30353                               unsigned rm = ExtractDRegister(instr, 5, 0);
30354                               // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30355                               vmul(CurrentCond(),
30356                                    F32,
30357                                    DRegister(rd),
30358                                    DRegister(rn),
30359                                    DRegister(rm));
30360                               break;
30361                             }
30362                             default:
30363                               UnallocatedT32(instr);
30364                               break;
30365                           }
30366                           break;
30367                         }
30368                         case 0x00000e00: {
30369                           // 0xef000e10
30370                           switch (instr & 0x10300000) {
30371                             case 0x10000000: {
30372                               // 0xff000e10
30373                               unsigned rd = ExtractDRegister(instr, 22, 12);
30374                               unsigned rn = ExtractDRegister(instr, 7, 16);
30375                               unsigned rm = ExtractDRegister(instr, 5, 0);
30376                               // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30377                               vacge(CurrentCond(),
30378                                     F32,
30379                                     DRegister(rd),
30380                                     DRegister(rn),
30381                                     DRegister(rm));
30382                               break;
30383                             }
30384                             case 0x10200000: {
30385                               // 0xff200e10
30386                               unsigned rd = ExtractDRegister(instr, 22, 12);
30387                               unsigned rn = ExtractDRegister(instr, 7, 16);
30388                               unsigned rm = ExtractDRegister(instr, 5, 0);
30389                               // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30390                               vacgt(CurrentCond(),
30391                                     F32,
30392                                     DRegister(rd),
30393                                     DRegister(rn),
30394                                     DRegister(rm));
30395                               break;
30396                             }
30397                             default:
30398                               UnallocatedT32(instr);
30399                               break;
30400                           }
30401                           break;
30402                         }
30403                         case 0x00000f00: {
30404                           // 0xef000f10
30405                           switch (instr & 0x10300000) {
30406                             case 0x00000000: {
30407                               // 0xef000f10
30408                               unsigned rd = ExtractDRegister(instr, 22, 12);
30409                               unsigned rn = ExtractDRegister(instr, 7, 16);
30410                               unsigned rm = ExtractDRegister(instr, 5, 0);
30411                               // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30412                               vrecps(CurrentCond(),
30413                                      F32,
30414                                      DRegister(rd),
30415                                      DRegister(rn),
30416                                      DRegister(rm));
30417                               break;
30418                             }
30419                             case 0x00200000: {
30420                               // 0xef200f10
30421                               unsigned rd = ExtractDRegister(instr, 22, 12);
30422                               unsigned rn = ExtractDRegister(instr, 7, 16);
30423                               unsigned rm = ExtractDRegister(instr, 5, 0);
30424                               // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
30425                               vrsqrts(CurrentCond(),
30426                                       F32,
30427                                       DRegister(rd),
30428                                       DRegister(rn),
30429                                       DRegister(rm));
30430                               break;
30431                             }
30432                             case 0x10000000: {
30433                               // 0xff000f10
30434                               unsigned rd = ExtractDRegister(instr, 22, 12);
30435                               unsigned rn = ExtractDRegister(instr, 7, 16);
30436                               unsigned rm = ExtractDRegister(instr, 5, 0);
30437                               // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30438                               vmaxnm(F32,
30439                                      DRegister(rd),
30440                                      DRegister(rn),
30441                                      DRegister(rm));
30442                               break;
30443                             }
30444                             case 0x10200000: {
30445                               // 0xff200f10
30446                               unsigned rd = ExtractDRegister(instr, 22, 12);
30447                               unsigned rn = ExtractDRegister(instr, 7, 16);
30448                               unsigned rm = ExtractDRegister(instr, 5, 0);
30449                               // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
30450                               vminnm(F32,
30451                                      DRegister(rd),
30452                                      DRegister(rn),
30453                                      DRegister(rm));
30454                               break;
30455                             }
30456                             default:
30457                               UnallocatedT32(instr);
30458                               break;
30459                           }
30460                           break;
30461                         }
30462                       }
30463                       break;
30464                     }
30465                     case 0x00000040: {
30466                       // 0xef000050
30467                       switch (instr & 0x00000f00) {
30468                         case 0x00000000: {
30469                           // 0xef000050
30470                           DataType dt = Dt_U_size_3_Decode(
30471                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30472                           if (dt.Is(kDataTypeValueInvalid)) {
30473                             UnallocatedT32(instr);
30474                             return;
30475                           }
30476                           if (((instr >> 12) & 1) != 0) {
30477                             UnallocatedT32(instr);
30478                             return;
30479                           }
30480                           unsigned rd = ExtractQRegister(instr, 22, 12);
30481                           if (((instr >> 16) & 1) != 0) {
30482                             UnallocatedT32(instr);
30483                             return;
30484                           }
30485                           unsigned rn = ExtractQRegister(instr, 7, 16);
30486                           if ((instr & 1) != 0) {
30487                             UnallocatedT32(instr);
30488                             return;
30489                           }
30490                           unsigned rm = ExtractQRegister(instr, 5, 0);
30491                           // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30492                           vqadd(CurrentCond(),
30493                                 dt,
30494                                 QRegister(rd),
30495                                 QRegister(rn),
30496                                 QRegister(rm));
30497                           break;
30498                         }
30499                         case 0x00000100: {
30500                           // 0xef000150
30501                           switch (instr & 0x10300000) {
30502                             case 0x00000000: {
30503                               // 0xef000150
30504                               if (((instr >> 12) & 1) != 0) {
30505                                 UnallocatedT32(instr);
30506                                 return;
30507                               }
30508                               unsigned rd = ExtractQRegister(instr, 22, 12);
30509                               if (((instr >> 16) & 1) != 0) {
30510                                 UnallocatedT32(instr);
30511                                 return;
30512                               }
30513                               unsigned rn = ExtractQRegister(instr, 7, 16);
30514                               if ((instr & 1) != 0) {
30515                                 UnallocatedT32(instr);
30516                                 return;
30517                               }
30518                               unsigned rm = ExtractQRegister(instr, 5, 0);
30519                               // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30520                               vand(CurrentCond(),
30521                                    kDataTypeValueNone,
30522                                    QRegister(rd),
30523                                    QRegister(rn),
30524                                    QRegister(rm));
30525                               break;
30526                             }
30527                             case 0x00100000: {
30528                               // 0xef100150
30529                               if (((instr >> 12) & 1) != 0) {
30530                                 UnallocatedT32(instr);
30531                                 return;
30532                               }
30533                               unsigned rd = ExtractQRegister(instr, 22, 12);
30534                               if (((instr >> 16) & 1) != 0) {
30535                                 UnallocatedT32(instr);
30536                                 return;
30537                               }
30538                               unsigned rn = ExtractQRegister(instr, 7, 16);
30539                               if ((instr & 1) != 0) {
30540                                 UnallocatedT32(instr);
30541                                 return;
30542                               }
30543                               unsigned rm = ExtractQRegister(instr, 5, 0);
30544                               // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30545                               vbic(CurrentCond(),
30546                                    kDataTypeValueNone,
30547                                    QRegister(rd),
30548                                    QRegister(rn),
30549                                    QRegister(rm));
30550                               break;
30551                             }
30552                             case 0x00200000: {
30553                               // 0xef200150
30554                               if (((instr & 0x00000040) == 0x00000040) &&
30555                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
30556                                      << 4) |
30557                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
30558                                    (((Uint32((instr >> 5)) & Uint32(0x1))
30559                                      << 4) |
30560                                     (Uint32(instr) & Uint32(0xf))))) {
30561                                 if (((instr >> 12) & 1) != 0) {
30562                                   UnallocatedT32(instr);
30563                                   return;
30564                                 }
30565                                 unsigned rd = ExtractQRegister(instr, 22, 12);
30566                                 if (((instr >> 16) & 1) != 0) {
30567                                   UnallocatedT32(instr);
30568                                   return;
30569                                 }
30570                                 unsigned rm = ExtractQRegister(instr, 7, 16);
30571                                 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
30572                                 vmov(CurrentCond(),
30573                                      kDataTypeValueNone,
30574                                      QRegister(rd),
30575                                      QRegister(rm));
30576                                 return;
30577                               }
30578                               if (((instr >> 12) & 1) != 0) {
30579                                 UnallocatedT32(instr);
30580                                 return;
30581                               }
30582                               unsigned rd = ExtractQRegister(instr, 22, 12);
30583                               if (((instr >> 16) & 1) != 0) {
30584                                 UnallocatedT32(instr);
30585                                 return;
30586                               }
30587                               unsigned rn = ExtractQRegister(instr, 7, 16);
30588                               if ((instr & 1) != 0) {
30589                                 UnallocatedT32(instr);
30590                                 return;
30591                               }
30592                               unsigned rm = ExtractQRegister(instr, 5, 0);
30593                               // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30594                               vorr(CurrentCond(),
30595                                    kDataTypeValueNone,
30596                                    QRegister(rd),
30597                                    QRegister(rn),
30598                                    QRegister(rm));
30599                               break;
30600                             }
30601                             case 0x00300000: {
30602                               // 0xef300150
30603                               if (((instr >> 12) & 1) != 0) {
30604                                 UnallocatedT32(instr);
30605                                 return;
30606                               }
30607                               unsigned rd = ExtractQRegister(instr, 22, 12);
30608                               if (((instr >> 16) & 1) != 0) {
30609                                 UnallocatedT32(instr);
30610                                 return;
30611                               }
30612                               unsigned rn = ExtractQRegister(instr, 7, 16);
30613                               if ((instr & 1) != 0) {
30614                                 UnallocatedT32(instr);
30615                                 return;
30616                               }
30617                               unsigned rm = ExtractQRegister(instr, 5, 0);
30618                               // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30619                               vorn(CurrentCond(),
30620                                    kDataTypeValueNone,
30621                                    QRegister(rd),
30622                                    QRegister(rn),
30623                                    QRegister(rm));
30624                               break;
30625                             }
30626                             case 0x10000000: {
30627                               // 0xff000150
30628                               if (((instr >> 12) & 1) != 0) {
30629                                 UnallocatedT32(instr);
30630                                 return;
30631                               }
30632                               unsigned rd = ExtractQRegister(instr, 22, 12);
30633                               if (((instr >> 16) & 1) != 0) {
30634                                 UnallocatedT32(instr);
30635                                 return;
30636                               }
30637                               unsigned rn = ExtractQRegister(instr, 7, 16);
30638                               if ((instr & 1) != 0) {
30639                                 UnallocatedT32(instr);
30640                                 return;
30641                               }
30642                               unsigned rm = ExtractQRegister(instr, 5, 0);
30643                               // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30644                               veor(CurrentCond(),
30645                                    kDataTypeValueNone,
30646                                    QRegister(rd),
30647                                    QRegister(rn),
30648                                    QRegister(rm));
30649                               break;
30650                             }
30651                             case 0x10100000: {
30652                               // 0xff100150
30653                               if (((instr >> 12) & 1) != 0) {
30654                                 UnallocatedT32(instr);
30655                                 return;
30656                               }
30657                               unsigned rd = ExtractQRegister(instr, 22, 12);
30658                               if (((instr >> 16) & 1) != 0) {
30659                                 UnallocatedT32(instr);
30660                                 return;
30661                               }
30662                               unsigned rn = ExtractQRegister(instr, 7, 16);
30663                               if ((instr & 1) != 0) {
30664                                 UnallocatedT32(instr);
30665                                 return;
30666                               }
30667                               unsigned rm = ExtractQRegister(instr, 5, 0);
30668                               // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30669                               vbsl(CurrentCond(),
30670                                    kDataTypeValueNone,
30671                                    QRegister(rd),
30672                                    QRegister(rn),
30673                                    QRegister(rm));
30674                               break;
30675                             }
30676                             case 0x10200000: {
30677                               // 0xff200150
30678                               if (((instr >> 12) & 1) != 0) {
30679                                 UnallocatedT32(instr);
30680                                 return;
30681                               }
30682                               unsigned rd = ExtractQRegister(instr, 22, 12);
30683                               if (((instr >> 16) & 1) != 0) {
30684                                 UnallocatedT32(instr);
30685                                 return;
30686                               }
30687                               unsigned rn = ExtractQRegister(instr, 7, 16);
30688                               if ((instr & 1) != 0) {
30689                                 UnallocatedT32(instr);
30690                                 return;
30691                               }
30692                               unsigned rm = ExtractQRegister(instr, 5, 0);
30693                               // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30694                               vbit(CurrentCond(),
30695                                    kDataTypeValueNone,
30696                                    QRegister(rd),
30697                                    QRegister(rn),
30698                                    QRegister(rm));
30699                               break;
30700                             }
30701                             case 0x10300000: {
30702                               // 0xff300150
30703                               if (((instr >> 12) & 1) != 0) {
30704                                 UnallocatedT32(instr);
30705                                 return;
30706                               }
30707                               unsigned rd = ExtractQRegister(instr, 22, 12);
30708                               if (((instr >> 16) & 1) != 0) {
30709                                 UnallocatedT32(instr);
30710                                 return;
30711                               }
30712                               unsigned rn = ExtractQRegister(instr, 7, 16);
30713                               if ((instr & 1) != 0) {
30714                                 UnallocatedT32(instr);
30715                                 return;
30716                               }
30717                               unsigned rm = ExtractQRegister(instr, 5, 0);
30718                               // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
30719                               vbif(CurrentCond(),
30720                                    kDataTypeValueNone,
30721                                    QRegister(rd),
30722                                    QRegister(rn),
30723                                    QRegister(rm));
30724                               break;
30725                             }
30726                           }
30727                           break;
30728                         }
30729                         case 0x00000200: {
30730                           // 0xef000250
30731                           DataType dt = Dt_U_size_3_Decode(
30732                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30733                           if (dt.Is(kDataTypeValueInvalid)) {
30734                             UnallocatedT32(instr);
30735                             return;
30736                           }
30737                           if (((instr >> 12) & 1) != 0) {
30738                             UnallocatedT32(instr);
30739                             return;
30740                           }
30741                           unsigned rd = ExtractQRegister(instr, 22, 12);
30742                           if (((instr >> 16) & 1) != 0) {
30743                             UnallocatedT32(instr);
30744                             return;
30745                           }
30746                           unsigned rn = ExtractQRegister(instr, 7, 16);
30747                           if ((instr & 1) != 0) {
30748                             UnallocatedT32(instr);
30749                             return;
30750                           }
30751                           unsigned rm = ExtractQRegister(instr, 5, 0);
30752                           // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30753                           vqsub(CurrentCond(),
30754                                 dt,
30755                                 QRegister(rd),
30756                                 QRegister(rn),
30757                                 QRegister(rm));
30758                           break;
30759                         }
30760                         case 0x00000300: {
30761                           // 0xef000350
30762                           DataType dt = Dt_U_size_1_Decode(
30763                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30764                           if (dt.Is(kDataTypeValueInvalid)) {
30765                             UnallocatedT32(instr);
30766                             return;
30767                           }
30768                           if (((instr >> 12) & 1) != 0) {
30769                             UnallocatedT32(instr);
30770                             return;
30771                           }
30772                           unsigned rd = ExtractQRegister(instr, 22, 12);
30773                           if (((instr >> 16) & 1) != 0) {
30774                             UnallocatedT32(instr);
30775                             return;
30776                           }
30777                           unsigned rn = ExtractQRegister(instr, 7, 16);
30778                           if ((instr & 1) != 0) {
30779                             UnallocatedT32(instr);
30780                             return;
30781                           }
30782                           unsigned rm = ExtractQRegister(instr, 5, 0);
30783                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30784                           vcge(CurrentCond(),
30785                                dt,
30786                                QRegister(rd),
30787                                QRegister(rn),
30788                                QRegister(rm));
30789                           break;
30790                         }
30791                         case 0x00000400: {
30792                           // 0xef000450
30793                           DataType dt = Dt_U_size_3_Decode(
30794                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30795                           if (dt.Is(kDataTypeValueInvalid)) {
30796                             UnallocatedT32(instr);
30797                             return;
30798                           }
30799                           if (((instr >> 12) & 1) != 0) {
30800                             UnallocatedT32(instr);
30801                             return;
30802                           }
30803                           unsigned rd = ExtractQRegister(instr, 22, 12);
30804                           if ((instr & 1) != 0) {
30805                             UnallocatedT32(instr);
30806                             return;
30807                           }
30808                           unsigned rm = ExtractQRegister(instr, 5, 0);
30809                           if (((instr >> 16) & 1) != 0) {
30810                             UnallocatedT32(instr);
30811                             return;
30812                           }
30813                           unsigned rn = ExtractQRegister(instr, 7, 16);
30814                           // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30815                           vqshl(CurrentCond(),
30816                                 dt,
30817                                 QRegister(rd),
30818                                 QRegister(rm),
30819                                 QRegister(rn));
30820                           break;
30821                         }
30822                         case 0x00000500: {
30823                           // 0xef000550
30824                           DataType dt = Dt_U_size_3_Decode(
30825                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30826                           if (dt.Is(kDataTypeValueInvalid)) {
30827                             UnallocatedT32(instr);
30828                             return;
30829                           }
30830                           if (((instr >> 12) & 1) != 0) {
30831                             UnallocatedT32(instr);
30832                             return;
30833                           }
30834                           unsigned rd = ExtractQRegister(instr, 22, 12);
30835                           if ((instr & 1) != 0) {
30836                             UnallocatedT32(instr);
30837                             return;
30838                           }
30839                           unsigned rm = ExtractQRegister(instr, 5, 0);
30840                           if (((instr >> 16) & 1) != 0) {
30841                             UnallocatedT32(instr);
30842                             return;
30843                           }
30844                           unsigned rn = ExtractQRegister(instr, 7, 16);
30845                           // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
30846                           vqrshl(CurrentCond(),
30847                                  dt,
30848                                  QRegister(rd),
30849                                  QRegister(rm),
30850                                  QRegister(rn));
30851                           break;
30852                         }
30853                         case 0x00000600: {
30854                           // 0xef000650
30855                           DataType dt = Dt_U_size_1_Decode(
30856                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30857                           if (dt.Is(kDataTypeValueInvalid)) {
30858                             UnallocatedT32(instr);
30859                             return;
30860                           }
30861                           if (((instr >> 12) & 1) != 0) {
30862                             UnallocatedT32(instr);
30863                             return;
30864                           }
30865                           unsigned rd = ExtractQRegister(instr, 22, 12);
30866                           if (((instr >> 16) & 1) != 0) {
30867                             UnallocatedT32(instr);
30868                             return;
30869                           }
30870                           unsigned rn = ExtractQRegister(instr, 7, 16);
30871                           if ((instr & 1) != 0) {
30872                             UnallocatedT32(instr);
30873                             return;
30874                           }
30875                           unsigned rm = ExtractQRegister(instr, 5, 0);
30876                           // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30877                           vmin(CurrentCond(),
30878                                dt,
30879                                QRegister(rd),
30880                                QRegister(rn),
30881                                QRegister(rm));
30882                           break;
30883                         }
30884                         case 0x00000700: {
30885                           // 0xef000750
30886                           DataType dt = Dt_U_size_1_Decode(
30887                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30888                           if (dt.Is(kDataTypeValueInvalid)) {
30889                             UnallocatedT32(instr);
30890                             return;
30891                           }
30892                           if (((instr >> 12) & 1) != 0) {
30893                             UnallocatedT32(instr);
30894                             return;
30895                           }
30896                           unsigned rd = ExtractQRegister(instr, 22, 12);
30897                           if (((instr >> 16) & 1) != 0) {
30898                             UnallocatedT32(instr);
30899                             return;
30900                           }
30901                           unsigned rn = ExtractQRegister(instr, 7, 16);
30902                           if ((instr & 1) != 0) {
30903                             UnallocatedT32(instr);
30904                             return;
30905                           }
30906                           unsigned rm = ExtractQRegister(instr, 5, 0);
30907                           // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
30908                           vaba(CurrentCond(),
30909                                dt,
30910                                QRegister(rd),
30911                                QRegister(rn),
30912                                QRegister(rm));
30913                           break;
30914                         }
30915                         case 0x00000800: {
30916                           // 0xef000850
30917                           switch (instr & 0x10000000) {
30918                             case 0x00000000: {
30919                               // 0xef000850
30920                               DataType dt =
30921                                   Dt_size_7_Decode((instr >> 20) & 0x3);
30922                               if (dt.Is(kDataTypeValueInvalid)) {
30923                                 UnallocatedT32(instr);
30924                                 return;
30925                               }
30926                               if (((instr >> 12) & 1) != 0) {
30927                                 UnallocatedT32(instr);
30928                                 return;
30929                               }
30930                               unsigned rd = ExtractQRegister(instr, 22, 12);
30931                               if (((instr >> 16) & 1) != 0) {
30932                                 UnallocatedT32(instr);
30933                                 return;
30934                               }
30935                               unsigned rn = ExtractQRegister(instr, 7, 16);
30936                               if ((instr & 1) != 0) {
30937                                 UnallocatedT32(instr);
30938                                 return;
30939                               }
30940                               unsigned rm = ExtractQRegister(instr, 5, 0);
30941                               // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30942                               vtst(CurrentCond(),
30943                                    dt,
30944                                    QRegister(rd),
30945                                    QRegister(rn),
30946                                    QRegister(rm));
30947                               break;
30948                             }
30949                             case 0x10000000: {
30950                               // 0xff000850
30951                               DataType dt =
30952                                   Dt_size_4_Decode((instr >> 20) & 0x3);
30953                               if (dt.Is(kDataTypeValueInvalid)) {
30954                                 UnallocatedT32(instr);
30955                                 return;
30956                               }
30957                               if (((instr >> 12) & 1) != 0) {
30958                                 UnallocatedT32(instr);
30959                                 return;
30960                               }
30961                               unsigned rd = ExtractQRegister(instr, 22, 12);
30962                               if (((instr >> 16) & 1) != 0) {
30963                                 UnallocatedT32(instr);
30964                                 return;
30965                               }
30966                               unsigned rn = ExtractQRegister(instr, 7, 16);
30967                               if ((instr & 1) != 0) {
30968                                 UnallocatedT32(instr);
30969                                 return;
30970                               }
30971                               unsigned rm = ExtractQRegister(instr, 5, 0);
30972                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
30973                               vceq(CurrentCond(),
30974                                    dt,
30975                                    QRegister(rd),
30976                                    QRegister(rn),
30977                                    QRegister(rm));
30978                               break;
30979                             }
30980                           }
30981                           break;
30982                         }
30983                         case 0x00000900: {
30984                           // 0xef000950
30985                           DataType dt = Dt_op_size_1_Decode(
30986                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
30987                           if (dt.Is(kDataTypeValueInvalid)) {
30988                             UnallocatedT32(instr);
30989                             return;
30990                           }
30991                           if (((instr >> 12) & 1) != 0) {
30992                             UnallocatedT32(instr);
30993                             return;
30994                           }
30995                           unsigned rd = ExtractQRegister(instr, 22, 12);
30996                           if (((instr >> 16) & 1) != 0) {
30997                             UnallocatedT32(instr);
30998                             return;
30999                           }
31000                           unsigned rn = ExtractQRegister(instr, 7, 16);
31001                           if ((instr & 1) != 0) {
31002                             UnallocatedT32(instr);
31003                             return;
31004                           }
31005                           unsigned rm = ExtractQRegister(instr, 5, 0);
31006                           // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
31007                           vmul(CurrentCond(),
31008                                dt,
31009                                QRegister(rd),
31010                                QRegister(rn),
31011                                QRegister(rm));
31012                           break;
31013                         }
31014                         case 0x00000c00: {
31015                           // 0xef000c50
31016                           switch (instr & 0x10300000) {
31017                             case 0x00000000: {
31018                               // 0xef000c50
31019                               if (((instr >> 12) & 1) != 0) {
31020                                 UnallocatedT32(instr);
31021                                 return;
31022                               }
31023                               unsigned rd = ExtractQRegister(instr, 22, 12);
31024                               if (((instr >> 16) & 1) != 0) {
31025                                 UnallocatedT32(instr);
31026                                 return;
31027                               }
31028                               unsigned rn = ExtractQRegister(instr, 7, 16);
31029                               if ((instr & 1) != 0) {
31030                                 UnallocatedT32(instr);
31031                                 return;
31032                               }
31033                               unsigned rm = ExtractQRegister(instr, 5, 0);
31034                               // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31035                               vfma(CurrentCond(),
31036                                    F32,
31037                                    QRegister(rd),
31038                                    QRegister(rn),
31039                                    QRegister(rm));
31040                               break;
31041                             }
31042                             case 0x00200000: {
31043                               // 0xef200c50
31044                               if (((instr >> 12) & 1) != 0) {
31045                                 UnallocatedT32(instr);
31046                                 return;
31047                               }
31048                               unsigned rd = ExtractQRegister(instr, 22, 12);
31049                               if (((instr >> 16) & 1) != 0) {
31050                                 UnallocatedT32(instr);
31051                                 return;
31052                               }
31053                               unsigned rn = ExtractQRegister(instr, 7, 16);
31054                               if ((instr & 1) != 0) {
31055                                 UnallocatedT32(instr);
31056                                 return;
31057                               }
31058                               unsigned rm = ExtractQRegister(instr, 5, 0);
31059                               // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31060                               vfms(CurrentCond(),
31061                                    F32,
31062                                    QRegister(rd),
31063                                    QRegister(rn),
31064                                    QRegister(rm));
31065                               break;
31066                             }
31067                             default:
31068                               UnallocatedT32(instr);
31069                               break;
31070                           }
31071                           break;
31072                         }
31073                         case 0x00000d00: {
31074                           // 0xef000d50
31075                           switch (instr & 0x10300000) {
31076                             case 0x00000000: {
31077                               // 0xef000d50
31078                               if (((instr >> 12) & 1) != 0) {
31079                                 UnallocatedT32(instr);
31080                                 return;
31081                               }
31082                               unsigned rd = ExtractQRegister(instr, 22, 12);
31083                               if (((instr >> 16) & 1) != 0) {
31084                                 UnallocatedT32(instr);
31085                                 return;
31086                               }
31087                               unsigned rn = ExtractQRegister(instr, 7, 16);
31088                               if ((instr & 1) != 0) {
31089                                 UnallocatedT32(instr);
31090                                 return;
31091                               }
31092                               unsigned rm = ExtractQRegister(instr, 5, 0);
31093                               // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31094                               vmla(CurrentCond(),
31095                                    F32,
31096                                    QRegister(rd),
31097                                    QRegister(rn),
31098                                    QRegister(rm));
31099                               break;
31100                             }
31101                             case 0x00200000: {
31102                               // 0xef200d50
31103                               if (((instr >> 12) & 1) != 0) {
31104                                 UnallocatedT32(instr);
31105                                 return;
31106                               }
31107                               unsigned rd = ExtractQRegister(instr, 22, 12);
31108                               if (((instr >> 16) & 1) != 0) {
31109                                 UnallocatedT32(instr);
31110                                 return;
31111                               }
31112                               unsigned rn = ExtractQRegister(instr, 7, 16);
31113                               if ((instr & 1) != 0) {
31114                                 UnallocatedT32(instr);
31115                                 return;
31116                               }
31117                               unsigned rm = ExtractQRegister(instr, 5, 0);
31118                               // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31119                               vmls(CurrentCond(),
31120                                    F32,
31121                                    QRegister(rd),
31122                                    QRegister(rn),
31123                                    QRegister(rm));
31124                               break;
31125                             }
31126                             case 0x10000000: {
31127                               // 0xff000d50
31128                               if (((instr >> 12) & 1) != 0) {
31129                                 UnallocatedT32(instr);
31130                                 return;
31131                               }
31132                               unsigned rd = ExtractQRegister(instr, 22, 12);
31133                               if (((instr >> 16) & 1) != 0) {
31134                                 UnallocatedT32(instr);
31135                                 return;
31136                               }
31137                               unsigned rn = ExtractQRegister(instr, 7, 16);
31138                               if ((instr & 1) != 0) {
31139                                 UnallocatedT32(instr);
31140                                 return;
31141                               }
31142                               unsigned rm = ExtractQRegister(instr, 5, 0);
31143                               // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31144                               vmul(CurrentCond(),
31145                                    F32,
31146                                    QRegister(rd),
31147                                    QRegister(rn),
31148                                    QRegister(rm));
31149                               break;
31150                             }
31151                             default:
31152                               UnallocatedT32(instr);
31153                               break;
31154                           }
31155                           break;
31156                         }
31157                         case 0x00000e00: {
31158                           // 0xef000e50
31159                           switch (instr & 0x10300000) {
31160                             case 0x10000000: {
31161                               // 0xff000e50
31162                               if (((instr >> 12) & 1) != 0) {
31163                                 UnallocatedT32(instr);
31164                                 return;
31165                               }
31166                               unsigned rd = ExtractQRegister(instr, 22, 12);
31167                               if (((instr >> 16) & 1) != 0) {
31168                                 UnallocatedT32(instr);
31169                                 return;
31170                               }
31171                               unsigned rn = ExtractQRegister(instr, 7, 16);
31172                               if ((instr & 1) != 0) {
31173                                 UnallocatedT32(instr);
31174                                 return;
31175                               }
31176                               unsigned rm = ExtractQRegister(instr, 5, 0);
31177                               // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31178                               vacge(CurrentCond(),
31179                                     F32,
31180                                     QRegister(rd),
31181                                     QRegister(rn),
31182                                     QRegister(rm));
31183                               break;
31184                             }
31185                             case 0x10200000: {
31186                               // 0xff200e50
31187                               if (((instr >> 12) & 1) != 0) {
31188                                 UnallocatedT32(instr);
31189                                 return;
31190                               }
31191                               unsigned rd = ExtractQRegister(instr, 22, 12);
31192                               if (((instr >> 16) & 1) != 0) {
31193                                 UnallocatedT32(instr);
31194                                 return;
31195                               }
31196                               unsigned rn = ExtractQRegister(instr, 7, 16);
31197                               if ((instr & 1) != 0) {
31198                                 UnallocatedT32(instr);
31199                                 return;
31200                               }
31201                               unsigned rm = ExtractQRegister(instr, 5, 0);
31202                               // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31203                               vacgt(CurrentCond(),
31204                                     F32,
31205                                     QRegister(rd),
31206                                     QRegister(rn),
31207                                     QRegister(rm));
31208                               break;
31209                             }
31210                             default:
31211                               UnallocatedT32(instr);
31212                               break;
31213                           }
31214                           break;
31215                         }
31216                         case 0x00000f00: {
31217                           // 0xef000f50
31218                           switch (instr & 0x10300000) {
31219                             case 0x00000000: {
31220                               // 0xef000f50
31221                               if (((instr >> 12) & 1) != 0) {
31222                                 UnallocatedT32(instr);
31223                                 return;
31224                               }
31225                               unsigned rd = ExtractQRegister(instr, 22, 12);
31226                               if (((instr >> 16) & 1) != 0) {
31227                                 UnallocatedT32(instr);
31228                                 return;
31229                               }
31230                               unsigned rn = ExtractQRegister(instr, 7, 16);
31231                               if ((instr & 1) != 0) {
31232                                 UnallocatedT32(instr);
31233                                 return;
31234                               }
31235                               unsigned rm = ExtractQRegister(instr, 5, 0);
31236                               // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31237                               vrecps(CurrentCond(),
31238                                      F32,
31239                                      QRegister(rd),
31240                                      QRegister(rn),
31241                                      QRegister(rm));
31242                               break;
31243                             }
31244                             case 0x00200000: {
31245                               // 0xef200f50
31246                               if (((instr >> 12) & 1) != 0) {
31247                                 UnallocatedT32(instr);
31248                                 return;
31249                               }
31250                               unsigned rd = ExtractQRegister(instr, 22, 12);
31251                               if (((instr >> 16) & 1) != 0) {
31252                                 UnallocatedT32(instr);
31253                                 return;
31254                               }
31255                               unsigned rn = ExtractQRegister(instr, 7, 16);
31256                               if ((instr & 1) != 0) {
31257                                 UnallocatedT32(instr);
31258                                 return;
31259                               }
31260                               unsigned rm = ExtractQRegister(instr, 5, 0);
31261                               // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
31262                               vrsqrts(CurrentCond(),
31263                                       F32,
31264                                       QRegister(rd),
31265                                       QRegister(rn),
31266                                       QRegister(rm));
31267                               break;
31268                             }
31269                             case 0x10000000: {
31270                               // 0xff000f50
31271                               if (((instr >> 12) & 1) != 0) {
31272                                 UnallocatedT32(instr);
31273                                 return;
31274                               }
31275                               unsigned rd = ExtractQRegister(instr, 22, 12);
31276                               if (((instr >> 16) & 1) != 0) {
31277                                 UnallocatedT32(instr);
31278                                 return;
31279                               }
31280                               unsigned rn = ExtractQRegister(instr, 7, 16);
31281                               if ((instr & 1) != 0) {
31282                                 UnallocatedT32(instr);
31283                                 return;
31284                               }
31285                               unsigned rm = ExtractQRegister(instr, 5, 0);
31286                               // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31287                               vmaxnm(F32,
31288                                      QRegister(rd),
31289                                      QRegister(rn),
31290                                      QRegister(rm));
31291                               break;
31292                             }
31293                             case 0x10200000: {
31294                               // 0xff200f50
31295                               if (((instr >> 12) & 1) != 0) {
31296                                 UnallocatedT32(instr);
31297                                 return;
31298                               }
31299                               unsigned rd = ExtractQRegister(instr, 22, 12);
31300                               if (((instr >> 16) & 1) != 0) {
31301                                 UnallocatedT32(instr);
31302                                 return;
31303                               }
31304                               unsigned rn = ExtractQRegister(instr, 7, 16);
31305                               if ((instr & 1) != 0) {
31306                                 UnallocatedT32(instr);
31307                                 return;
31308                               }
31309                               unsigned rm = ExtractQRegister(instr, 5, 0);
31310                               // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
31311                               vminnm(F32,
31312                                      QRegister(rd),
31313                                      QRegister(rn),
31314                                      QRegister(rm));
31315                               break;
31316                             }
31317                             default:
31318                               UnallocatedT32(instr);
31319                               break;
31320                           }
31321                           break;
31322                         }
31323                         default:
31324                           UnallocatedT32(instr);
31325                           break;
31326                       }
31327                       break;
31328                     }
31329                     case 0x00800000: {
31330                       // 0xef800010
31331                       switch (instr & 0x00000c00) {
31332                         case 0x00000000: {
31333                           // 0xef800010
31334                           switch (instr & 0x00380080) {
31335                             case 0x00000000: {
31336                               // 0xef800010
31337                               switch (instr & 0x00000100) {
31338                                 case 0x00000000: {
31339                                   // 0xef800010
31340                                   switch (instr & 0x00000200) {
31341                                     default: {
31342                                       switch (instr & 0x00000020) {
31343                                         case 0x00000020: {
31344                                           // 0xef800030
31345                                           if (((instr & 0xd00) == 0x100) ||
31346                                               ((instr & 0xd00) == 0x500) ||
31347                                               ((instr & 0xd00) == 0x900) ||
31348                                               ((instr & 0xe00) == 0xe00)) {
31349                                             UnallocatedT32(instr);
31350                                             return;
31351                                           }
31352                                           unsigned cmode = (instr >> 8) & 0xf;
31353                                           DataType dt =
31354                                               ImmediateVmvn::DecodeDt(cmode);
31355                                           if (dt.Is(kDataTypeValueInvalid)) {
31356                                             UnallocatedT32(instr);
31357                                             return;
31358                                           }
31359                                           unsigned rd =
31360                                               ExtractDRegister(instr, 22, 12);
31361                                           DOperand imm =
31362                                               ImmediateVmvn::DecodeImmediate(
31363                                                   cmode,
31364                                                   (instr & 0xf) |
31365                                                       ((instr >> 12) & 0x70) |
31366                                                       ((instr >> 21) & 0x80));
31367                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31368                                           vmvn(CurrentCond(),
31369                                                dt,
31370                                                DRegister(rd),
31371                                                imm);
31372                                           break;
31373                                         }
31374                                         default: {
31375                                           if (((instr & 0x920) == 0x100) ||
31376                                               ((instr & 0x520) == 0x100) ||
31377                                               ((instr & 0x820) == 0x20) ||
31378                                               ((instr & 0x420) == 0x20) ||
31379                                               ((instr & 0x220) == 0x20) ||
31380                                               ((instr & 0x120) == 0x120)) {
31381                                             UnallocatedT32(instr);
31382                                             return;
31383                                           }
31384                                           unsigned cmode =
31385                                               ((instr >> 8) & 0xf) |
31386                                               ((instr >> 1) & 0x10);
31387                                           DataType dt =
31388                                               ImmediateVmov::DecodeDt(cmode);
31389                                           if (dt.Is(kDataTypeValueInvalid)) {
31390                                             UnallocatedT32(instr);
31391                                             return;
31392                                           }
31393                                           unsigned rd =
31394                                               ExtractDRegister(instr, 22, 12);
31395                                           DOperand imm =
31396                                               ImmediateVmov::DecodeImmediate(
31397                                                   cmode,
31398                                                   (instr & 0xf) |
31399                                                       ((instr >> 12) & 0x70) |
31400                                                       ((instr >> 21) & 0x80));
31401                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31402                                           vmov(CurrentCond(),
31403                                                dt,
31404                                                DRegister(rd),
31405                                                imm);
31406                                           break;
31407                                         }
31408                                       }
31409                                       break;
31410                                     }
31411                                   }
31412                                   break;
31413                                 }
31414                                 case 0x00000100: {
31415                                   // 0xef800110
31416                                   switch (instr & 0x00000020) {
31417                                     case 0x00000000: {
31418                                       // 0xef800110
31419                                       if (((instr & 0x100) == 0x0) ||
31420                                           ((instr & 0xc00) == 0xc00)) {
31421                                         UnallocatedT32(instr);
31422                                         return;
31423                                       }
31424                                       unsigned cmode = (instr >> 8) & 0xf;
31425                                       DataType dt =
31426                                           ImmediateVorr::DecodeDt(cmode);
31427                                       if (dt.Is(kDataTypeValueInvalid)) {
31428                                         UnallocatedT32(instr);
31429                                         return;
31430                                       }
31431                                       unsigned rd =
31432                                           ExtractDRegister(instr, 22, 12);
31433                                       DOperand imm =
31434                                           ImmediateVorr::DecodeImmediate(
31435                                               cmode,
31436                                               (instr & 0xf) |
31437                                                   ((instr >> 12) & 0x70) |
31438                                                   ((instr >> 21) & 0x80));
31439                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31440                                       vorr(CurrentCond(),
31441                                            dt,
31442                                            DRegister(rd),
31443                                            DRegister(rd),
31444                                            imm);
31445                                       break;
31446                                     }
31447                                     case 0x00000020: {
31448                                       // 0xef800130
31449                                       if (((instr & 0x100) == 0x0) ||
31450                                           ((instr & 0xc00) == 0xc00)) {
31451                                         UnallocatedT32(instr);
31452                                         return;
31453                                       }
31454                                       unsigned cmode = (instr >> 8) & 0xf;
31455                                       DataType dt =
31456                                           ImmediateVbic::DecodeDt(cmode);
31457                                       if (dt.Is(kDataTypeValueInvalid)) {
31458                                         UnallocatedT32(instr);
31459                                         return;
31460                                       }
31461                                       unsigned rd =
31462                                           ExtractDRegister(instr, 22, 12);
31463                                       DOperand imm =
31464                                           ImmediateVbic::DecodeImmediate(
31465                                               cmode,
31466                                               (instr & 0xf) |
31467                                                   ((instr >> 12) & 0x70) |
31468                                                   ((instr >> 21) & 0x80));
31469                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31470                                       vbic(CurrentCond(),
31471                                            dt,
31472                                            DRegister(rd),
31473                                            DRegister(rd),
31474                                            imm);
31475                                       break;
31476                                     }
31477                                   }
31478                                   break;
31479                                 }
31480                               }
31481                               break;
31482                             }
31483                             default: {
31484                               switch (instr & 0x00000300) {
31485                                 case 0x00000000: {
31486                                   // 0xef800010
31487                                   if (((instr & 0x380080) == 0x0)) {
31488                                     UnallocatedT32(instr);
31489                                     return;
31490                                   }
31491                                   DataType dt =
31492                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31493                                                              ((instr >> 4) &
31494                                                               0x8),
31495                                                          (instr >> 28) & 0x1);
31496                                   if (dt.Is(kDataTypeValueInvalid)) {
31497                                     UnallocatedT32(instr);
31498                                     return;
31499                                   }
31500                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31501                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31502                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31503                                   uint32_t imm =
31504                                       (dt.IsSize(64) ? 64
31505                                                      : (dt.GetSize() * 2)) -
31506                                       imm6;
31507                                   // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31508                                   vshr(CurrentCond(),
31509                                        dt,
31510                                        DRegister(rd),
31511                                        DRegister(rm),
31512                                        imm);
31513                                   break;
31514                                 }
31515                                 case 0x00000100: {
31516                                   // 0xef800110
31517                                   if (((instr & 0x380080) == 0x0)) {
31518                                     UnallocatedT32(instr);
31519                                     return;
31520                                   }
31521                                   DataType dt =
31522                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31523                                                              ((instr >> 4) &
31524                                                               0x8),
31525                                                          (instr >> 28) & 0x1);
31526                                   if (dt.Is(kDataTypeValueInvalid)) {
31527                                     UnallocatedT32(instr);
31528                                     return;
31529                                   }
31530                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31531                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31532                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31533                                   uint32_t imm =
31534                                       (dt.IsSize(64) ? 64
31535                                                      : (dt.GetSize() * 2)) -
31536                                       imm6;
31537                                   // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31538                                   vsra(CurrentCond(),
31539                                        dt,
31540                                        DRegister(rd),
31541                                        DRegister(rm),
31542                                        imm);
31543                                   break;
31544                                 }
31545                                 case 0x00000200: {
31546                                   // 0xef800210
31547                                   if (((instr & 0x380080) == 0x0)) {
31548                                     UnallocatedT32(instr);
31549                                     return;
31550                                   }
31551                                   DataType dt =
31552                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31553                                                              ((instr >> 4) &
31554                                                               0x8),
31555                                                          (instr >> 28) & 0x1);
31556                                   if (dt.Is(kDataTypeValueInvalid)) {
31557                                     UnallocatedT32(instr);
31558                                     return;
31559                                   }
31560                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31561                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31562                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31563                                   uint32_t imm =
31564                                       (dt.IsSize(64) ? 64
31565                                                      : (dt.GetSize() * 2)) -
31566                                       imm6;
31567                                   // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31568                                   vrshr(CurrentCond(),
31569                                         dt,
31570                                         DRegister(rd),
31571                                         DRegister(rm),
31572                                         imm);
31573                                   break;
31574                                 }
31575                                 case 0x00000300: {
31576                                   // 0xef800310
31577                                   if (((instr & 0x380080) == 0x0)) {
31578                                     UnallocatedT32(instr);
31579                                     return;
31580                                   }
31581                                   DataType dt =
31582                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31583                                                              ((instr >> 4) &
31584                                                               0x8),
31585                                                          (instr >> 28) & 0x1);
31586                                   if (dt.Is(kDataTypeValueInvalid)) {
31587                                     UnallocatedT32(instr);
31588                                     return;
31589                                   }
31590                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31591                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31592                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31593                                   uint32_t imm =
31594                                       (dt.IsSize(64) ? 64
31595                                                      : (dt.GetSize() * 2)) -
31596                                       imm6;
31597                                   // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31598                                   vrsra(CurrentCond(),
31599                                         dt,
31600                                         DRegister(rd),
31601                                         DRegister(rm),
31602                                         imm);
31603                                   break;
31604                                 }
31605                               }
31606                               break;
31607                             }
31608                           }
31609                           break;
31610                         }
31611                         case 0x00000400: {
31612                           // 0xef800410
31613                           switch (instr & 0x00380080) {
31614                             case 0x00000000: {
31615                               // 0xef800410
31616                               switch (instr & 0x00000100) {
31617                                 case 0x00000000: {
31618                                   // 0xef800410
31619                                   switch (instr & 0x00000200) {
31620                                     default: {
31621                                       switch (instr & 0x00000020) {
31622                                         case 0x00000020: {
31623                                           // 0xef800430
31624                                           if (((instr & 0xd00) == 0x100) ||
31625                                               ((instr & 0xd00) == 0x500) ||
31626                                               ((instr & 0xd00) == 0x900) ||
31627                                               ((instr & 0xe00) == 0xe00)) {
31628                                             UnallocatedT32(instr);
31629                                             return;
31630                                           }
31631                                           unsigned cmode = (instr >> 8) & 0xf;
31632                                           DataType dt =
31633                                               ImmediateVmvn::DecodeDt(cmode);
31634                                           if (dt.Is(kDataTypeValueInvalid)) {
31635                                             UnallocatedT32(instr);
31636                                             return;
31637                                           }
31638                                           unsigned rd =
31639                                               ExtractDRegister(instr, 22, 12);
31640                                           DOperand imm =
31641                                               ImmediateVmvn::DecodeImmediate(
31642                                                   cmode,
31643                                                   (instr & 0xf) |
31644                                                       ((instr >> 12) & 0x70) |
31645                                                       ((instr >> 21) & 0x80));
31646                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31647                                           vmvn(CurrentCond(),
31648                                                dt,
31649                                                DRegister(rd),
31650                                                imm);
31651                                           break;
31652                                         }
31653                                         default: {
31654                                           if (((instr & 0x920) == 0x100) ||
31655                                               ((instr & 0x520) == 0x100) ||
31656                                               ((instr & 0x820) == 0x20) ||
31657                                               ((instr & 0x420) == 0x20) ||
31658                                               ((instr & 0x220) == 0x20) ||
31659                                               ((instr & 0x120) == 0x120)) {
31660                                             UnallocatedT32(instr);
31661                                             return;
31662                                           }
31663                                           unsigned cmode =
31664                                               ((instr >> 8) & 0xf) |
31665                                               ((instr >> 1) & 0x10);
31666                                           DataType dt =
31667                                               ImmediateVmov::DecodeDt(cmode);
31668                                           if (dt.Is(kDataTypeValueInvalid)) {
31669                                             UnallocatedT32(instr);
31670                                             return;
31671                                           }
31672                                           unsigned rd =
31673                                               ExtractDRegister(instr, 22, 12);
31674                                           DOperand imm =
31675                                               ImmediateVmov::DecodeImmediate(
31676                                                   cmode,
31677                                                   (instr & 0xf) |
31678                                                       ((instr >> 12) & 0x70) |
31679                                                       ((instr >> 21) & 0x80));
31680                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31681                                           vmov(CurrentCond(),
31682                                                dt,
31683                                                DRegister(rd),
31684                                                imm);
31685                                           break;
31686                                         }
31687                                       }
31688                                       break;
31689                                     }
31690                                   }
31691                                   break;
31692                                 }
31693                                 case 0x00000100: {
31694                                   // 0xef800510
31695                                   switch (instr & 0x00000020) {
31696                                     case 0x00000000: {
31697                                       // 0xef800510
31698                                       if (((instr & 0x100) == 0x0) ||
31699                                           ((instr & 0xc00) == 0xc00)) {
31700                                         UnallocatedT32(instr);
31701                                         return;
31702                                       }
31703                                       unsigned cmode = (instr >> 8) & 0xf;
31704                                       DataType dt =
31705                                           ImmediateVorr::DecodeDt(cmode);
31706                                       if (dt.Is(kDataTypeValueInvalid)) {
31707                                         UnallocatedT32(instr);
31708                                         return;
31709                                       }
31710                                       unsigned rd =
31711                                           ExtractDRegister(instr, 22, 12);
31712                                       DOperand imm =
31713                                           ImmediateVorr::DecodeImmediate(
31714                                               cmode,
31715                                               (instr & 0xf) |
31716                                                   ((instr >> 12) & 0x70) |
31717                                                   ((instr >> 21) & 0x80));
31718                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31719                                       vorr(CurrentCond(),
31720                                            dt,
31721                                            DRegister(rd),
31722                                            DRegister(rd),
31723                                            imm);
31724                                       break;
31725                                     }
31726                                     case 0x00000020: {
31727                                       // 0xef800530
31728                                       if (((instr & 0x100) == 0x0) ||
31729                                           ((instr & 0xc00) == 0xc00)) {
31730                                         UnallocatedT32(instr);
31731                                         return;
31732                                       }
31733                                       unsigned cmode = (instr >> 8) & 0xf;
31734                                       DataType dt =
31735                                           ImmediateVbic::DecodeDt(cmode);
31736                                       if (dt.Is(kDataTypeValueInvalid)) {
31737                                         UnallocatedT32(instr);
31738                                         return;
31739                                       }
31740                                       unsigned rd =
31741                                           ExtractDRegister(instr, 22, 12);
31742                                       DOperand imm =
31743                                           ImmediateVbic::DecodeImmediate(
31744                                               cmode,
31745                                               (instr & 0xf) |
31746                                                   ((instr >> 12) & 0x70) |
31747                                                   ((instr >> 21) & 0x80));
31748                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
31749                                       vbic(CurrentCond(),
31750                                            dt,
31751                                            DRegister(rd),
31752                                            DRegister(rd),
31753                                            imm);
31754                                       break;
31755                                     }
31756                                   }
31757                                   break;
31758                                 }
31759                               }
31760                               break;
31761                             }
31762                             default: {
31763                               switch (instr & 0x00000300) {
31764                                 case 0x00000000: {
31765                                   // 0xef800410
31766                                   if ((instr & 0x10000000) == 0x10000000) {
31767                                     if (((instr & 0x380080) == 0x0)) {
31768                                       UnallocatedT32(instr);
31769                                       return;
31770                                     }
31771                                     DataType dt = Dt_L_imm6_4_Decode(
31772                                         ((instr >> 19) & 0x7) |
31773                                         ((instr >> 4) & 0x8));
31774                                     if (dt.Is(kDataTypeValueInvalid)) {
31775                                       UnallocatedT32(instr);
31776                                       return;
31777                                     }
31778                                     unsigned rd =
31779                                         ExtractDRegister(instr, 22, 12);
31780                                     unsigned rm = ExtractDRegister(instr, 5, 0);
31781                                     uint32_t imm6 = (instr >> 16) & 0x3f;
31782                                     uint32_t imm =
31783                                         (dt.IsSize(64) ? 64
31784                                                        : (dt.GetSize() * 2)) -
31785                                         imm6;
31786                                     // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31787                                     vsri(CurrentCond(),
31788                                          dt,
31789                                          DRegister(rd),
31790                                          DRegister(rm),
31791                                          imm);
31792                                   } else {
31793                                     UnallocatedT32(instr);
31794                                   }
31795                                   break;
31796                                 }
31797                                 case 0x00000100: {
31798                                   // 0xef800510
31799                                   switch (instr & 0x10000000) {
31800                                     case 0x00000000: {
31801                                       // 0xef800510
31802                                       if (((instr & 0x380080) == 0x0)) {
31803                                         UnallocatedT32(instr);
31804                                         return;
31805                                       }
31806                                       DataType dt = Dt_L_imm6_3_Decode(
31807                                           ((instr >> 19) & 0x7) |
31808                                           ((instr >> 4) & 0x8));
31809                                       if (dt.Is(kDataTypeValueInvalid)) {
31810                                         UnallocatedT32(instr);
31811                                         return;
31812                                       }
31813                                       unsigned rd =
31814                                           ExtractDRegister(instr, 22, 12);
31815                                       unsigned rm =
31816                                           ExtractDRegister(instr, 5, 0);
31817                                       uint32_t imm6 = (instr >> 16) & 0x3f;
31818                                       uint32_t imm =
31819                                           imm6 -
31820                                           (dt.IsSize(64) ? 0 : dt.GetSize());
31821                                       // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31822                                       vshl(CurrentCond(),
31823                                            dt,
31824                                            DRegister(rd),
31825                                            DRegister(rm),
31826                                            imm);
31827                                       break;
31828                                     }
31829                                     case 0x10000000: {
31830                                       // 0xff800510
31831                                       if (((instr & 0x380080) == 0x0)) {
31832                                         UnallocatedT32(instr);
31833                                         return;
31834                                       }
31835                                       DataType dt = Dt_L_imm6_4_Decode(
31836                                           ((instr >> 19) & 0x7) |
31837                                           ((instr >> 4) & 0x8));
31838                                       if (dt.Is(kDataTypeValueInvalid)) {
31839                                         UnallocatedT32(instr);
31840                                         return;
31841                                       }
31842                                       unsigned rd =
31843                                           ExtractDRegister(instr, 22, 12);
31844                                       unsigned rm =
31845                                           ExtractDRegister(instr, 5, 0);
31846                                       uint32_t imm6 = (instr >> 16) & 0x3f;
31847                                       uint32_t imm =
31848                                           imm6 -
31849                                           (dt.IsSize(64) ? 0 : dt.GetSize());
31850                                       // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31851                                       vsli(CurrentCond(),
31852                                            dt,
31853                                            DRegister(rd),
31854                                            DRegister(rm),
31855                                            imm);
31856                                       break;
31857                                     }
31858                                   }
31859                                   break;
31860                                 }
31861                                 case 0x00000200: {
31862                                   // 0xef800610
31863                                   if (((instr & 0x380080) == 0x0)) {
31864                                     UnallocatedT32(instr);
31865                                     return;
31866                                   }
31867                                   DataType dt =
31868                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
31869                                                              ((instr >> 4) &
31870                                                               0x8),
31871                                                          (instr >> 28) & 0x1);
31872                                   if (dt.Is(kDataTypeValueInvalid)) {
31873                                     UnallocatedT32(instr);
31874                                     return;
31875                                   }
31876                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31877                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31878                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31879                                   uint32_t imm =
31880                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
31881                                   // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31882                                   vqshlu(CurrentCond(),
31883                                          dt,
31884                                          DRegister(rd),
31885                                          DRegister(rm),
31886                                          imm);
31887                                   break;
31888                                 }
31889                                 case 0x00000300: {
31890                                   // 0xef800710
31891                                   if (((instr & 0x380080) == 0x0)) {
31892                                     UnallocatedT32(instr);
31893                                     return;
31894                                   }
31895                                   DataType dt =
31896                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
31897                                                              ((instr >> 4) &
31898                                                               0x8),
31899                                                          (instr >> 28) & 0x1);
31900                                   if (dt.Is(kDataTypeValueInvalid)) {
31901                                     UnallocatedT32(instr);
31902                                     return;
31903                                   }
31904                                   unsigned rd = ExtractDRegister(instr, 22, 12);
31905                                   unsigned rm = ExtractDRegister(instr, 5, 0);
31906                                   uint32_t imm6 = (instr >> 16) & 0x3f;
31907                                   uint32_t imm =
31908                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
31909                                   // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
31910                                   vqshl(CurrentCond(),
31911                                         dt,
31912                                         DRegister(rd),
31913                                         DRegister(rm),
31914                                         imm);
31915                                   break;
31916                                 }
31917                               }
31918                               break;
31919                             }
31920                           }
31921                           break;
31922                         }
31923                         case 0x00000800: {
31924                           // 0xef800810
31925                           switch (instr & 0x00000080) {
31926                             case 0x00000000: {
31927                               // 0xef800810
31928                               switch (instr & 0x00380000) {
31929                                 case 0x00000000: {
31930                                   // 0xef800810
31931                                   switch (instr & 0x00000100) {
31932                                     case 0x00000000: {
31933                                       // 0xef800810
31934                                       switch (instr & 0x00000200) {
31935                                         default: {
31936                                           switch (instr & 0x00000020) {
31937                                             case 0x00000020: {
31938                                               // 0xef800830
31939                                               if (((instr & 0xd00) == 0x100) ||
31940                                                   ((instr & 0xd00) == 0x500) ||
31941                                                   ((instr & 0xd00) == 0x900) ||
31942                                                   ((instr & 0xe00) == 0xe00)) {
31943                                                 UnallocatedT32(instr);
31944                                                 return;
31945                                               }
31946                                               unsigned cmode =
31947                                                   (instr >> 8) & 0xf;
31948                                               DataType dt =
31949                                                   ImmediateVmvn::DecodeDt(
31950                                                       cmode);
31951                                               if (dt.Is(
31952                                                       kDataTypeValueInvalid)) {
31953                                                 UnallocatedT32(instr);
31954                                                 return;
31955                                               }
31956                                               unsigned rd =
31957                                                   ExtractDRegister(instr,
31958                                                                    22,
31959                                                                    12);
31960                                               DOperand imm = ImmediateVmvn::
31961                                                   DecodeImmediate(cmode,
31962                                                                   (instr &
31963                                                                    0xf) |
31964                                                                       ((instr >>
31965                                                                         12) &
31966                                                                        0x70) |
31967                                                                       ((instr >>
31968                                                                         21) &
31969                                                                        0x80));
31970                                               // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
31971                                               vmvn(CurrentCond(),
31972                                                    dt,
31973                                                    DRegister(rd),
31974                                                    imm);
31975                                               break;
31976                                             }
31977                                             default: {
31978                                               if (((instr & 0x920) == 0x100) ||
31979                                                   ((instr & 0x520) == 0x100) ||
31980                                                   ((instr & 0x820) == 0x20) ||
31981                                                   ((instr & 0x420) == 0x20) ||
31982                                                   ((instr & 0x220) == 0x20) ||
31983                                                   ((instr & 0x120) == 0x120)) {
31984                                                 UnallocatedT32(instr);
31985                                                 return;
31986                                               }
31987                                               unsigned cmode =
31988                                                   ((instr >> 8) & 0xf) |
31989                                                   ((instr >> 1) & 0x10);
31990                                               DataType dt =
31991                                                   ImmediateVmov::DecodeDt(
31992                                                       cmode);
31993                                               if (dt.Is(
31994                                                       kDataTypeValueInvalid)) {
31995                                                 UnallocatedT32(instr);
31996                                                 return;
31997                                               }
31998                                               unsigned rd =
31999                                                   ExtractDRegister(instr,
32000                                                                    22,
32001                                                                    12);
32002                                               DOperand imm = ImmediateVmov::
32003                                                   DecodeImmediate(cmode,
32004                                                                   (instr &
32005                                                                    0xf) |
32006                                                                       ((instr >>
32007                                                                         12) &
32008                                                                        0x70) |
32009                                                                       ((instr >>
32010                                                                         21) &
32011                                                                        0x80));
32012                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
32013                                               vmov(CurrentCond(),
32014                                                    dt,
32015                                                    DRegister(rd),
32016                                                    imm);
32017                                               break;
32018                                             }
32019                                           }
32020                                           break;
32021                                         }
32022                                       }
32023                                       break;
32024                                     }
32025                                     case 0x00000100: {
32026                                       // 0xef800910
32027                                       switch (instr & 0x00000020) {
32028                                         case 0x00000000: {
32029                                           // 0xef800910
32030                                           if (((instr & 0x100) == 0x0) ||
32031                                               ((instr & 0xc00) == 0xc00)) {
32032                                             UnallocatedT32(instr);
32033                                             return;
32034                                           }
32035                                           unsigned cmode = (instr >> 8) & 0xf;
32036                                           DataType dt =
32037                                               ImmediateVorr::DecodeDt(cmode);
32038                                           if (dt.Is(kDataTypeValueInvalid)) {
32039                                             UnallocatedT32(instr);
32040                                             return;
32041                                           }
32042                                           unsigned rd =
32043                                               ExtractDRegister(instr, 22, 12);
32044                                           DOperand imm =
32045                                               ImmediateVorr::DecodeImmediate(
32046                                                   cmode,
32047                                                   (instr & 0xf) |
32048                                                       ((instr >> 12) & 0x70) |
32049                                                       ((instr >> 21) & 0x80));
32050                                           // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
32051                                           vorr(CurrentCond(),
32052                                                dt,
32053                                                DRegister(rd),
32054                                                DRegister(rd),
32055                                                imm);
32056                                           break;
32057                                         }
32058                                         case 0x00000020: {
32059                                           // 0xef800930
32060                                           if (((instr & 0x100) == 0x0) ||
32061                                               ((instr & 0xc00) == 0xc00)) {
32062                                             UnallocatedT32(instr);
32063                                             return;
32064                                           }
32065                                           unsigned cmode = (instr >> 8) & 0xf;
32066                                           DataType dt =
32067                                               ImmediateVbic::DecodeDt(cmode);
32068                                           if (dt.Is(kDataTypeValueInvalid)) {
32069                                             UnallocatedT32(instr);
32070                                             return;
32071                                           }
32072                                           unsigned rd =
32073                                               ExtractDRegister(instr, 22, 12);
32074                                           DOperand imm =
32075                                               ImmediateVbic::DecodeImmediate(
32076                                                   cmode,
32077                                                   (instr & 0xf) |
32078                                                       ((instr >> 12) & 0x70) |
32079                                                       ((instr >> 21) & 0x80));
32080                                           // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
32081                                           vbic(CurrentCond(),
32082                                                dt,
32083                                                DRegister(rd),
32084                                                DRegister(rd),
32085                                                imm);
32086                                           break;
32087                                         }
32088                                       }
32089                                       break;
32090                                     }
32091                                   }
32092                                   break;
32093                                 }
32094                                 case 0x00180000: {
32095                                   // 0xef980810
32096                                   switch (instr & 0x00000300) {
32097                                     case 0x00000000: {
32098                                       // 0xef980810
32099                                       switch (instr & 0x10000000) {
32100                                         case 0x00000000: {
32101                                           // 0xef980810
32102                                           if (((instr & 0x380000) == 0x0)) {
32103                                             UnallocatedT32(instr);
32104                                             return;
32105                                           }
32106                                           DataType dt = Dt_imm6_3_Decode(
32107                                               (instr >> 19) & 0x7);
32108                                           if (dt.Is(kDataTypeValueInvalid)) {
32109                                             UnallocatedT32(instr);
32110                                             return;
32111                                           }
32112                                           unsigned rd =
32113                                               ExtractDRegister(instr, 22, 12);
32114                                           if ((instr & 1) != 0) {
32115                                             UnallocatedT32(instr);
32116                                             return;
32117                                           }
32118                                           unsigned rm =
32119                                               ExtractQRegister(instr, 5, 0);
32120                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32121                                           uint32_t imm = dt.GetSize() - imm6;
32122                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32123                                           vshrn(CurrentCond(),
32124                                                 dt,
32125                                                 DRegister(rd),
32126                                                 QRegister(rm),
32127                                                 imm);
32128                                           break;
32129                                         }
32130                                         case 0x10000000: {
32131                                           // 0xff980810
32132                                           if (((instr & 0x380000) == 0x0)) {
32133                                             UnallocatedT32(instr);
32134                                             return;
32135                                           }
32136                                           DataType dt =
32137                                               Dt_imm6_2_Decode((instr >> 19) &
32138                                                                    0x7,
32139                                                                (instr >> 28) &
32140                                                                    0x1);
32141                                           if (dt.Is(kDataTypeValueInvalid)) {
32142                                             UnallocatedT32(instr);
32143                                             return;
32144                                           }
32145                                           unsigned rd =
32146                                               ExtractDRegister(instr, 22, 12);
32147                                           if ((instr & 1) != 0) {
32148                                             UnallocatedT32(instr);
32149                                             return;
32150                                           }
32151                                           unsigned rm =
32152                                               ExtractQRegister(instr, 5, 0);
32153                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32154                                           uint32_t imm = dt.GetSize() - imm6;
32155                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32156                                           vqshrun(CurrentCond(),
32157                                                   dt,
32158                                                   DRegister(rd),
32159                                                   QRegister(rm),
32160                                                   imm);
32161                                           break;
32162                                         }
32163                                       }
32164                                       break;
32165                                     }
32166                                     case 0x00000100: {
32167                                       // 0xef980910
32168                                       if (((instr & 0x380000) == 0x0)) {
32169                                         UnallocatedT32(instr);
32170                                         return;
32171                                       }
32172                                       DataType dt =
32173                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32174                                                            (instr >> 28) & 0x1);
32175                                       if (dt.Is(kDataTypeValueInvalid)) {
32176                                         UnallocatedT32(instr);
32177                                         return;
32178                                       }
32179                                       unsigned rd =
32180                                           ExtractDRegister(instr, 22, 12);
32181                                       if ((instr & 1) != 0) {
32182                                         UnallocatedT32(instr);
32183                                         return;
32184                                       }
32185                                       unsigned rm =
32186                                           ExtractQRegister(instr, 5, 0);
32187                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32188                                       uint32_t imm = dt.GetSize() - imm6;
32189                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32190                                       vqshrn(CurrentCond(),
32191                                              dt,
32192                                              DRegister(rd),
32193                                              QRegister(rm),
32194                                              imm);
32195                                       break;
32196                                     }
32197                                     case 0x00000200: {
32198                                       // 0xef980a10
32199                                       if (((instr & 0x380000) == 0x0) ||
32200                                           ((instr & 0x3f0000) == 0x80000) ||
32201                                           ((instr & 0x3f0000) == 0x100000) ||
32202                                           ((instr & 0x3f0000) == 0x200000)) {
32203                                         UnallocatedT32(instr);
32204                                         return;
32205                                       }
32206                                       DataType dt =
32207                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32208                                                            (instr >> 28) & 0x1);
32209                                       if (dt.Is(kDataTypeValueInvalid)) {
32210                                         UnallocatedT32(instr);
32211                                         return;
32212                                       }
32213                                       if (((instr >> 12) & 1) != 0) {
32214                                         UnallocatedT32(instr);
32215                                         return;
32216                                       }
32217                                       unsigned rd =
32218                                           ExtractQRegister(instr, 22, 12);
32219                                       unsigned rm =
32220                                           ExtractDRegister(instr, 5, 0);
32221                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32222                                       uint32_t imm = imm6 - dt.GetSize();
32223                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32224                                       vshll(CurrentCond(),
32225                                             dt,
32226                                             QRegister(rd),
32227                                             DRegister(rm),
32228                                             imm);
32229                                       break;
32230                                     }
32231                                     default:
32232                                       UnallocatedT32(instr);
32233                                       break;
32234                                   }
32235                                   break;
32236                                 }
32237                                 case 0x00280000: {
32238                                   // 0xefa80810
32239                                   switch (instr & 0x00000300) {
32240                                     case 0x00000000: {
32241                                       // 0xefa80810
32242                                       switch (instr & 0x10000000) {
32243                                         case 0x00000000: {
32244                                           // 0xefa80810
32245                                           if (((instr & 0x380000) == 0x0)) {
32246                                             UnallocatedT32(instr);
32247                                             return;
32248                                           }
32249                                           DataType dt = Dt_imm6_3_Decode(
32250                                               (instr >> 19) & 0x7);
32251                                           if (dt.Is(kDataTypeValueInvalid)) {
32252                                             UnallocatedT32(instr);
32253                                             return;
32254                                           }
32255                                           unsigned rd =
32256                                               ExtractDRegister(instr, 22, 12);
32257                                           if ((instr & 1) != 0) {
32258                                             UnallocatedT32(instr);
32259                                             return;
32260                                           }
32261                                           unsigned rm =
32262                                               ExtractQRegister(instr, 5, 0);
32263                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32264                                           uint32_t imm = dt.GetSize() - imm6;
32265                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32266                                           vshrn(CurrentCond(),
32267                                                 dt,
32268                                                 DRegister(rd),
32269                                                 QRegister(rm),
32270                                                 imm);
32271                                           break;
32272                                         }
32273                                         case 0x10000000: {
32274                                           // 0xffa80810
32275                                           if (((instr & 0x380000) == 0x0)) {
32276                                             UnallocatedT32(instr);
32277                                             return;
32278                                           }
32279                                           DataType dt =
32280                                               Dt_imm6_2_Decode((instr >> 19) &
32281                                                                    0x7,
32282                                                                (instr >> 28) &
32283                                                                    0x1);
32284                                           if (dt.Is(kDataTypeValueInvalid)) {
32285                                             UnallocatedT32(instr);
32286                                             return;
32287                                           }
32288                                           unsigned rd =
32289                                               ExtractDRegister(instr, 22, 12);
32290                                           if ((instr & 1) != 0) {
32291                                             UnallocatedT32(instr);
32292                                             return;
32293                                           }
32294                                           unsigned rm =
32295                                               ExtractQRegister(instr, 5, 0);
32296                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32297                                           uint32_t imm = dt.GetSize() - imm6;
32298                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32299                                           vqshrun(CurrentCond(),
32300                                                   dt,
32301                                                   DRegister(rd),
32302                                                   QRegister(rm),
32303                                                   imm);
32304                                           break;
32305                                         }
32306                                       }
32307                                       break;
32308                                     }
32309                                     case 0x00000100: {
32310                                       // 0xefa80910
32311                                       if (((instr & 0x380000) == 0x0)) {
32312                                         UnallocatedT32(instr);
32313                                         return;
32314                                       }
32315                                       DataType dt =
32316                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32317                                                            (instr >> 28) & 0x1);
32318                                       if (dt.Is(kDataTypeValueInvalid)) {
32319                                         UnallocatedT32(instr);
32320                                         return;
32321                                       }
32322                                       unsigned rd =
32323                                           ExtractDRegister(instr, 22, 12);
32324                                       if ((instr & 1) != 0) {
32325                                         UnallocatedT32(instr);
32326                                         return;
32327                                       }
32328                                       unsigned rm =
32329                                           ExtractQRegister(instr, 5, 0);
32330                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32331                                       uint32_t imm = dt.GetSize() - imm6;
32332                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32333                                       vqshrn(CurrentCond(),
32334                                              dt,
32335                                              DRegister(rd),
32336                                              QRegister(rm),
32337                                              imm);
32338                                       break;
32339                                     }
32340                                     case 0x00000200: {
32341                                       // 0xefa80a10
32342                                       if (((instr & 0x380000) == 0x0) ||
32343                                           ((instr & 0x3f0000) == 0x80000) ||
32344                                           ((instr & 0x3f0000) == 0x100000) ||
32345                                           ((instr & 0x3f0000) == 0x200000)) {
32346                                         UnallocatedT32(instr);
32347                                         return;
32348                                       }
32349                                       DataType dt =
32350                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32351                                                            (instr >> 28) & 0x1);
32352                                       if (dt.Is(kDataTypeValueInvalid)) {
32353                                         UnallocatedT32(instr);
32354                                         return;
32355                                       }
32356                                       if (((instr >> 12) & 1) != 0) {
32357                                         UnallocatedT32(instr);
32358                                         return;
32359                                       }
32360                                       unsigned rd =
32361                                           ExtractQRegister(instr, 22, 12);
32362                                       unsigned rm =
32363                                           ExtractDRegister(instr, 5, 0);
32364                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32365                                       uint32_t imm = imm6 - dt.GetSize();
32366                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32367                                       vshll(CurrentCond(),
32368                                             dt,
32369                                             QRegister(rd),
32370                                             DRegister(rm),
32371                                             imm);
32372                                       break;
32373                                     }
32374                                     default:
32375                                       UnallocatedT32(instr);
32376                                       break;
32377                                   }
32378                                   break;
32379                                 }
32380                                 case 0x00300000: {
32381                                   // 0xefb00810
32382                                   switch (instr & 0x00000300) {
32383                                     case 0x00000000: {
32384                                       // 0xefb00810
32385                                       switch (instr & 0x10000000) {
32386                                         case 0x00000000: {
32387                                           // 0xefb00810
32388                                           if (((instr & 0x380000) == 0x0)) {
32389                                             UnallocatedT32(instr);
32390                                             return;
32391                                           }
32392                                           DataType dt = Dt_imm6_3_Decode(
32393                                               (instr >> 19) & 0x7);
32394                                           if (dt.Is(kDataTypeValueInvalid)) {
32395                                             UnallocatedT32(instr);
32396                                             return;
32397                                           }
32398                                           unsigned rd =
32399                                               ExtractDRegister(instr, 22, 12);
32400                                           if ((instr & 1) != 0) {
32401                                             UnallocatedT32(instr);
32402                                             return;
32403                                           }
32404                                           unsigned rm =
32405                                               ExtractQRegister(instr, 5, 0);
32406                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32407                                           uint32_t imm = dt.GetSize() - imm6;
32408                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32409                                           vshrn(CurrentCond(),
32410                                                 dt,
32411                                                 DRegister(rd),
32412                                                 QRegister(rm),
32413                                                 imm);
32414                                           break;
32415                                         }
32416                                         case 0x10000000: {
32417                                           // 0xffb00810
32418                                           if (((instr & 0x380000) == 0x0)) {
32419                                             UnallocatedT32(instr);
32420                                             return;
32421                                           }
32422                                           DataType dt =
32423                                               Dt_imm6_2_Decode((instr >> 19) &
32424                                                                    0x7,
32425                                                                (instr >> 28) &
32426                                                                    0x1);
32427                                           if (dt.Is(kDataTypeValueInvalid)) {
32428                                             UnallocatedT32(instr);
32429                                             return;
32430                                           }
32431                                           unsigned rd =
32432                                               ExtractDRegister(instr, 22, 12);
32433                                           if ((instr & 1) != 0) {
32434                                             UnallocatedT32(instr);
32435                                             return;
32436                                           }
32437                                           unsigned rm =
32438                                               ExtractQRegister(instr, 5, 0);
32439                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32440                                           uint32_t imm = dt.GetSize() - imm6;
32441                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32442                                           vqshrun(CurrentCond(),
32443                                                   dt,
32444                                                   DRegister(rd),
32445                                                   QRegister(rm),
32446                                                   imm);
32447                                           break;
32448                                         }
32449                                       }
32450                                       break;
32451                                     }
32452                                     case 0x00000100: {
32453                                       // 0xefb00910
32454                                       if (((instr & 0x380000) == 0x0)) {
32455                                         UnallocatedT32(instr);
32456                                         return;
32457                                       }
32458                                       DataType dt =
32459                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32460                                                            (instr >> 28) & 0x1);
32461                                       if (dt.Is(kDataTypeValueInvalid)) {
32462                                         UnallocatedT32(instr);
32463                                         return;
32464                                       }
32465                                       unsigned rd =
32466                                           ExtractDRegister(instr, 22, 12);
32467                                       if ((instr & 1) != 0) {
32468                                         UnallocatedT32(instr);
32469                                         return;
32470                                       }
32471                                       unsigned rm =
32472                                           ExtractQRegister(instr, 5, 0);
32473                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32474                                       uint32_t imm = dt.GetSize() - imm6;
32475                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32476                                       vqshrn(CurrentCond(),
32477                                              dt,
32478                                              DRegister(rd),
32479                                              QRegister(rm),
32480                                              imm);
32481                                       break;
32482                                     }
32483                                     case 0x00000200: {
32484                                       // 0xefb00a10
32485                                       if (((instr & 0x380000) == 0x0) ||
32486                                           ((instr & 0x3f0000) == 0x80000) ||
32487                                           ((instr & 0x3f0000) == 0x100000) ||
32488                                           ((instr & 0x3f0000) == 0x200000)) {
32489                                         UnallocatedT32(instr);
32490                                         return;
32491                                       }
32492                                       DataType dt =
32493                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32494                                                            (instr >> 28) & 0x1);
32495                                       if (dt.Is(kDataTypeValueInvalid)) {
32496                                         UnallocatedT32(instr);
32497                                         return;
32498                                       }
32499                                       if (((instr >> 12) & 1) != 0) {
32500                                         UnallocatedT32(instr);
32501                                         return;
32502                                       }
32503                                       unsigned rd =
32504                                           ExtractQRegister(instr, 22, 12);
32505                                       unsigned rm =
32506                                           ExtractDRegister(instr, 5, 0);
32507                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32508                                       uint32_t imm = imm6 - dt.GetSize();
32509                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32510                                       vshll(CurrentCond(),
32511                                             dt,
32512                                             QRegister(rd),
32513                                             DRegister(rm),
32514                                             imm);
32515                                       break;
32516                                     }
32517                                     default:
32518                                       UnallocatedT32(instr);
32519                                       break;
32520                                   }
32521                                   break;
32522                                 }
32523                                 case 0x00380000: {
32524                                   // 0xefb80810
32525                                   switch (instr & 0x00000300) {
32526                                     case 0x00000000: {
32527                                       // 0xefb80810
32528                                       switch (instr & 0x10000000) {
32529                                         case 0x00000000: {
32530                                           // 0xefb80810
32531                                           if (((instr & 0x380000) == 0x0)) {
32532                                             UnallocatedT32(instr);
32533                                             return;
32534                                           }
32535                                           DataType dt = Dt_imm6_3_Decode(
32536                                               (instr >> 19) & 0x7);
32537                                           if (dt.Is(kDataTypeValueInvalid)) {
32538                                             UnallocatedT32(instr);
32539                                             return;
32540                                           }
32541                                           unsigned rd =
32542                                               ExtractDRegister(instr, 22, 12);
32543                                           if ((instr & 1) != 0) {
32544                                             UnallocatedT32(instr);
32545                                             return;
32546                                           }
32547                                           unsigned rm =
32548                                               ExtractQRegister(instr, 5, 0);
32549                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32550                                           uint32_t imm = dt.GetSize() - imm6;
32551                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32552                                           vshrn(CurrentCond(),
32553                                                 dt,
32554                                                 DRegister(rd),
32555                                                 QRegister(rm),
32556                                                 imm);
32557                                           break;
32558                                         }
32559                                         case 0x10000000: {
32560                                           // 0xffb80810
32561                                           if (((instr & 0x380000) == 0x0)) {
32562                                             UnallocatedT32(instr);
32563                                             return;
32564                                           }
32565                                           DataType dt =
32566                                               Dt_imm6_2_Decode((instr >> 19) &
32567                                                                    0x7,
32568                                                                (instr >> 28) &
32569                                                                    0x1);
32570                                           if (dt.Is(kDataTypeValueInvalid)) {
32571                                             UnallocatedT32(instr);
32572                                             return;
32573                                           }
32574                                           unsigned rd =
32575                                               ExtractDRegister(instr, 22, 12);
32576                                           if ((instr & 1) != 0) {
32577                                             UnallocatedT32(instr);
32578                                             return;
32579                                           }
32580                                           unsigned rm =
32581                                               ExtractQRegister(instr, 5, 0);
32582                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32583                                           uint32_t imm = dt.GetSize() - imm6;
32584                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32585                                           vqshrun(CurrentCond(),
32586                                                   dt,
32587                                                   DRegister(rd),
32588                                                   QRegister(rm),
32589                                                   imm);
32590                                           break;
32591                                         }
32592                                       }
32593                                       break;
32594                                     }
32595                                     case 0x00000100: {
32596                                       // 0xefb80910
32597                                       if (((instr & 0x380000) == 0x0)) {
32598                                         UnallocatedT32(instr);
32599                                         return;
32600                                       }
32601                                       DataType dt =
32602                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32603                                                            (instr >> 28) & 0x1);
32604                                       if (dt.Is(kDataTypeValueInvalid)) {
32605                                         UnallocatedT32(instr);
32606                                         return;
32607                                       }
32608                                       unsigned rd =
32609                                           ExtractDRegister(instr, 22, 12);
32610                                       if ((instr & 1) != 0) {
32611                                         UnallocatedT32(instr);
32612                                         return;
32613                                       }
32614                                       unsigned rm =
32615                                           ExtractQRegister(instr, 5, 0);
32616                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32617                                       uint32_t imm = dt.GetSize() - imm6;
32618                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32619                                       vqshrn(CurrentCond(),
32620                                              dt,
32621                                              DRegister(rd),
32622                                              QRegister(rm),
32623                                              imm);
32624                                       break;
32625                                     }
32626                                     case 0x00000200: {
32627                                       // 0xefb80a10
32628                                       if (((instr & 0x380000) == 0x0) ||
32629                                           ((instr & 0x3f0000) == 0x80000) ||
32630                                           ((instr & 0x3f0000) == 0x100000) ||
32631                                           ((instr & 0x3f0000) == 0x200000)) {
32632                                         UnallocatedT32(instr);
32633                                         return;
32634                                       }
32635                                       DataType dt =
32636                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
32637                                                            (instr >> 28) & 0x1);
32638                                       if (dt.Is(kDataTypeValueInvalid)) {
32639                                         UnallocatedT32(instr);
32640                                         return;
32641                                       }
32642                                       if (((instr >> 12) & 1) != 0) {
32643                                         UnallocatedT32(instr);
32644                                         return;
32645                                       }
32646                                       unsigned rd =
32647                                           ExtractQRegister(instr, 22, 12);
32648                                       unsigned rm =
32649                                           ExtractDRegister(instr, 5, 0);
32650                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32651                                       uint32_t imm = imm6 - dt.GetSize();
32652                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32653                                       vshll(CurrentCond(),
32654                                             dt,
32655                                             QRegister(rd),
32656                                             DRegister(rm),
32657                                             imm);
32658                                       break;
32659                                     }
32660                                     default:
32661                                       UnallocatedT32(instr);
32662                                       break;
32663                                   }
32664                                   break;
32665                                 }
32666                                 default: {
32667                                   switch (instr & 0x00000300) {
32668                                     case 0x00000000: {
32669                                       // 0xef800810
32670                                       switch (instr & 0x10000000) {
32671                                         case 0x00000000: {
32672                                           // 0xef800810
32673                                           if (((instr & 0x380000) == 0x0)) {
32674                                             UnallocatedT32(instr);
32675                                             return;
32676                                           }
32677                                           DataType dt = Dt_imm6_3_Decode(
32678                                               (instr >> 19) & 0x7);
32679                                           if (dt.Is(kDataTypeValueInvalid)) {
32680                                             UnallocatedT32(instr);
32681                                             return;
32682                                           }
32683                                           unsigned rd =
32684                                               ExtractDRegister(instr, 22, 12);
32685                                           if ((instr & 1) != 0) {
32686                                             UnallocatedT32(instr);
32687                                             return;
32688                                           }
32689                                           unsigned rm =
32690                                               ExtractQRegister(instr, 5, 0);
32691                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32692                                           uint32_t imm = dt.GetSize() - imm6;
32693                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32694                                           vshrn(CurrentCond(),
32695                                                 dt,
32696                                                 DRegister(rd),
32697                                                 QRegister(rm),
32698                                                 imm);
32699                                           break;
32700                                         }
32701                                         case 0x10000000: {
32702                                           // 0xff800810
32703                                           if (((instr & 0x380000) == 0x0)) {
32704                                             UnallocatedT32(instr);
32705                                             return;
32706                                           }
32707                                           DataType dt =
32708                                               Dt_imm6_2_Decode((instr >> 19) &
32709                                                                    0x7,
32710                                                                (instr >> 28) &
32711                                                                    0x1);
32712                                           if (dt.Is(kDataTypeValueInvalid)) {
32713                                             UnallocatedT32(instr);
32714                                             return;
32715                                           }
32716                                           unsigned rd =
32717                                               ExtractDRegister(instr, 22, 12);
32718                                           if ((instr & 1) != 0) {
32719                                             UnallocatedT32(instr);
32720                                             return;
32721                                           }
32722                                           unsigned rm =
32723                                               ExtractQRegister(instr, 5, 0);
32724                                           uint32_t imm6 = (instr >> 16) & 0x3f;
32725                                           uint32_t imm = dt.GetSize() - imm6;
32726                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32727                                           vqshrun(CurrentCond(),
32728                                                   dt,
32729                                                   DRegister(rd),
32730                                                   QRegister(rm),
32731                                                   imm);
32732                                           break;
32733                                         }
32734                                       }
32735                                       break;
32736                                     }
32737                                     case 0x00000100: {
32738                                       // 0xef800910
32739                                       if (((instr & 0x380000) == 0x0)) {
32740                                         UnallocatedT32(instr);
32741                                         return;
32742                                       }
32743                                       DataType dt =
32744                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
32745                                                            (instr >> 28) & 0x1);
32746                                       if (dt.Is(kDataTypeValueInvalid)) {
32747                                         UnallocatedT32(instr);
32748                                         return;
32749                                       }
32750                                       unsigned rd =
32751                                           ExtractDRegister(instr, 22, 12);
32752                                       if ((instr & 1) != 0) {
32753                                         UnallocatedT32(instr);
32754                                         return;
32755                                       }
32756                                       unsigned rm =
32757                                           ExtractQRegister(instr, 5, 0);
32758                                       uint32_t imm6 = (instr >> 16) & 0x3f;
32759                                       uint32_t imm = dt.GetSize() - imm6;
32760                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32761                                       vqshrn(CurrentCond(),
32762                                              dt,
32763                                              DRegister(rd),
32764                                              QRegister(rm),
32765                                              imm);
32766                                       break;
32767                                     }
32768                                     case 0x00000200: {
32769                                       // 0xef800a10
32770                                       switch (instr & 0x00070000) {
32771                                         case 0x00000000: {
32772                                           // 0xef800a10
32773                                           switch (instr & 0x003f0000) {
32774                                             case 0x00080000: {
32775                                               // 0xef880a10
32776                                               if (((instr & 0x380000) == 0x0) ||
32777                                                   ((instr & 0x380000) ==
32778                                                    0x180000) ||
32779                                                   ((instr & 0x380000) ==
32780                                                    0x280000) ||
32781                                                   ((instr & 0x380000) ==
32782                                                    0x300000) ||
32783                                                   ((instr & 0x380000) ==
32784                                                    0x380000)) {
32785                                                 UnallocatedT32(instr);
32786                                                 return;
32787                                               }
32788                                               DataType dt = Dt_U_imm3H_1_Decode(
32789                                                   ((instr >> 19) & 0x7) |
32790                                                   ((instr >> 25) & 0x8));
32791                                               if (dt.Is(
32792                                                       kDataTypeValueInvalid)) {
32793                                                 UnallocatedT32(instr);
32794                                                 return;
32795                                               }
32796                                               if (((instr >> 12) & 1) != 0) {
32797                                                 UnallocatedT32(instr);
32798                                                 return;
32799                                               }
32800                                               unsigned rd =
32801                                                   ExtractQRegister(instr,
32802                                                                    22,
32803                                                                    12);
32804                                               unsigned rm =
32805                                                   ExtractDRegister(instr, 5, 0);
32806                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
32807                                               vmovl(CurrentCond(),
32808                                                     dt,
32809                                                     QRegister(rd),
32810                                                     DRegister(rm));
32811                                               break;
32812                                             }
32813                                             case 0x00090000: {
32814                                               // 0xef890a10
32815                                               if (((instr & 0x380000) == 0x0) ||
32816                                                   ((instr & 0x3f0000) ==
32817                                                    0x80000) ||
32818                                                   ((instr & 0x3f0000) ==
32819                                                    0x100000) ||
32820                                                   ((instr & 0x3f0000) ==
32821                                                    0x200000)) {
32822                                                 UnallocatedT32(instr);
32823                                                 return;
32824                                               }
32825                                               DataType dt =
32826                                                   Dt_imm6_4_Decode((instr >>
32827                                                                     19) &
32828                                                                        0x7,
32829                                                                    (instr >>
32830                                                                     28) &
32831                                                                        0x1);
32832                                               if (dt.Is(
32833                                                       kDataTypeValueInvalid)) {
32834                                                 UnallocatedT32(instr);
32835                                                 return;
32836                                               }
32837                                               if (((instr >> 12) & 1) != 0) {
32838                                                 UnallocatedT32(instr);
32839                                                 return;
32840                                               }
32841                                               unsigned rd =
32842                                                   ExtractQRegister(instr,
32843                                                                    22,
32844                                                                    12);
32845                                               unsigned rm =
32846                                                   ExtractDRegister(instr, 5, 0);
32847                                               uint32_t imm6 =
32848                                                   (instr >> 16) & 0x3f;
32849                                               uint32_t imm =
32850                                                   imm6 - dt.GetSize();
32851                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32852                                               vshll(CurrentCond(),
32853                                                     dt,
32854                                                     QRegister(rd),
32855                                                     DRegister(rm),
32856                                                     imm);
32857                                               break;
32858                                             }
32859                                             case 0x000a0000: {
32860                                               // 0xef8a0a10
32861                                               if (((instr & 0x380000) == 0x0) ||
32862                                                   ((instr & 0x3f0000) ==
32863                                                    0x80000) ||
32864                                                   ((instr & 0x3f0000) ==
32865                                                    0x100000) ||
32866                                                   ((instr & 0x3f0000) ==
32867                                                    0x200000)) {
32868                                                 UnallocatedT32(instr);
32869                                                 return;
32870                                               }
32871                                               DataType dt =
32872                                                   Dt_imm6_4_Decode((instr >>
32873                                                                     19) &
32874                                                                        0x7,
32875                                                                    (instr >>
32876                                                                     28) &
32877                                                                        0x1);
32878                                               if (dt.Is(
32879                                                       kDataTypeValueInvalid)) {
32880                                                 UnallocatedT32(instr);
32881                                                 return;
32882                                               }
32883                                               if (((instr >> 12) & 1) != 0) {
32884                                                 UnallocatedT32(instr);
32885                                                 return;
32886                                               }
32887                                               unsigned rd =
32888                                                   ExtractQRegister(instr,
32889                                                                    22,
32890                                                                    12);
32891                                               unsigned rm =
32892                                                   ExtractDRegister(instr, 5, 0);
32893                                               uint32_t imm6 =
32894                                                   (instr >> 16) & 0x3f;
32895                                               uint32_t imm =
32896                                                   imm6 - dt.GetSize();
32897                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32898                                               vshll(CurrentCond(),
32899                                                     dt,
32900                                                     QRegister(rd),
32901                                                     DRegister(rm),
32902                                                     imm);
32903                                               break;
32904                                             }
32905                                             case 0x000b0000: {
32906                                               // 0xef8b0a10
32907                                               if (((instr & 0x380000) == 0x0) ||
32908                                                   ((instr & 0x3f0000) ==
32909                                                    0x80000) ||
32910                                                   ((instr & 0x3f0000) ==
32911                                                    0x100000) ||
32912                                                   ((instr & 0x3f0000) ==
32913                                                    0x200000)) {
32914                                                 UnallocatedT32(instr);
32915                                                 return;
32916                                               }
32917                                               DataType dt =
32918                                                   Dt_imm6_4_Decode((instr >>
32919                                                                     19) &
32920                                                                        0x7,
32921                                                                    (instr >>
32922                                                                     28) &
32923                                                                        0x1);
32924                                               if (dt.Is(
32925                                                       kDataTypeValueInvalid)) {
32926                                                 UnallocatedT32(instr);
32927                                                 return;
32928                                               }
32929                                               if (((instr >> 12) & 1) != 0) {
32930                                                 UnallocatedT32(instr);
32931                                                 return;
32932                                               }
32933                                               unsigned rd =
32934                                                   ExtractQRegister(instr,
32935                                                                    22,
32936                                                                    12);
32937                                               unsigned rm =
32938                                                   ExtractDRegister(instr, 5, 0);
32939                                               uint32_t imm6 =
32940                                                   (instr >> 16) & 0x3f;
32941                                               uint32_t imm =
32942                                                   imm6 - dt.GetSize();
32943                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32944                                               vshll(CurrentCond(),
32945                                                     dt,
32946                                                     QRegister(rd),
32947                                                     DRegister(rm),
32948                                                     imm);
32949                                               break;
32950                                             }
32951                                             case 0x000c0000: {
32952                                               // 0xef8c0a10
32953                                               if (((instr & 0x380000) == 0x0) ||
32954                                                   ((instr & 0x3f0000) ==
32955                                                    0x80000) ||
32956                                                   ((instr & 0x3f0000) ==
32957                                                    0x100000) ||
32958                                                   ((instr & 0x3f0000) ==
32959                                                    0x200000)) {
32960                                                 UnallocatedT32(instr);
32961                                                 return;
32962                                               }
32963                                               DataType dt =
32964                                                   Dt_imm6_4_Decode((instr >>
32965                                                                     19) &
32966                                                                        0x7,
32967                                                                    (instr >>
32968                                                                     28) &
32969                                                                        0x1);
32970                                               if (dt.Is(
32971                                                       kDataTypeValueInvalid)) {
32972                                                 UnallocatedT32(instr);
32973                                                 return;
32974                                               }
32975                                               if (((instr >> 12) & 1) != 0) {
32976                                                 UnallocatedT32(instr);
32977                                                 return;
32978                                               }
32979                                               unsigned rd =
32980                                                   ExtractQRegister(instr,
32981                                                                    22,
32982                                                                    12);
32983                                               unsigned rm =
32984                                                   ExtractDRegister(instr, 5, 0);
32985                                               uint32_t imm6 =
32986                                                   (instr >> 16) & 0x3f;
32987                                               uint32_t imm =
32988                                                   imm6 - dt.GetSize();
32989                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
32990                                               vshll(CurrentCond(),
32991                                                     dt,
32992                                                     QRegister(rd),
32993                                                     DRegister(rm),
32994                                                     imm);
32995                                               break;
32996                                             }
32997                                             case 0x000d0000: {
32998                                               // 0xef8d0a10
32999                                               if (((instr & 0x380000) == 0x0) ||
33000                                                   ((instr & 0x3f0000) ==
33001                                                    0x80000) ||
33002                                                   ((instr & 0x3f0000) ==
33003                                                    0x100000) ||
33004                                                   ((instr & 0x3f0000) ==
33005                                                    0x200000)) {
33006                                                 UnallocatedT32(instr);
33007                                                 return;
33008                                               }
33009                                               DataType dt =
33010                                                   Dt_imm6_4_Decode((instr >>
33011                                                                     19) &
33012                                                                        0x7,
33013                                                                    (instr >>
33014                                                                     28) &
33015                                                                        0x1);
33016                                               if (dt.Is(
33017                                                       kDataTypeValueInvalid)) {
33018                                                 UnallocatedT32(instr);
33019                                                 return;
33020                                               }
33021                                               if (((instr >> 12) & 1) != 0) {
33022                                                 UnallocatedT32(instr);
33023                                                 return;
33024                                               }
33025                                               unsigned rd =
33026                                                   ExtractQRegister(instr,
33027                                                                    22,
33028                                                                    12);
33029                                               unsigned rm =
33030                                                   ExtractDRegister(instr, 5, 0);
33031                                               uint32_t imm6 =
33032                                                   (instr >> 16) & 0x3f;
33033                                               uint32_t imm =
33034                                                   imm6 - dt.GetSize();
33035                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33036                                               vshll(CurrentCond(),
33037                                                     dt,
33038                                                     QRegister(rd),
33039                                                     DRegister(rm),
33040                                                     imm);
33041                                               break;
33042                                             }
33043                                             case 0x000e0000: {
33044                                               // 0xef8e0a10
33045                                               if (((instr & 0x380000) == 0x0) ||
33046                                                   ((instr & 0x3f0000) ==
33047                                                    0x80000) ||
33048                                                   ((instr & 0x3f0000) ==
33049                                                    0x100000) ||
33050                                                   ((instr & 0x3f0000) ==
33051                                                    0x200000)) {
33052                                                 UnallocatedT32(instr);
33053                                                 return;
33054                                               }
33055                                               DataType dt =
33056                                                   Dt_imm6_4_Decode((instr >>
33057                                                                     19) &
33058                                                                        0x7,
33059                                                                    (instr >>
33060                                                                     28) &
33061                                                                        0x1);
33062                                               if (dt.Is(
33063                                                       kDataTypeValueInvalid)) {
33064                                                 UnallocatedT32(instr);
33065                                                 return;
33066                                               }
33067                                               if (((instr >> 12) & 1) != 0) {
33068                                                 UnallocatedT32(instr);
33069                                                 return;
33070                                               }
33071                                               unsigned rd =
33072                                                   ExtractQRegister(instr,
33073                                                                    22,
33074                                                                    12);
33075                                               unsigned rm =
33076                                                   ExtractDRegister(instr, 5, 0);
33077                                               uint32_t imm6 =
33078                                                   (instr >> 16) & 0x3f;
33079                                               uint32_t imm =
33080                                                   imm6 - dt.GetSize();
33081                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33082                                               vshll(CurrentCond(),
33083                                                     dt,
33084                                                     QRegister(rd),
33085                                                     DRegister(rm),
33086                                                     imm);
33087                                               break;
33088                                             }
33089                                             case 0x000f0000: {
33090                                               // 0xef8f0a10
33091                                               if (((instr & 0x380000) == 0x0) ||
33092                                                   ((instr & 0x3f0000) ==
33093                                                    0x80000) ||
33094                                                   ((instr & 0x3f0000) ==
33095                                                    0x100000) ||
33096                                                   ((instr & 0x3f0000) ==
33097                                                    0x200000)) {
33098                                                 UnallocatedT32(instr);
33099                                                 return;
33100                                               }
33101                                               DataType dt =
33102                                                   Dt_imm6_4_Decode((instr >>
33103                                                                     19) &
33104                                                                        0x7,
33105                                                                    (instr >>
33106                                                                     28) &
33107                                                                        0x1);
33108                                               if (dt.Is(
33109                                                       kDataTypeValueInvalid)) {
33110                                                 UnallocatedT32(instr);
33111                                                 return;
33112                                               }
33113                                               if (((instr >> 12) & 1) != 0) {
33114                                                 UnallocatedT32(instr);
33115                                                 return;
33116                                               }
33117                                               unsigned rd =
33118                                                   ExtractQRegister(instr,
33119                                                                    22,
33120                                                                    12);
33121                                               unsigned rm =
33122                                                   ExtractDRegister(instr, 5, 0);
33123                                               uint32_t imm6 =
33124                                                   (instr >> 16) & 0x3f;
33125                                               uint32_t imm =
33126                                                   imm6 - dt.GetSize();
33127                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33128                                               vshll(CurrentCond(),
33129                                                     dt,
33130                                                     QRegister(rd),
33131                                                     DRegister(rm),
33132                                                     imm);
33133                                               break;
33134                                             }
33135                                             case 0x00100000: {
33136                                               // 0xef900a10
33137                                               if (((instr & 0x380000) == 0x0) ||
33138                                                   ((instr & 0x380000) ==
33139                                                    0x180000) ||
33140                                                   ((instr & 0x380000) ==
33141                                                    0x280000) ||
33142                                                   ((instr & 0x380000) ==
33143                                                    0x300000) ||
33144                                                   ((instr & 0x380000) ==
33145                                                    0x380000)) {
33146                                                 UnallocatedT32(instr);
33147                                                 return;
33148                                               }
33149                                               DataType dt = Dt_U_imm3H_1_Decode(
33150                                                   ((instr >> 19) & 0x7) |
33151                                                   ((instr >> 25) & 0x8));
33152                                               if (dt.Is(
33153                                                       kDataTypeValueInvalid)) {
33154                                                 UnallocatedT32(instr);
33155                                                 return;
33156                                               }
33157                                               if (((instr >> 12) & 1) != 0) {
33158                                                 UnallocatedT32(instr);
33159                                                 return;
33160                                               }
33161                                               unsigned rd =
33162                                                   ExtractQRegister(instr,
33163                                                                    22,
33164                                                                    12);
33165                                               unsigned rm =
33166                                                   ExtractDRegister(instr, 5, 0);
33167                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
33168                                               vmovl(CurrentCond(),
33169                                                     dt,
33170                                                     QRegister(rd),
33171                                                     DRegister(rm));
33172                                               break;
33173                                             }
33174                                             case 0x00110000: {
33175                                               // 0xef910a10
33176                                               if (((instr & 0x380000) == 0x0) ||
33177                                                   ((instr & 0x3f0000) ==
33178                                                    0x80000) ||
33179                                                   ((instr & 0x3f0000) ==
33180                                                    0x100000) ||
33181                                                   ((instr & 0x3f0000) ==
33182                                                    0x200000)) {
33183                                                 UnallocatedT32(instr);
33184                                                 return;
33185                                               }
33186                                               DataType dt =
33187                                                   Dt_imm6_4_Decode((instr >>
33188                                                                     19) &
33189                                                                        0x7,
33190                                                                    (instr >>
33191                                                                     28) &
33192                                                                        0x1);
33193                                               if (dt.Is(
33194                                                       kDataTypeValueInvalid)) {
33195                                                 UnallocatedT32(instr);
33196                                                 return;
33197                                               }
33198                                               if (((instr >> 12) & 1) != 0) {
33199                                                 UnallocatedT32(instr);
33200                                                 return;
33201                                               }
33202                                               unsigned rd =
33203                                                   ExtractQRegister(instr,
33204                                                                    22,
33205                                                                    12);
33206                                               unsigned rm =
33207                                                   ExtractDRegister(instr, 5, 0);
33208                                               uint32_t imm6 =
33209                                                   (instr >> 16) & 0x3f;
33210                                               uint32_t imm =
33211                                                   imm6 - dt.GetSize();
33212                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33213                                               vshll(CurrentCond(),
33214                                                     dt,
33215                                                     QRegister(rd),
33216                                                     DRegister(rm),
33217                                                     imm);
33218                                               break;
33219                                             }
33220                                             case 0x00120000: {
33221                                               // 0xef920a10
33222                                               if (((instr & 0x380000) == 0x0) ||
33223                                                   ((instr & 0x3f0000) ==
33224                                                    0x80000) ||
33225                                                   ((instr & 0x3f0000) ==
33226                                                    0x100000) ||
33227                                                   ((instr & 0x3f0000) ==
33228                                                    0x200000)) {
33229                                                 UnallocatedT32(instr);
33230                                                 return;
33231                                               }
33232                                               DataType dt =
33233                                                   Dt_imm6_4_Decode((instr >>
33234                                                                     19) &
33235                                                                        0x7,
33236                                                                    (instr >>
33237                                                                     28) &
33238                                                                        0x1);
33239                                               if (dt.Is(
33240                                                       kDataTypeValueInvalid)) {
33241                                                 UnallocatedT32(instr);
33242                                                 return;
33243                                               }
33244                                               if (((instr >> 12) & 1) != 0) {
33245                                                 UnallocatedT32(instr);
33246                                                 return;
33247                                               }
33248                                               unsigned rd =
33249                                                   ExtractQRegister(instr,
33250                                                                    22,
33251                                                                    12);
33252                                               unsigned rm =
33253                                                   ExtractDRegister(instr, 5, 0);
33254                                               uint32_t imm6 =
33255                                                   (instr >> 16) & 0x3f;
33256                                               uint32_t imm =
33257                                                   imm6 - dt.GetSize();
33258                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33259                                               vshll(CurrentCond(),
33260                                                     dt,
33261                                                     QRegister(rd),
33262                                                     DRegister(rm),
33263                                                     imm);
33264                                               break;
33265                                             }
33266                                             case 0x00130000: {
33267                                               // 0xef930a10
33268                                               if (((instr & 0x380000) == 0x0) ||
33269                                                   ((instr & 0x3f0000) ==
33270                                                    0x80000) ||
33271                                                   ((instr & 0x3f0000) ==
33272                                                    0x100000) ||
33273                                                   ((instr & 0x3f0000) ==
33274                                                    0x200000)) {
33275                                                 UnallocatedT32(instr);
33276                                                 return;
33277                                               }
33278                                               DataType dt =
33279                                                   Dt_imm6_4_Decode((instr >>
33280                                                                     19) &
33281                                                                        0x7,
33282                                                                    (instr >>
33283                                                                     28) &
33284                                                                        0x1);
33285                                               if (dt.Is(
33286                                                       kDataTypeValueInvalid)) {
33287                                                 UnallocatedT32(instr);
33288                                                 return;
33289                                               }
33290                                               if (((instr >> 12) & 1) != 0) {
33291                                                 UnallocatedT32(instr);
33292                                                 return;
33293                                               }
33294                                               unsigned rd =
33295                                                   ExtractQRegister(instr,
33296                                                                    22,
33297                                                                    12);
33298                                               unsigned rm =
33299                                                   ExtractDRegister(instr, 5, 0);
33300                                               uint32_t imm6 =
33301                                                   (instr >> 16) & 0x3f;
33302                                               uint32_t imm =
33303                                                   imm6 - dt.GetSize();
33304                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33305                                               vshll(CurrentCond(),
33306                                                     dt,
33307                                                     QRegister(rd),
33308                                                     DRegister(rm),
33309                                                     imm);
33310                                               break;
33311                                             }
33312                                             case 0x00140000: {
33313                                               // 0xef940a10
33314                                               if (((instr & 0x380000) == 0x0) ||
33315                                                   ((instr & 0x3f0000) ==
33316                                                    0x80000) ||
33317                                                   ((instr & 0x3f0000) ==
33318                                                    0x100000) ||
33319                                                   ((instr & 0x3f0000) ==
33320                                                    0x200000)) {
33321                                                 UnallocatedT32(instr);
33322                                                 return;
33323                                               }
33324                                               DataType dt =
33325                                                   Dt_imm6_4_Decode((instr >>
33326                                                                     19) &
33327                                                                        0x7,
33328                                                                    (instr >>
33329                                                                     28) &
33330                                                                        0x1);
33331                                               if (dt.Is(
33332                                                       kDataTypeValueInvalid)) {
33333                                                 UnallocatedT32(instr);
33334                                                 return;
33335                                               }
33336                                               if (((instr >> 12) & 1) != 0) {
33337                                                 UnallocatedT32(instr);
33338                                                 return;
33339                                               }
33340                                               unsigned rd =
33341                                                   ExtractQRegister(instr,
33342                                                                    22,
33343                                                                    12);
33344                                               unsigned rm =
33345                                                   ExtractDRegister(instr, 5, 0);
33346                                               uint32_t imm6 =
33347                                                   (instr >> 16) & 0x3f;
33348                                               uint32_t imm =
33349                                                   imm6 - dt.GetSize();
33350                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33351                                               vshll(CurrentCond(),
33352                                                     dt,
33353                                                     QRegister(rd),
33354                                                     DRegister(rm),
33355                                                     imm);
33356                                               break;
33357                                             }
33358                                             case 0x00150000: {
33359                                               // 0xef950a10
33360                                               if (((instr & 0x380000) == 0x0) ||
33361                                                   ((instr & 0x3f0000) ==
33362                                                    0x80000) ||
33363                                                   ((instr & 0x3f0000) ==
33364                                                    0x100000) ||
33365                                                   ((instr & 0x3f0000) ==
33366                                                    0x200000)) {
33367                                                 UnallocatedT32(instr);
33368                                                 return;
33369                                               }
33370                                               DataType dt =
33371                                                   Dt_imm6_4_Decode((instr >>
33372                                                                     19) &
33373                                                                        0x7,
33374                                                                    (instr >>
33375                                                                     28) &
33376                                                                        0x1);
33377                                               if (dt.Is(
33378                                                       kDataTypeValueInvalid)) {
33379                                                 UnallocatedT32(instr);
33380                                                 return;
33381                                               }
33382                                               if (((instr >> 12) & 1) != 0) {
33383                                                 UnallocatedT32(instr);
33384                                                 return;
33385                                               }
33386                                               unsigned rd =
33387                                                   ExtractQRegister(instr,
33388                                                                    22,
33389                                                                    12);
33390                                               unsigned rm =
33391                                                   ExtractDRegister(instr, 5, 0);
33392                                               uint32_t imm6 =
33393                                                   (instr >> 16) & 0x3f;
33394                                               uint32_t imm =
33395                                                   imm6 - dt.GetSize();
33396                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33397                                               vshll(CurrentCond(),
33398                                                     dt,
33399                                                     QRegister(rd),
33400                                                     DRegister(rm),
33401                                                     imm);
33402                                               break;
33403                                             }
33404                                             case 0x00160000: {
33405                                               // 0xef960a10
33406                                               if (((instr & 0x380000) == 0x0) ||
33407                                                   ((instr & 0x3f0000) ==
33408                                                    0x80000) ||
33409                                                   ((instr & 0x3f0000) ==
33410                                                    0x100000) ||
33411                                                   ((instr & 0x3f0000) ==
33412                                                    0x200000)) {
33413                                                 UnallocatedT32(instr);
33414                                                 return;
33415                                               }
33416                                               DataType dt =
33417                                                   Dt_imm6_4_Decode((instr >>
33418                                                                     19) &
33419                                                                        0x7,
33420                                                                    (instr >>
33421                                                                     28) &
33422                                                                        0x1);
33423                                               if (dt.Is(
33424                                                       kDataTypeValueInvalid)) {
33425                                                 UnallocatedT32(instr);
33426                                                 return;
33427                                               }
33428                                               if (((instr >> 12) & 1) != 0) {
33429                                                 UnallocatedT32(instr);
33430                                                 return;
33431                                               }
33432                                               unsigned rd =
33433                                                   ExtractQRegister(instr,
33434                                                                    22,
33435                                                                    12);
33436                                               unsigned rm =
33437                                                   ExtractDRegister(instr, 5, 0);
33438                                               uint32_t imm6 =
33439                                                   (instr >> 16) & 0x3f;
33440                                               uint32_t imm =
33441                                                   imm6 - dt.GetSize();
33442                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33443                                               vshll(CurrentCond(),
33444                                                     dt,
33445                                                     QRegister(rd),
33446                                                     DRegister(rm),
33447                                                     imm);
33448                                               break;
33449                                             }
33450                                             case 0x00170000: {
33451                                               // 0xef970a10
33452                                               if (((instr & 0x380000) == 0x0) ||
33453                                                   ((instr & 0x3f0000) ==
33454                                                    0x80000) ||
33455                                                   ((instr & 0x3f0000) ==
33456                                                    0x100000) ||
33457                                                   ((instr & 0x3f0000) ==
33458                                                    0x200000)) {
33459                                                 UnallocatedT32(instr);
33460                                                 return;
33461                                               }
33462                                               DataType dt =
33463                                                   Dt_imm6_4_Decode((instr >>
33464                                                                     19) &
33465                                                                        0x7,
33466                                                                    (instr >>
33467                                                                     28) &
33468                                                                        0x1);
33469                                               if (dt.Is(
33470                                                       kDataTypeValueInvalid)) {
33471                                                 UnallocatedT32(instr);
33472                                                 return;
33473                                               }
33474                                               if (((instr >> 12) & 1) != 0) {
33475                                                 UnallocatedT32(instr);
33476                                                 return;
33477                                               }
33478                                               unsigned rd =
33479                                                   ExtractQRegister(instr,
33480                                                                    22,
33481                                                                    12);
33482                                               unsigned rm =
33483                                                   ExtractDRegister(instr, 5, 0);
33484                                               uint32_t imm6 =
33485                                                   (instr >> 16) & 0x3f;
33486                                               uint32_t imm =
33487                                                   imm6 - dt.GetSize();
33488                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33489                                               vshll(CurrentCond(),
33490                                                     dt,
33491                                                     QRegister(rd),
33492                                                     DRegister(rm),
33493                                                     imm);
33494                                               break;
33495                                             }
33496                                             case 0x00180000: {
33497                                               // 0xef980a10
33498                                               if (((instr & 0x380000) == 0x0) ||
33499                                                   ((instr & 0x3f0000) ==
33500                                                    0x80000) ||
33501                                                   ((instr & 0x3f0000) ==
33502                                                    0x100000) ||
33503                                                   ((instr & 0x3f0000) ==
33504                                                    0x200000)) {
33505                                                 UnallocatedT32(instr);
33506                                                 return;
33507                                               }
33508                                               DataType dt =
33509                                                   Dt_imm6_4_Decode((instr >>
33510                                                                     19) &
33511                                                                        0x7,
33512                                                                    (instr >>
33513                                                                     28) &
33514                                                                        0x1);
33515                                               if (dt.Is(
33516                                                       kDataTypeValueInvalid)) {
33517                                                 UnallocatedT32(instr);
33518                                                 return;
33519                                               }
33520                                               if (((instr >> 12) & 1) != 0) {
33521                                                 UnallocatedT32(instr);
33522                                                 return;
33523                                               }
33524                                               unsigned rd =
33525                                                   ExtractQRegister(instr,
33526                                                                    22,
33527                                                                    12);
33528                                               unsigned rm =
33529                                                   ExtractDRegister(instr, 5, 0);
33530                                               uint32_t imm6 =
33531                                                   (instr >> 16) & 0x3f;
33532                                               uint32_t imm =
33533                                                   imm6 - dt.GetSize();
33534                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33535                                               vshll(CurrentCond(),
33536                                                     dt,
33537                                                     QRegister(rd),
33538                                                     DRegister(rm),
33539                                                     imm);
33540                                               break;
33541                                             }
33542                                             case 0x00190000: {
33543                                               // 0xef990a10
33544                                               if (((instr & 0x380000) == 0x0) ||
33545                                                   ((instr & 0x3f0000) ==
33546                                                    0x80000) ||
33547                                                   ((instr & 0x3f0000) ==
33548                                                    0x100000) ||
33549                                                   ((instr & 0x3f0000) ==
33550                                                    0x200000)) {
33551                                                 UnallocatedT32(instr);
33552                                                 return;
33553                                               }
33554                                               DataType dt =
33555                                                   Dt_imm6_4_Decode((instr >>
33556                                                                     19) &
33557                                                                        0x7,
33558                                                                    (instr >>
33559                                                                     28) &
33560                                                                        0x1);
33561                                               if (dt.Is(
33562                                                       kDataTypeValueInvalid)) {
33563                                                 UnallocatedT32(instr);
33564                                                 return;
33565                                               }
33566                                               if (((instr >> 12) & 1) != 0) {
33567                                                 UnallocatedT32(instr);
33568                                                 return;
33569                                               }
33570                                               unsigned rd =
33571                                                   ExtractQRegister(instr,
33572                                                                    22,
33573                                                                    12);
33574                                               unsigned rm =
33575                                                   ExtractDRegister(instr, 5, 0);
33576                                               uint32_t imm6 =
33577                                                   (instr >> 16) & 0x3f;
33578                                               uint32_t imm =
33579                                                   imm6 - dt.GetSize();
33580                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33581                                               vshll(CurrentCond(),
33582                                                     dt,
33583                                                     QRegister(rd),
33584                                                     DRegister(rm),
33585                                                     imm);
33586                                               break;
33587                                             }
33588                                             case 0x001a0000: {
33589                                               // 0xef9a0a10
33590                                               if (((instr & 0x380000) == 0x0) ||
33591                                                   ((instr & 0x3f0000) ==
33592                                                    0x80000) ||
33593                                                   ((instr & 0x3f0000) ==
33594                                                    0x100000) ||
33595                                                   ((instr & 0x3f0000) ==
33596                                                    0x200000)) {
33597                                                 UnallocatedT32(instr);
33598                                                 return;
33599                                               }
33600                                               DataType dt =
33601                                                   Dt_imm6_4_Decode((instr >>
33602                                                                     19) &
33603                                                                        0x7,
33604                                                                    (instr >>
33605                                                                     28) &
33606                                                                        0x1);
33607                                               if (dt.Is(
33608                                                       kDataTypeValueInvalid)) {
33609                                                 UnallocatedT32(instr);
33610                                                 return;
33611                                               }
33612                                               if (((instr >> 12) & 1) != 0) {
33613                                                 UnallocatedT32(instr);
33614                                                 return;
33615                                               }
33616                                               unsigned rd =
33617                                                   ExtractQRegister(instr,
33618                                                                    22,
33619                                                                    12);
33620                                               unsigned rm =
33621                                                   ExtractDRegister(instr, 5, 0);
33622                                               uint32_t imm6 =
33623                                                   (instr >> 16) & 0x3f;
33624                                               uint32_t imm =
33625                                                   imm6 - dt.GetSize();
33626                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33627                                               vshll(CurrentCond(),
33628                                                     dt,
33629                                                     QRegister(rd),
33630                                                     DRegister(rm),
33631                                                     imm);
33632                                               break;
33633                                             }
33634                                             case 0x001b0000: {
33635                                               // 0xef9b0a10
33636                                               if (((instr & 0x380000) == 0x0) ||
33637                                                   ((instr & 0x3f0000) ==
33638                                                    0x80000) ||
33639                                                   ((instr & 0x3f0000) ==
33640                                                    0x100000) ||
33641                                                   ((instr & 0x3f0000) ==
33642                                                    0x200000)) {
33643                                                 UnallocatedT32(instr);
33644                                                 return;
33645                                               }
33646                                               DataType dt =
33647                                                   Dt_imm6_4_Decode((instr >>
33648                                                                     19) &
33649                                                                        0x7,
33650                                                                    (instr >>
33651                                                                     28) &
33652                                                                        0x1);
33653                                               if (dt.Is(
33654                                                       kDataTypeValueInvalid)) {
33655                                                 UnallocatedT32(instr);
33656                                                 return;
33657                                               }
33658                                               if (((instr >> 12) & 1) != 0) {
33659                                                 UnallocatedT32(instr);
33660                                                 return;
33661                                               }
33662                                               unsigned rd =
33663                                                   ExtractQRegister(instr,
33664                                                                    22,
33665                                                                    12);
33666                                               unsigned rm =
33667                                                   ExtractDRegister(instr, 5, 0);
33668                                               uint32_t imm6 =
33669                                                   (instr >> 16) & 0x3f;
33670                                               uint32_t imm =
33671                                                   imm6 - dt.GetSize();
33672                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33673                                               vshll(CurrentCond(),
33674                                                     dt,
33675                                                     QRegister(rd),
33676                                                     DRegister(rm),
33677                                                     imm);
33678                                               break;
33679                                             }
33680                                             case 0x001c0000: {
33681                                               // 0xef9c0a10
33682                                               if (((instr & 0x380000) == 0x0) ||
33683                                                   ((instr & 0x3f0000) ==
33684                                                    0x80000) ||
33685                                                   ((instr & 0x3f0000) ==
33686                                                    0x100000) ||
33687                                                   ((instr & 0x3f0000) ==
33688                                                    0x200000)) {
33689                                                 UnallocatedT32(instr);
33690                                                 return;
33691                                               }
33692                                               DataType dt =
33693                                                   Dt_imm6_4_Decode((instr >>
33694                                                                     19) &
33695                                                                        0x7,
33696                                                                    (instr >>
33697                                                                     28) &
33698                                                                        0x1);
33699                                               if (dt.Is(
33700                                                       kDataTypeValueInvalid)) {
33701                                                 UnallocatedT32(instr);
33702                                                 return;
33703                                               }
33704                                               if (((instr >> 12) & 1) != 0) {
33705                                                 UnallocatedT32(instr);
33706                                                 return;
33707                                               }
33708                                               unsigned rd =
33709                                                   ExtractQRegister(instr,
33710                                                                    22,
33711                                                                    12);
33712                                               unsigned rm =
33713                                                   ExtractDRegister(instr, 5, 0);
33714                                               uint32_t imm6 =
33715                                                   (instr >> 16) & 0x3f;
33716                                               uint32_t imm =
33717                                                   imm6 - dt.GetSize();
33718                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33719                                               vshll(CurrentCond(),
33720                                                     dt,
33721                                                     QRegister(rd),
33722                                                     DRegister(rm),
33723                                                     imm);
33724                                               break;
33725                                             }
33726                                             case 0x001d0000: {
33727                                               // 0xef9d0a10
33728                                               if (((instr & 0x380000) == 0x0) ||
33729                                                   ((instr & 0x3f0000) ==
33730                                                    0x80000) ||
33731                                                   ((instr & 0x3f0000) ==
33732                                                    0x100000) ||
33733                                                   ((instr & 0x3f0000) ==
33734                                                    0x200000)) {
33735                                                 UnallocatedT32(instr);
33736                                                 return;
33737                                               }
33738                                               DataType dt =
33739                                                   Dt_imm6_4_Decode((instr >>
33740                                                                     19) &
33741                                                                        0x7,
33742                                                                    (instr >>
33743                                                                     28) &
33744                                                                        0x1);
33745                                               if (dt.Is(
33746                                                       kDataTypeValueInvalid)) {
33747                                                 UnallocatedT32(instr);
33748                                                 return;
33749                                               }
33750                                               if (((instr >> 12) & 1) != 0) {
33751                                                 UnallocatedT32(instr);
33752                                                 return;
33753                                               }
33754                                               unsigned rd =
33755                                                   ExtractQRegister(instr,
33756                                                                    22,
33757                                                                    12);
33758                                               unsigned rm =
33759                                                   ExtractDRegister(instr, 5, 0);
33760                                               uint32_t imm6 =
33761                                                   (instr >> 16) & 0x3f;
33762                                               uint32_t imm =
33763                                                   imm6 - dt.GetSize();
33764                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33765                                               vshll(CurrentCond(),
33766                                                     dt,
33767                                                     QRegister(rd),
33768                                                     DRegister(rm),
33769                                                     imm);
33770                                               break;
33771                                             }
33772                                             case 0x001e0000: {
33773                                               // 0xef9e0a10
33774                                               if (((instr & 0x380000) == 0x0) ||
33775                                                   ((instr & 0x3f0000) ==
33776                                                    0x80000) ||
33777                                                   ((instr & 0x3f0000) ==
33778                                                    0x100000) ||
33779                                                   ((instr & 0x3f0000) ==
33780                                                    0x200000)) {
33781                                                 UnallocatedT32(instr);
33782                                                 return;
33783                                               }
33784                                               DataType dt =
33785                                                   Dt_imm6_4_Decode((instr >>
33786                                                                     19) &
33787                                                                        0x7,
33788                                                                    (instr >>
33789                                                                     28) &
33790                                                                        0x1);
33791                                               if (dt.Is(
33792                                                       kDataTypeValueInvalid)) {
33793                                                 UnallocatedT32(instr);
33794                                                 return;
33795                                               }
33796                                               if (((instr >> 12) & 1) != 0) {
33797                                                 UnallocatedT32(instr);
33798                                                 return;
33799                                               }
33800                                               unsigned rd =
33801                                                   ExtractQRegister(instr,
33802                                                                    22,
33803                                                                    12);
33804                                               unsigned rm =
33805                                                   ExtractDRegister(instr, 5, 0);
33806                                               uint32_t imm6 =
33807                                                   (instr >> 16) & 0x3f;
33808                                               uint32_t imm =
33809                                                   imm6 - dt.GetSize();
33810                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33811                                               vshll(CurrentCond(),
33812                                                     dt,
33813                                                     QRegister(rd),
33814                                                     DRegister(rm),
33815                                                     imm);
33816                                               break;
33817                                             }
33818                                             case 0x001f0000: {
33819                                               // 0xef9f0a10
33820                                               if (((instr & 0x380000) == 0x0) ||
33821                                                   ((instr & 0x3f0000) ==
33822                                                    0x80000) ||
33823                                                   ((instr & 0x3f0000) ==
33824                                                    0x100000) ||
33825                                                   ((instr & 0x3f0000) ==
33826                                                    0x200000)) {
33827                                                 UnallocatedT32(instr);
33828                                                 return;
33829                                               }
33830                                               DataType dt =
33831                                                   Dt_imm6_4_Decode((instr >>
33832                                                                     19) &
33833                                                                        0x7,
33834                                                                    (instr >>
33835                                                                     28) &
33836                                                                        0x1);
33837                                               if (dt.Is(
33838                                                       kDataTypeValueInvalid)) {
33839                                                 UnallocatedT32(instr);
33840                                                 return;
33841                                               }
33842                                               if (((instr >> 12) & 1) != 0) {
33843                                                 UnallocatedT32(instr);
33844                                                 return;
33845                                               }
33846                                               unsigned rd =
33847                                                   ExtractQRegister(instr,
33848                                                                    22,
33849                                                                    12);
33850                                               unsigned rm =
33851                                                   ExtractDRegister(instr, 5, 0);
33852                                               uint32_t imm6 =
33853                                                   (instr >> 16) & 0x3f;
33854                                               uint32_t imm =
33855                                                   imm6 - dt.GetSize();
33856                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33857                                               vshll(CurrentCond(),
33858                                                     dt,
33859                                                     QRegister(rd),
33860                                                     DRegister(rm),
33861                                                     imm);
33862                                               break;
33863                                             }
33864                                             case 0x00200000: {
33865                                               // 0xefa00a10
33866                                               if (((instr & 0x380000) == 0x0) ||
33867                                                   ((instr & 0x380000) ==
33868                                                    0x180000) ||
33869                                                   ((instr & 0x380000) ==
33870                                                    0x280000) ||
33871                                                   ((instr & 0x380000) ==
33872                                                    0x300000) ||
33873                                                   ((instr & 0x380000) ==
33874                                                    0x380000)) {
33875                                                 UnallocatedT32(instr);
33876                                                 return;
33877                                               }
33878                                               DataType dt = Dt_U_imm3H_1_Decode(
33879                                                   ((instr >> 19) & 0x7) |
33880                                                   ((instr >> 25) & 0x8));
33881                                               if (dt.Is(
33882                                                       kDataTypeValueInvalid)) {
33883                                                 UnallocatedT32(instr);
33884                                                 return;
33885                                               }
33886                                               if (((instr >> 12) & 1) != 0) {
33887                                                 UnallocatedT32(instr);
33888                                                 return;
33889                                               }
33890                                               unsigned rd =
33891                                                   ExtractQRegister(instr,
33892                                                                    22,
33893                                                                    12);
33894                                               unsigned rm =
33895                                                   ExtractDRegister(instr, 5, 0);
33896                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
33897                                               vmovl(CurrentCond(),
33898                                                     dt,
33899                                                     QRegister(rd),
33900                                                     DRegister(rm));
33901                                               break;
33902                                             }
33903                                             case 0x00210000: {
33904                                               // 0xefa10a10
33905                                               if (((instr & 0x380000) == 0x0) ||
33906                                                   ((instr & 0x3f0000) ==
33907                                                    0x80000) ||
33908                                                   ((instr & 0x3f0000) ==
33909                                                    0x100000) ||
33910                                                   ((instr & 0x3f0000) ==
33911                                                    0x200000)) {
33912                                                 UnallocatedT32(instr);
33913                                                 return;
33914                                               }
33915                                               DataType dt =
33916                                                   Dt_imm6_4_Decode((instr >>
33917                                                                     19) &
33918                                                                        0x7,
33919                                                                    (instr >>
33920                                                                     28) &
33921                                                                        0x1);
33922                                               if (dt.Is(
33923                                                       kDataTypeValueInvalid)) {
33924                                                 UnallocatedT32(instr);
33925                                                 return;
33926                                               }
33927                                               if (((instr >> 12) & 1) != 0) {
33928                                                 UnallocatedT32(instr);
33929                                                 return;
33930                                               }
33931                                               unsigned rd =
33932                                                   ExtractQRegister(instr,
33933                                                                    22,
33934                                                                    12);
33935                                               unsigned rm =
33936                                                   ExtractDRegister(instr, 5, 0);
33937                                               uint32_t imm6 =
33938                                                   (instr >> 16) & 0x3f;
33939                                               uint32_t imm =
33940                                                   imm6 - dt.GetSize();
33941                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33942                                               vshll(CurrentCond(),
33943                                                     dt,
33944                                                     QRegister(rd),
33945                                                     DRegister(rm),
33946                                                     imm);
33947                                               break;
33948                                             }
33949                                             case 0x00220000: {
33950                                               // 0xefa20a10
33951                                               if (((instr & 0x380000) == 0x0) ||
33952                                                   ((instr & 0x3f0000) ==
33953                                                    0x80000) ||
33954                                                   ((instr & 0x3f0000) ==
33955                                                    0x100000) ||
33956                                                   ((instr & 0x3f0000) ==
33957                                                    0x200000)) {
33958                                                 UnallocatedT32(instr);
33959                                                 return;
33960                                               }
33961                                               DataType dt =
33962                                                   Dt_imm6_4_Decode((instr >>
33963                                                                     19) &
33964                                                                        0x7,
33965                                                                    (instr >>
33966                                                                     28) &
33967                                                                        0x1);
33968                                               if (dt.Is(
33969                                                       kDataTypeValueInvalid)) {
33970                                                 UnallocatedT32(instr);
33971                                                 return;
33972                                               }
33973                                               if (((instr >> 12) & 1) != 0) {
33974                                                 UnallocatedT32(instr);
33975                                                 return;
33976                                               }
33977                                               unsigned rd =
33978                                                   ExtractQRegister(instr,
33979                                                                    22,
33980                                                                    12);
33981                                               unsigned rm =
33982                                                   ExtractDRegister(instr, 5, 0);
33983                                               uint32_t imm6 =
33984                                                   (instr >> 16) & 0x3f;
33985                                               uint32_t imm =
33986                                                   imm6 - dt.GetSize();
33987                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
33988                                               vshll(CurrentCond(),
33989                                                     dt,
33990                                                     QRegister(rd),
33991                                                     DRegister(rm),
33992                                                     imm);
33993                                               break;
33994                                             }
33995                                             case 0x00230000: {
33996                                               // 0xefa30a10
33997                                               if (((instr & 0x380000) == 0x0) ||
33998                                                   ((instr & 0x3f0000) ==
33999                                                    0x80000) ||
34000                                                   ((instr & 0x3f0000) ==
34001                                                    0x100000) ||
34002                                                   ((instr & 0x3f0000) ==
34003                                                    0x200000)) {
34004                                                 UnallocatedT32(instr);
34005                                                 return;
34006                                               }
34007                                               DataType dt =
34008                                                   Dt_imm6_4_Decode((instr >>
34009                                                                     19) &
34010                                                                        0x7,
34011                                                                    (instr >>
34012                                                                     28) &
34013                                                                        0x1);
34014                                               if (dt.Is(
34015                                                       kDataTypeValueInvalid)) {
34016                                                 UnallocatedT32(instr);
34017                                                 return;
34018                                               }
34019                                               if (((instr >> 12) & 1) != 0) {
34020                                                 UnallocatedT32(instr);
34021                                                 return;
34022                                               }
34023                                               unsigned rd =
34024                                                   ExtractQRegister(instr,
34025                                                                    22,
34026                                                                    12);
34027                                               unsigned rm =
34028                                                   ExtractDRegister(instr, 5, 0);
34029                                               uint32_t imm6 =
34030                                                   (instr >> 16) & 0x3f;
34031                                               uint32_t imm =
34032                                                   imm6 - dt.GetSize();
34033                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34034                                               vshll(CurrentCond(),
34035                                                     dt,
34036                                                     QRegister(rd),
34037                                                     DRegister(rm),
34038                                                     imm);
34039                                               break;
34040                                             }
34041                                             case 0x00240000: {
34042                                               // 0xefa40a10
34043                                               if (((instr & 0x380000) == 0x0) ||
34044                                                   ((instr & 0x3f0000) ==
34045                                                    0x80000) ||
34046                                                   ((instr & 0x3f0000) ==
34047                                                    0x100000) ||
34048                                                   ((instr & 0x3f0000) ==
34049                                                    0x200000)) {
34050                                                 UnallocatedT32(instr);
34051                                                 return;
34052                                               }
34053                                               DataType dt =
34054                                                   Dt_imm6_4_Decode((instr >>
34055                                                                     19) &
34056                                                                        0x7,
34057                                                                    (instr >>
34058                                                                     28) &
34059                                                                        0x1);
34060                                               if (dt.Is(
34061                                                       kDataTypeValueInvalid)) {
34062                                                 UnallocatedT32(instr);
34063                                                 return;
34064                                               }
34065                                               if (((instr >> 12) & 1) != 0) {
34066                                                 UnallocatedT32(instr);
34067                                                 return;
34068                                               }
34069                                               unsigned rd =
34070                                                   ExtractQRegister(instr,
34071                                                                    22,
34072                                                                    12);
34073                                               unsigned rm =
34074                                                   ExtractDRegister(instr, 5, 0);
34075                                               uint32_t imm6 =
34076                                                   (instr >> 16) & 0x3f;
34077                                               uint32_t imm =
34078                                                   imm6 - dt.GetSize();
34079                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34080                                               vshll(CurrentCond(),
34081                                                     dt,
34082                                                     QRegister(rd),
34083                                                     DRegister(rm),
34084                                                     imm);
34085                                               break;
34086                                             }
34087                                             case 0x00250000: {
34088                                               // 0xefa50a10
34089                                               if (((instr & 0x380000) == 0x0) ||
34090                                                   ((instr & 0x3f0000) ==
34091                                                    0x80000) ||
34092                                                   ((instr & 0x3f0000) ==
34093                                                    0x100000) ||
34094                                                   ((instr & 0x3f0000) ==
34095                                                    0x200000)) {
34096                                                 UnallocatedT32(instr);
34097                                                 return;
34098                                               }
34099                                               DataType dt =
34100                                                   Dt_imm6_4_Decode((instr >>
34101                                                                     19) &
34102                                                                        0x7,
34103                                                                    (instr >>
34104                                                                     28) &
34105                                                                        0x1);
34106                                               if (dt.Is(
34107                                                       kDataTypeValueInvalid)) {
34108                                                 UnallocatedT32(instr);
34109                                                 return;
34110                                               }
34111                                               if (((instr >> 12) & 1) != 0) {
34112                                                 UnallocatedT32(instr);
34113                                                 return;
34114                                               }
34115                                               unsigned rd =
34116                                                   ExtractQRegister(instr,
34117                                                                    22,
34118                                                                    12);
34119                                               unsigned rm =
34120                                                   ExtractDRegister(instr, 5, 0);
34121                                               uint32_t imm6 =
34122                                                   (instr >> 16) & 0x3f;
34123                                               uint32_t imm =
34124                                                   imm6 - dt.GetSize();
34125                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34126                                               vshll(CurrentCond(),
34127                                                     dt,
34128                                                     QRegister(rd),
34129                                                     DRegister(rm),
34130                                                     imm);
34131                                               break;
34132                                             }
34133                                             case 0x00260000: {
34134                                               // 0xefa60a10
34135                                               if (((instr & 0x380000) == 0x0) ||
34136                                                   ((instr & 0x3f0000) ==
34137                                                    0x80000) ||
34138                                                   ((instr & 0x3f0000) ==
34139                                                    0x100000) ||
34140                                                   ((instr & 0x3f0000) ==
34141                                                    0x200000)) {
34142                                                 UnallocatedT32(instr);
34143                                                 return;
34144                                               }
34145                                               DataType dt =
34146                                                   Dt_imm6_4_Decode((instr >>
34147                                                                     19) &
34148                                                                        0x7,
34149                                                                    (instr >>
34150                                                                     28) &
34151                                                                        0x1);
34152                                               if (dt.Is(
34153                                                       kDataTypeValueInvalid)) {
34154                                                 UnallocatedT32(instr);
34155                                                 return;
34156                                               }
34157                                               if (((instr >> 12) & 1) != 0) {
34158                                                 UnallocatedT32(instr);
34159                                                 return;
34160                                               }
34161                                               unsigned rd =
34162                                                   ExtractQRegister(instr,
34163                                                                    22,
34164                                                                    12);
34165                                               unsigned rm =
34166                                                   ExtractDRegister(instr, 5, 0);
34167                                               uint32_t imm6 =
34168                                                   (instr >> 16) & 0x3f;
34169                                               uint32_t imm =
34170                                                   imm6 - dt.GetSize();
34171                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34172                                               vshll(CurrentCond(),
34173                                                     dt,
34174                                                     QRegister(rd),
34175                                                     DRegister(rm),
34176                                                     imm);
34177                                               break;
34178                                             }
34179                                             case 0x00270000: {
34180                                               // 0xefa70a10
34181                                               if (((instr & 0x380000) == 0x0) ||
34182                                                   ((instr & 0x3f0000) ==
34183                                                    0x80000) ||
34184                                                   ((instr & 0x3f0000) ==
34185                                                    0x100000) ||
34186                                                   ((instr & 0x3f0000) ==
34187                                                    0x200000)) {
34188                                                 UnallocatedT32(instr);
34189                                                 return;
34190                                               }
34191                                               DataType dt =
34192                                                   Dt_imm6_4_Decode((instr >>
34193                                                                     19) &
34194                                                                        0x7,
34195                                                                    (instr >>
34196                                                                     28) &
34197                                                                        0x1);
34198                                               if (dt.Is(
34199                                                       kDataTypeValueInvalid)) {
34200                                                 UnallocatedT32(instr);
34201                                                 return;
34202                                               }
34203                                               if (((instr >> 12) & 1) != 0) {
34204                                                 UnallocatedT32(instr);
34205                                                 return;
34206                                               }
34207                                               unsigned rd =
34208                                                   ExtractQRegister(instr,
34209                                                                    22,
34210                                                                    12);
34211                                               unsigned rm =
34212                                                   ExtractDRegister(instr, 5, 0);
34213                                               uint32_t imm6 =
34214                                                   (instr >> 16) & 0x3f;
34215                                               uint32_t imm =
34216                                                   imm6 - dt.GetSize();
34217                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34218                                               vshll(CurrentCond(),
34219                                                     dt,
34220                                                     QRegister(rd),
34221                                                     DRegister(rm),
34222                                                     imm);
34223                                               break;
34224                                             }
34225                                             case 0x00280000: {
34226                                               // 0xefa80a10
34227                                               if (((instr & 0x380000) == 0x0) ||
34228                                                   ((instr & 0x3f0000) ==
34229                                                    0x80000) ||
34230                                                   ((instr & 0x3f0000) ==
34231                                                    0x100000) ||
34232                                                   ((instr & 0x3f0000) ==
34233                                                    0x200000)) {
34234                                                 UnallocatedT32(instr);
34235                                                 return;
34236                                               }
34237                                               DataType dt =
34238                                                   Dt_imm6_4_Decode((instr >>
34239                                                                     19) &
34240                                                                        0x7,
34241                                                                    (instr >>
34242                                                                     28) &
34243                                                                        0x1);
34244                                               if (dt.Is(
34245                                                       kDataTypeValueInvalid)) {
34246                                                 UnallocatedT32(instr);
34247                                                 return;
34248                                               }
34249                                               if (((instr >> 12) & 1) != 0) {
34250                                                 UnallocatedT32(instr);
34251                                                 return;
34252                                               }
34253                                               unsigned rd =
34254                                                   ExtractQRegister(instr,
34255                                                                    22,
34256                                                                    12);
34257                                               unsigned rm =
34258                                                   ExtractDRegister(instr, 5, 0);
34259                                               uint32_t imm6 =
34260                                                   (instr >> 16) & 0x3f;
34261                                               uint32_t imm =
34262                                                   imm6 - dt.GetSize();
34263                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34264                                               vshll(CurrentCond(),
34265                                                     dt,
34266                                                     QRegister(rd),
34267                                                     DRegister(rm),
34268                                                     imm);
34269                                               break;
34270                                             }
34271                                             case 0x00290000: {
34272                                               // 0xefa90a10
34273                                               if (((instr & 0x380000) == 0x0) ||
34274                                                   ((instr & 0x3f0000) ==
34275                                                    0x80000) ||
34276                                                   ((instr & 0x3f0000) ==
34277                                                    0x100000) ||
34278                                                   ((instr & 0x3f0000) ==
34279                                                    0x200000)) {
34280                                                 UnallocatedT32(instr);
34281                                                 return;
34282                                               }
34283                                               DataType dt =
34284                                                   Dt_imm6_4_Decode((instr >>
34285                                                                     19) &
34286                                                                        0x7,
34287                                                                    (instr >>
34288                                                                     28) &
34289                                                                        0x1);
34290                                               if (dt.Is(
34291                                                       kDataTypeValueInvalid)) {
34292                                                 UnallocatedT32(instr);
34293                                                 return;
34294                                               }
34295                                               if (((instr >> 12) & 1) != 0) {
34296                                                 UnallocatedT32(instr);
34297                                                 return;
34298                                               }
34299                                               unsigned rd =
34300                                                   ExtractQRegister(instr,
34301                                                                    22,
34302                                                                    12);
34303                                               unsigned rm =
34304                                                   ExtractDRegister(instr, 5, 0);
34305                                               uint32_t imm6 =
34306                                                   (instr >> 16) & 0x3f;
34307                                               uint32_t imm =
34308                                                   imm6 - dt.GetSize();
34309                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34310                                               vshll(CurrentCond(),
34311                                                     dt,
34312                                                     QRegister(rd),
34313                                                     DRegister(rm),
34314                                                     imm);
34315                                               break;
34316                                             }
34317                                             case 0x002a0000: {
34318                                               // 0xefaa0a10
34319                                               if (((instr & 0x380000) == 0x0) ||
34320                                                   ((instr & 0x3f0000) ==
34321                                                    0x80000) ||
34322                                                   ((instr & 0x3f0000) ==
34323                                                    0x100000) ||
34324                                                   ((instr & 0x3f0000) ==
34325                                                    0x200000)) {
34326                                                 UnallocatedT32(instr);
34327                                                 return;
34328                                               }
34329                                               DataType dt =
34330                                                   Dt_imm6_4_Decode((instr >>
34331                                                                     19) &
34332                                                                        0x7,
34333                                                                    (instr >>
34334                                                                     28) &
34335                                                                        0x1);
34336                                               if (dt.Is(
34337                                                       kDataTypeValueInvalid)) {
34338                                                 UnallocatedT32(instr);
34339                                                 return;
34340                                               }
34341                                               if (((instr >> 12) & 1) != 0) {
34342                                                 UnallocatedT32(instr);
34343                                                 return;
34344                                               }
34345                                               unsigned rd =
34346                                                   ExtractQRegister(instr,
34347                                                                    22,
34348                                                                    12);
34349                                               unsigned rm =
34350                                                   ExtractDRegister(instr, 5, 0);
34351                                               uint32_t imm6 =
34352                                                   (instr >> 16) & 0x3f;
34353                                               uint32_t imm =
34354                                                   imm6 - dt.GetSize();
34355                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34356                                               vshll(CurrentCond(),
34357                                                     dt,
34358                                                     QRegister(rd),
34359                                                     DRegister(rm),
34360                                                     imm);
34361                                               break;
34362                                             }
34363                                             case 0x002b0000: {
34364                                               // 0xefab0a10
34365                                               if (((instr & 0x380000) == 0x0) ||
34366                                                   ((instr & 0x3f0000) ==
34367                                                    0x80000) ||
34368                                                   ((instr & 0x3f0000) ==
34369                                                    0x100000) ||
34370                                                   ((instr & 0x3f0000) ==
34371                                                    0x200000)) {
34372                                                 UnallocatedT32(instr);
34373                                                 return;
34374                                               }
34375                                               DataType dt =
34376                                                   Dt_imm6_4_Decode((instr >>
34377                                                                     19) &
34378                                                                        0x7,
34379                                                                    (instr >>
34380                                                                     28) &
34381                                                                        0x1);
34382                                               if (dt.Is(
34383                                                       kDataTypeValueInvalid)) {
34384                                                 UnallocatedT32(instr);
34385                                                 return;
34386                                               }
34387                                               if (((instr >> 12) & 1) != 0) {
34388                                                 UnallocatedT32(instr);
34389                                                 return;
34390                                               }
34391                                               unsigned rd =
34392                                                   ExtractQRegister(instr,
34393                                                                    22,
34394                                                                    12);
34395                                               unsigned rm =
34396                                                   ExtractDRegister(instr, 5, 0);
34397                                               uint32_t imm6 =
34398                                                   (instr >> 16) & 0x3f;
34399                                               uint32_t imm =
34400                                                   imm6 - dt.GetSize();
34401                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34402                                               vshll(CurrentCond(),
34403                                                     dt,
34404                                                     QRegister(rd),
34405                                                     DRegister(rm),
34406                                                     imm);
34407                                               break;
34408                                             }
34409                                             case 0x002c0000: {
34410                                               // 0xefac0a10
34411                                               if (((instr & 0x380000) == 0x0) ||
34412                                                   ((instr & 0x3f0000) ==
34413                                                    0x80000) ||
34414                                                   ((instr & 0x3f0000) ==
34415                                                    0x100000) ||
34416                                                   ((instr & 0x3f0000) ==
34417                                                    0x200000)) {
34418                                                 UnallocatedT32(instr);
34419                                                 return;
34420                                               }
34421                                               DataType dt =
34422                                                   Dt_imm6_4_Decode((instr >>
34423                                                                     19) &
34424                                                                        0x7,
34425                                                                    (instr >>
34426                                                                     28) &
34427                                                                        0x1);
34428                                               if (dt.Is(
34429                                                       kDataTypeValueInvalid)) {
34430                                                 UnallocatedT32(instr);
34431                                                 return;
34432                                               }
34433                                               if (((instr >> 12) & 1) != 0) {
34434                                                 UnallocatedT32(instr);
34435                                                 return;
34436                                               }
34437                                               unsigned rd =
34438                                                   ExtractQRegister(instr,
34439                                                                    22,
34440                                                                    12);
34441                                               unsigned rm =
34442                                                   ExtractDRegister(instr, 5, 0);
34443                                               uint32_t imm6 =
34444                                                   (instr >> 16) & 0x3f;
34445                                               uint32_t imm =
34446                                                   imm6 - dt.GetSize();
34447                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34448                                               vshll(CurrentCond(),
34449                                                     dt,
34450                                                     QRegister(rd),
34451                                                     DRegister(rm),
34452                                                     imm);
34453                                               break;
34454                                             }
34455                                             case 0x002d0000: {
34456                                               // 0xefad0a10
34457                                               if (((instr & 0x380000) == 0x0) ||
34458                                                   ((instr & 0x3f0000) ==
34459                                                    0x80000) ||
34460                                                   ((instr & 0x3f0000) ==
34461                                                    0x100000) ||
34462                                                   ((instr & 0x3f0000) ==
34463                                                    0x200000)) {
34464                                                 UnallocatedT32(instr);
34465                                                 return;
34466                                               }
34467                                               DataType dt =
34468                                                   Dt_imm6_4_Decode((instr >>
34469                                                                     19) &
34470                                                                        0x7,
34471                                                                    (instr >>
34472                                                                     28) &
34473                                                                        0x1);
34474                                               if (dt.Is(
34475                                                       kDataTypeValueInvalid)) {
34476                                                 UnallocatedT32(instr);
34477                                                 return;
34478                                               }
34479                                               if (((instr >> 12) & 1) != 0) {
34480                                                 UnallocatedT32(instr);
34481                                                 return;
34482                                               }
34483                                               unsigned rd =
34484                                                   ExtractQRegister(instr,
34485                                                                    22,
34486                                                                    12);
34487                                               unsigned rm =
34488                                                   ExtractDRegister(instr, 5, 0);
34489                                               uint32_t imm6 =
34490                                                   (instr >> 16) & 0x3f;
34491                                               uint32_t imm =
34492                                                   imm6 - dt.GetSize();
34493                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34494                                               vshll(CurrentCond(),
34495                                                     dt,
34496                                                     QRegister(rd),
34497                                                     DRegister(rm),
34498                                                     imm);
34499                                               break;
34500                                             }
34501                                             case 0x002e0000: {
34502                                               // 0xefae0a10
34503                                               if (((instr & 0x380000) == 0x0) ||
34504                                                   ((instr & 0x3f0000) ==
34505                                                    0x80000) ||
34506                                                   ((instr & 0x3f0000) ==
34507                                                    0x100000) ||
34508                                                   ((instr & 0x3f0000) ==
34509                                                    0x200000)) {
34510                                                 UnallocatedT32(instr);
34511                                                 return;
34512                                               }
34513                                               DataType dt =
34514                                                   Dt_imm6_4_Decode((instr >>
34515                                                                     19) &
34516                                                                        0x7,
34517                                                                    (instr >>
34518                                                                     28) &
34519                                                                        0x1);
34520                                               if (dt.Is(
34521                                                       kDataTypeValueInvalid)) {
34522                                                 UnallocatedT32(instr);
34523                                                 return;
34524                                               }
34525                                               if (((instr >> 12) & 1) != 0) {
34526                                                 UnallocatedT32(instr);
34527                                                 return;
34528                                               }
34529                                               unsigned rd =
34530                                                   ExtractQRegister(instr,
34531                                                                    22,
34532                                                                    12);
34533                                               unsigned rm =
34534                                                   ExtractDRegister(instr, 5, 0);
34535                                               uint32_t imm6 =
34536                                                   (instr >> 16) & 0x3f;
34537                                               uint32_t imm =
34538                                                   imm6 - dt.GetSize();
34539                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34540                                               vshll(CurrentCond(),
34541                                                     dt,
34542                                                     QRegister(rd),
34543                                                     DRegister(rm),
34544                                                     imm);
34545                                               break;
34546                                             }
34547                                             case 0x002f0000: {
34548                                               // 0xefaf0a10
34549                                               if (((instr & 0x380000) == 0x0) ||
34550                                                   ((instr & 0x3f0000) ==
34551                                                    0x80000) ||
34552                                                   ((instr & 0x3f0000) ==
34553                                                    0x100000) ||
34554                                                   ((instr & 0x3f0000) ==
34555                                                    0x200000)) {
34556                                                 UnallocatedT32(instr);
34557                                                 return;
34558                                               }
34559                                               DataType dt =
34560                                                   Dt_imm6_4_Decode((instr >>
34561                                                                     19) &
34562                                                                        0x7,
34563                                                                    (instr >>
34564                                                                     28) &
34565                                                                        0x1);
34566                                               if (dt.Is(
34567                                                       kDataTypeValueInvalid)) {
34568                                                 UnallocatedT32(instr);
34569                                                 return;
34570                                               }
34571                                               if (((instr >> 12) & 1) != 0) {
34572                                                 UnallocatedT32(instr);
34573                                                 return;
34574                                               }
34575                                               unsigned rd =
34576                                                   ExtractQRegister(instr,
34577                                                                    22,
34578                                                                    12);
34579                                               unsigned rm =
34580                                                   ExtractDRegister(instr, 5, 0);
34581                                               uint32_t imm6 =
34582                                                   (instr >> 16) & 0x3f;
34583                                               uint32_t imm =
34584                                                   imm6 - dt.GetSize();
34585                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34586                                               vshll(CurrentCond(),
34587                                                     dt,
34588                                                     QRegister(rd),
34589                                                     DRegister(rm),
34590                                                     imm);
34591                                               break;
34592                                             }
34593                                             case 0x00300000: {
34594                                               // 0xefb00a10
34595                                               if (((instr & 0x380000) == 0x0) ||
34596                                                   ((instr & 0x3f0000) ==
34597                                                    0x80000) ||
34598                                                   ((instr & 0x3f0000) ==
34599                                                    0x100000) ||
34600                                                   ((instr & 0x3f0000) ==
34601                                                    0x200000)) {
34602                                                 UnallocatedT32(instr);
34603                                                 return;
34604                                               }
34605                                               DataType dt =
34606                                                   Dt_imm6_4_Decode((instr >>
34607                                                                     19) &
34608                                                                        0x7,
34609                                                                    (instr >>
34610                                                                     28) &
34611                                                                        0x1);
34612                                               if (dt.Is(
34613                                                       kDataTypeValueInvalid)) {
34614                                                 UnallocatedT32(instr);
34615                                                 return;
34616                                               }
34617                                               if (((instr >> 12) & 1) != 0) {
34618                                                 UnallocatedT32(instr);
34619                                                 return;
34620                                               }
34621                                               unsigned rd =
34622                                                   ExtractQRegister(instr,
34623                                                                    22,
34624                                                                    12);
34625                                               unsigned rm =
34626                                                   ExtractDRegister(instr, 5, 0);
34627                                               uint32_t imm6 =
34628                                                   (instr >> 16) & 0x3f;
34629                                               uint32_t imm =
34630                                                   imm6 - dt.GetSize();
34631                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34632                                               vshll(CurrentCond(),
34633                                                     dt,
34634                                                     QRegister(rd),
34635                                                     DRegister(rm),
34636                                                     imm);
34637                                               break;
34638                                             }
34639                                             case 0x00310000: {
34640                                               // 0xefb10a10
34641                                               if (((instr & 0x380000) == 0x0) ||
34642                                                   ((instr & 0x3f0000) ==
34643                                                    0x80000) ||
34644                                                   ((instr & 0x3f0000) ==
34645                                                    0x100000) ||
34646                                                   ((instr & 0x3f0000) ==
34647                                                    0x200000)) {
34648                                                 UnallocatedT32(instr);
34649                                                 return;
34650                                               }
34651                                               DataType dt =
34652                                                   Dt_imm6_4_Decode((instr >>
34653                                                                     19) &
34654                                                                        0x7,
34655                                                                    (instr >>
34656                                                                     28) &
34657                                                                        0x1);
34658                                               if (dt.Is(
34659                                                       kDataTypeValueInvalid)) {
34660                                                 UnallocatedT32(instr);
34661                                                 return;
34662                                               }
34663                                               if (((instr >> 12) & 1) != 0) {
34664                                                 UnallocatedT32(instr);
34665                                                 return;
34666                                               }
34667                                               unsigned rd =
34668                                                   ExtractQRegister(instr,
34669                                                                    22,
34670                                                                    12);
34671                                               unsigned rm =
34672                                                   ExtractDRegister(instr, 5, 0);
34673                                               uint32_t imm6 =
34674                                                   (instr >> 16) & 0x3f;
34675                                               uint32_t imm =
34676                                                   imm6 - dt.GetSize();
34677                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34678                                               vshll(CurrentCond(),
34679                                                     dt,
34680                                                     QRegister(rd),
34681                                                     DRegister(rm),
34682                                                     imm);
34683                                               break;
34684                                             }
34685                                             case 0x00320000: {
34686                                               // 0xefb20a10
34687                                               if (((instr & 0x380000) == 0x0) ||
34688                                                   ((instr & 0x3f0000) ==
34689                                                    0x80000) ||
34690                                                   ((instr & 0x3f0000) ==
34691                                                    0x100000) ||
34692                                                   ((instr & 0x3f0000) ==
34693                                                    0x200000)) {
34694                                                 UnallocatedT32(instr);
34695                                                 return;
34696                                               }
34697                                               DataType dt =
34698                                                   Dt_imm6_4_Decode((instr >>
34699                                                                     19) &
34700                                                                        0x7,
34701                                                                    (instr >>
34702                                                                     28) &
34703                                                                        0x1);
34704                                               if (dt.Is(
34705                                                       kDataTypeValueInvalid)) {
34706                                                 UnallocatedT32(instr);
34707                                                 return;
34708                                               }
34709                                               if (((instr >> 12) & 1) != 0) {
34710                                                 UnallocatedT32(instr);
34711                                                 return;
34712                                               }
34713                                               unsigned rd =
34714                                                   ExtractQRegister(instr,
34715                                                                    22,
34716                                                                    12);
34717                                               unsigned rm =
34718                                                   ExtractDRegister(instr, 5, 0);
34719                                               uint32_t imm6 =
34720                                                   (instr >> 16) & 0x3f;
34721                                               uint32_t imm =
34722                                                   imm6 - dt.GetSize();
34723                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34724                                               vshll(CurrentCond(),
34725                                                     dt,
34726                                                     QRegister(rd),
34727                                                     DRegister(rm),
34728                                                     imm);
34729                                               break;
34730                                             }
34731                                             case 0x00330000: {
34732                                               // 0xefb30a10
34733                                               if (((instr & 0x380000) == 0x0) ||
34734                                                   ((instr & 0x3f0000) ==
34735                                                    0x80000) ||
34736                                                   ((instr & 0x3f0000) ==
34737                                                    0x100000) ||
34738                                                   ((instr & 0x3f0000) ==
34739                                                    0x200000)) {
34740                                                 UnallocatedT32(instr);
34741                                                 return;
34742                                               }
34743                                               DataType dt =
34744                                                   Dt_imm6_4_Decode((instr >>
34745                                                                     19) &
34746                                                                        0x7,
34747                                                                    (instr >>
34748                                                                     28) &
34749                                                                        0x1);
34750                                               if (dt.Is(
34751                                                       kDataTypeValueInvalid)) {
34752                                                 UnallocatedT32(instr);
34753                                                 return;
34754                                               }
34755                                               if (((instr >> 12) & 1) != 0) {
34756                                                 UnallocatedT32(instr);
34757                                                 return;
34758                                               }
34759                                               unsigned rd =
34760                                                   ExtractQRegister(instr,
34761                                                                    22,
34762                                                                    12);
34763                                               unsigned rm =
34764                                                   ExtractDRegister(instr, 5, 0);
34765                                               uint32_t imm6 =
34766                                                   (instr >> 16) & 0x3f;
34767                                               uint32_t imm =
34768                                                   imm6 - dt.GetSize();
34769                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34770                                               vshll(CurrentCond(),
34771                                                     dt,
34772                                                     QRegister(rd),
34773                                                     DRegister(rm),
34774                                                     imm);
34775                                               break;
34776                                             }
34777                                             case 0x00340000: {
34778                                               // 0xefb40a10
34779                                               if (((instr & 0x380000) == 0x0) ||
34780                                                   ((instr & 0x3f0000) ==
34781                                                    0x80000) ||
34782                                                   ((instr & 0x3f0000) ==
34783                                                    0x100000) ||
34784                                                   ((instr & 0x3f0000) ==
34785                                                    0x200000)) {
34786                                                 UnallocatedT32(instr);
34787                                                 return;
34788                                               }
34789                                               DataType dt =
34790                                                   Dt_imm6_4_Decode((instr >>
34791                                                                     19) &
34792                                                                        0x7,
34793                                                                    (instr >>
34794                                                                     28) &
34795                                                                        0x1);
34796                                               if (dt.Is(
34797                                                       kDataTypeValueInvalid)) {
34798                                                 UnallocatedT32(instr);
34799                                                 return;
34800                                               }
34801                                               if (((instr >> 12) & 1) != 0) {
34802                                                 UnallocatedT32(instr);
34803                                                 return;
34804                                               }
34805                                               unsigned rd =
34806                                                   ExtractQRegister(instr,
34807                                                                    22,
34808                                                                    12);
34809                                               unsigned rm =
34810                                                   ExtractDRegister(instr, 5, 0);
34811                                               uint32_t imm6 =
34812                                                   (instr >> 16) & 0x3f;
34813                                               uint32_t imm =
34814                                                   imm6 - dt.GetSize();
34815                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34816                                               vshll(CurrentCond(),
34817                                                     dt,
34818                                                     QRegister(rd),
34819                                                     DRegister(rm),
34820                                                     imm);
34821                                               break;
34822                                             }
34823                                             case 0x00350000: {
34824                                               // 0xefb50a10
34825                                               if (((instr & 0x380000) == 0x0) ||
34826                                                   ((instr & 0x3f0000) ==
34827                                                    0x80000) ||
34828                                                   ((instr & 0x3f0000) ==
34829                                                    0x100000) ||
34830                                                   ((instr & 0x3f0000) ==
34831                                                    0x200000)) {
34832                                                 UnallocatedT32(instr);
34833                                                 return;
34834                                               }
34835                                               DataType dt =
34836                                                   Dt_imm6_4_Decode((instr >>
34837                                                                     19) &
34838                                                                        0x7,
34839                                                                    (instr >>
34840                                                                     28) &
34841                                                                        0x1);
34842                                               if (dt.Is(
34843                                                       kDataTypeValueInvalid)) {
34844                                                 UnallocatedT32(instr);
34845                                                 return;
34846                                               }
34847                                               if (((instr >> 12) & 1) != 0) {
34848                                                 UnallocatedT32(instr);
34849                                                 return;
34850                                               }
34851                                               unsigned rd =
34852                                                   ExtractQRegister(instr,
34853                                                                    22,
34854                                                                    12);
34855                                               unsigned rm =
34856                                                   ExtractDRegister(instr, 5, 0);
34857                                               uint32_t imm6 =
34858                                                   (instr >> 16) & 0x3f;
34859                                               uint32_t imm =
34860                                                   imm6 - dt.GetSize();
34861                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34862                                               vshll(CurrentCond(),
34863                                                     dt,
34864                                                     QRegister(rd),
34865                                                     DRegister(rm),
34866                                                     imm);
34867                                               break;
34868                                             }
34869                                             case 0x00360000: {
34870                                               // 0xefb60a10
34871                                               if (((instr & 0x380000) == 0x0) ||
34872                                                   ((instr & 0x3f0000) ==
34873                                                    0x80000) ||
34874                                                   ((instr & 0x3f0000) ==
34875                                                    0x100000) ||
34876                                                   ((instr & 0x3f0000) ==
34877                                                    0x200000)) {
34878                                                 UnallocatedT32(instr);
34879                                                 return;
34880                                               }
34881                                               DataType dt =
34882                                                   Dt_imm6_4_Decode((instr >>
34883                                                                     19) &
34884                                                                        0x7,
34885                                                                    (instr >>
34886                                                                     28) &
34887                                                                        0x1);
34888                                               if (dt.Is(
34889                                                       kDataTypeValueInvalid)) {
34890                                                 UnallocatedT32(instr);
34891                                                 return;
34892                                               }
34893                                               if (((instr >> 12) & 1) != 0) {
34894                                                 UnallocatedT32(instr);
34895                                                 return;
34896                                               }
34897                                               unsigned rd =
34898                                                   ExtractQRegister(instr,
34899                                                                    22,
34900                                                                    12);
34901                                               unsigned rm =
34902                                                   ExtractDRegister(instr, 5, 0);
34903                                               uint32_t imm6 =
34904                                                   (instr >> 16) & 0x3f;
34905                                               uint32_t imm =
34906                                                   imm6 - dt.GetSize();
34907                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34908                                               vshll(CurrentCond(),
34909                                                     dt,
34910                                                     QRegister(rd),
34911                                                     DRegister(rm),
34912                                                     imm);
34913                                               break;
34914                                             }
34915                                             case 0x00370000: {
34916                                               // 0xefb70a10
34917                                               if (((instr & 0x380000) == 0x0) ||
34918                                                   ((instr & 0x3f0000) ==
34919                                                    0x80000) ||
34920                                                   ((instr & 0x3f0000) ==
34921                                                    0x100000) ||
34922                                                   ((instr & 0x3f0000) ==
34923                                                    0x200000)) {
34924                                                 UnallocatedT32(instr);
34925                                                 return;
34926                                               }
34927                                               DataType dt =
34928                                                   Dt_imm6_4_Decode((instr >>
34929                                                                     19) &
34930                                                                        0x7,
34931                                                                    (instr >>
34932                                                                     28) &
34933                                                                        0x1);
34934                                               if (dt.Is(
34935                                                       kDataTypeValueInvalid)) {
34936                                                 UnallocatedT32(instr);
34937                                                 return;
34938                                               }
34939                                               if (((instr >> 12) & 1) != 0) {
34940                                                 UnallocatedT32(instr);
34941                                                 return;
34942                                               }
34943                                               unsigned rd =
34944                                                   ExtractQRegister(instr,
34945                                                                    22,
34946                                                                    12);
34947                                               unsigned rm =
34948                                                   ExtractDRegister(instr, 5, 0);
34949                                               uint32_t imm6 =
34950                                                   (instr >> 16) & 0x3f;
34951                                               uint32_t imm =
34952                                                   imm6 - dt.GetSize();
34953                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
34954                                               vshll(CurrentCond(),
34955                                                     dt,
34956                                                     QRegister(rd),
34957                                                     DRegister(rm),
34958                                                     imm);
34959                                               break;
34960                                             }
34961                                             case 0x00380000: {
34962                                               // 0xefb80a10
34963                                               if (((instr & 0x380000) == 0x0) ||
34964                                                   ((instr & 0x3f0000) ==
34965                                                    0x80000) ||
34966                                                   ((instr & 0x3f0000) ==
34967                                                    0x100000) ||
34968                                                   ((instr & 0x3f0000) ==
34969                                                    0x200000)) {
34970                                                 UnallocatedT32(instr);
34971                                                 return;
34972                                               }
34973                                               DataType dt =
34974                                                   Dt_imm6_4_Decode((instr >>
34975                                                                     19) &
34976                                                                        0x7,
34977                                                                    (instr >>
34978                                                                     28) &
34979                                                                        0x1);
34980                                               if (dt.Is(
34981                                                       kDataTypeValueInvalid)) {
34982                                                 UnallocatedT32(instr);
34983                                                 return;
34984                                               }
34985                                               if (((instr >> 12) & 1) != 0) {
34986                                                 UnallocatedT32(instr);
34987                                                 return;
34988                                               }
34989                                               unsigned rd =
34990                                                   ExtractQRegister(instr,
34991                                                                    22,
34992                                                                    12);
34993                                               unsigned rm =
34994                                                   ExtractDRegister(instr, 5, 0);
34995                                               uint32_t imm6 =
34996                                                   (instr >> 16) & 0x3f;
34997                                               uint32_t imm =
34998                                                   imm6 - dt.GetSize();
34999                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35000                                               vshll(CurrentCond(),
35001                                                     dt,
35002                                                     QRegister(rd),
35003                                                     DRegister(rm),
35004                                                     imm);
35005                                               break;
35006                                             }
35007                                             case 0x00390000: {
35008                                               // 0xefb90a10
35009                                               if (((instr & 0x380000) == 0x0) ||
35010                                                   ((instr & 0x3f0000) ==
35011                                                    0x80000) ||
35012                                                   ((instr & 0x3f0000) ==
35013                                                    0x100000) ||
35014                                                   ((instr & 0x3f0000) ==
35015                                                    0x200000)) {
35016                                                 UnallocatedT32(instr);
35017                                                 return;
35018                                               }
35019                                               DataType dt =
35020                                                   Dt_imm6_4_Decode((instr >>
35021                                                                     19) &
35022                                                                        0x7,
35023                                                                    (instr >>
35024                                                                     28) &
35025                                                                        0x1);
35026                                               if (dt.Is(
35027                                                       kDataTypeValueInvalid)) {
35028                                                 UnallocatedT32(instr);
35029                                                 return;
35030                                               }
35031                                               if (((instr >> 12) & 1) != 0) {
35032                                                 UnallocatedT32(instr);
35033                                                 return;
35034                                               }
35035                                               unsigned rd =
35036                                                   ExtractQRegister(instr,
35037                                                                    22,
35038                                                                    12);
35039                                               unsigned rm =
35040                                                   ExtractDRegister(instr, 5, 0);
35041                                               uint32_t imm6 =
35042                                                   (instr >> 16) & 0x3f;
35043                                               uint32_t imm =
35044                                                   imm6 - dt.GetSize();
35045                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35046                                               vshll(CurrentCond(),
35047                                                     dt,
35048                                                     QRegister(rd),
35049                                                     DRegister(rm),
35050                                                     imm);
35051                                               break;
35052                                             }
35053                                             case 0x003a0000: {
35054                                               // 0xefba0a10
35055                                               if (((instr & 0x380000) == 0x0) ||
35056                                                   ((instr & 0x3f0000) ==
35057                                                    0x80000) ||
35058                                                   ((instr & 0x3f0000) ==
35059                                                    0x100000) ||
35060                                                   ((instr & 0x3f0000) ==
35061                                                    0x200000)) {
35062                                                 UnallocatedT32(instr);
35063                                                 return;
35064                                               }
35065                                               DataType dt =
35066                                                   Dt_imm6_4_Decode((instr >>
35067                                                                     19) &
35068                                                                        0x7,
35069                                                                    (instr >>
35070                                                                     28) &
35071                                                                        0x1);
35072                                               if (dt.Is(
35073                                                       kDataTypeValueInvalid)) {
35074                                                 UnallocatedT32(instr);
35075                                                 return;
35076                                               }
35077                                               if (((instr >> 12) & 1) != 0) {
35078                                                 UnallocatedT32(instr);
35079                                                 return;
35080                                               }
35081                                               unsigned rd =
35082                                                   ExtractQRegister(instr,
35083                                                                    22,
35084                                                                    12);
35085                                               unsigned rm =
35086                                                   ExtractDRegister(instr, 5, 0);
35087                                               uint32_t imm6 =
35088                                                   (instr >> 16) & 0x3f;
35089                                               uint32_t imm =
35090                                                   imm6 - dt.GetSize();
35091                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35092                                               vshll(CurrentCond(),
35093                                                     dt,
35094                                                     QRegister(rd),
35095                                                     DRegister(rm),
35096                                                     imm);
35097                                               break;
35098                                             }
35099                                             case 0x003b0000: {
35100                                               // 0xefbb0a10
35101                                               if (((instr & 0x380000) == 0x0) ||
35102                                                   ((instr & 0x3f0000) ==
35103                                                    0x80000) ||
35104                                                   ((instr & 0x3f0000) ==
35105                                                    0x100000) ||
35106                                                   ((instr & 0x3f0000) ==
35107                                                    0x200000)) {
35108                                                 UnallocatedT32(instr);
35109                                                 return;
35110                                               }
35111                                               DataType dt =
35112                                                   Dt_imm6_4_Decode((instr >>
35113                                                                     19) &
35114                                                                        0x7,
35115                                                                    (instr >>
35116                                                                     28) &
35117                                                                        0x1);
35118                                               if (dt.Is(
35119                                                       kDataTypeValueInvalid)) {
35120                                                 UnallocatedT32(instr);
35121                                                 return;
35122                                               }
35123                                               if (((instr >> 12) & 1) != 0) {
35124                                                 UnallocatedT32(instr);
35125                                                 return;
35126                                               }
35127                                               unsigned rd =
35128                                                   ExtractQRegister(instr,
35129                                                                    22,
35130                                                                    12);
35131                                               unsigned rm =
35132                                                   ExtractDRegister(instr, 5, 0);
35133                                               uint32_t imm6 =
35134                                                   (instr >> 16) & 0x3f;
35135                                               uint32_t imm =
35136                                                   imm6 - dt.GetSize();
35137                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35138                                               vshll(CurrentCond(),
35139                                                     dt,
35140                                                     QRegister(rd),
35141                                                     DRegister(rm),
35142                                                     imm);
35143                                               break;
35144                                             }
35145                                             case 0x003c0000: {
35146                                               // 0xefbc0a10
35147                                               if (((instr & 0x380000) == 0x0) ||
35148                                                   ((instr & 0x3f0000) ==
35149                                                    0x80000) ||
35150                                                   ((instr & 0x3f0000) ==
35151                                                    0x100000) ||
35152                                                   ((instr & 0x3f0000) ==
35153                                                    0x200000)) {
35154                                                 UnallocatedT32(instr);
35155                                                 return;
35156                                               }
35157                                               DataType dt =
35158                                                   Dt_imm6_4_Decode((instr >>
35159                                                                     19) &
35160                                                                        0x7,
35161                                                                    (instr >>
35162                                                                     28) &
35163                                                                        0x1);
35164                                               if (dt.Is(
35165                                                       kDataTypeValueInvalid)) {
35166                                                 UnallocatedT32(instr);
35167                                                 return;
35168                                               }
35169                                               if (((instr >> 12) & 1) != 0) {
35170                                                 UnallocatedT32(instr);
35171                                                 return;
35172                                               }
35173                                               unsigned rd =
35174                                                   ExtractQRegister(instr,
35175                                                                    22,
35176                                                                    12);
35177                                               unsigned rm =
35178                                                   ExtractDRegister(instr, 5, 0);
35179                                               uint32_t imm6 =
35180                                                   (instr >> 16) & 0x3f;
35181                                               uint32_t imm =
35182                                                   imm6 - dt.GetSize();
35183                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35184                                               vshll(CurrentCond(),
35185                                                     dt,
35186                                                     QRegister(rd),
35187                                                     DRegister(rm),
35188                                                     imm);
35189                                               break;
35190                                             }
35191                                             case 0x003d0000: {
35192                                               // 0xefbd0a10
35193                                               if (((instr & 0x380000) == 0x0) ||
35194                                                   ((instr & 0x3f0000) ==
35195                                                    0x80000) ||
35196                                                   ((instr & 0x3f0000) ==
35197                                                    0x100000) ||
35198                                                   ((instr & 0x3f0000) ==
35199                                                    0x200000)) {
35200                                                 UnallocatedT32(instr);
35201                                                 return;
35202                                               }
35203                                               DataType dt =
35204                                                   Dt_imm6_4_Decode((instr >>
35205                                                                     19) &
35206                                                                        0x7,
35207                                                                    (instr >>
35208                                                                     28) &
35209                                                                        0x1);
35210                                               if (dt.Is(
35211                                                       kDataTypeValueInvalid)) {
35212                                                 UnallocatedT32(instr);
35213                                                 return;
35214                                               }
35215                                               if (((instr >> 12) & 1) != 0) {
35216                                                 UnallocatedT32(instr);
35217                                                 return;
35218                                               }
35219                                               unsigned rd =
35220                                                   ExtractQRegister(instr,
35221                                                                    22,
35222                                                                    12);
35223                                               unsigned rm =
35224                                                   ExtractDRegister(instr, 5, 0);
35225                                               uint32_t imm6 =
35226                                                   (instr >> 16) & 0x3f;
35227                                               uint32_t imm =
35228                                                   imm6 - dt.GetSize();
35229                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35230                                               vshll(CurrentCond(),
35231                                                     dt,
35232                                                     QRegister(rd),
35233                                                     DRegister(rm),
35234                                                     imm);
35235                                               break;
35236                                             }
35237                                             case 0x003e0000: {
35238                                               // 0xefbe0a10
35239                                               if (((instr & 0x380000) == 0x0) ||
35240                                                   ((instr & 0x3f0000) ==
35241                                                    0x80000) ||
35242                                                   ((instr & 0x3f0000) ==
35243                                                    0x100000) ||
35244                                                   ((instr & 0x3f0000) ==
35245                                                    0x200000)) {
35246                                                 UnallocatedT32(instr);
35247                                                 return;
35248                                               }
35249                                               DataType dt =
35250                                                   Dt_imm6_4_Decode((instr >>
35251                                                                     19) &
35252                                                                        0x7,
35253                                                                    (instr >>
35254                                                                     28) &
35255                                                                        0x1);
35256                                               if (dt.Is(
35257                                                       kDataTypeValueInvalid)) {
35258                                                 UnallocatedT32(instr);
35259                                                 return;
35260                                               }
35261                                               if (((instr >> 12) & 1) != 0) {
35262                                                 UnallocatedT32(instr);
35263                                                 return;
35264                                               }
35265                                               unsigned rd =
35266                                                   ExtractQRegister(instr,
35267                                                                    22,
35268                                                                    12);
35269                                               unsigned rm =
35270                                                   ExtractDRegister(instr, 5, 0);
35271                                               uint32_t imm6 =
35272                                                   (instr >> 16) & 0x3f;
35273                                               uint32_t imm =
35274                                                   imm6 - dt.GetSize();
35275                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35276                                               vshll(CurrentCond(),
35277                                                     dt,
35278                                                     QRegister(rd),
35279                                                     DRegister(rm),
35280                                                     imm);
35281                                               break;
35282                                             }
35283                                             case 0x003f0000: {
35284                                               // 0xefbf0a10
35285                                               if (((instr & 0x380000) == 0x0) ||
35286                                                   ((instr & 0x3f0000) ==
35287                                                    0x80000) ||
35288                                                   ((instr & 0x3f0000) ==
35289                                                    0x100000) ||
35290                                                   ((instr & 0x3f0000) ==
35291                                                    0x200000)) {
35292                                                 UnallocatedT32(instr);
35293                                                 return;
35294                                               }
35295                                               DataType dt =
35296                                                   Dt_imm6_4_Decode((instr >>
35297                                                                     19) &
35298                                                                        0x7,
35299                                                                    (instr >>
35300                                                                     28) &
35301                                                                        0x1);
35302                                               if (dt.Is(
35303                                                       kDataTypeValueInvalid)) {
35304                                                 UnallocatedT32(instr);
35305                                                 return;
35306                                               }
35307                                               if (((instr >> 12) & 1) != 0) {
35308                                                 UnallocatedT32(instr);
35309                                                 return;
35310                                               }
35311                                               unsigned rd =
35312                                                   ExtractQRegister(instr,
35313                                                                    22,
35314                                                                    12);
35315                                               unsigned rm =
35316                                                   ExtractDRegister(instr, 5, 0);
35317                                               uint32_t imm6 =
35318                                                   (instr >> 16) & 0x3f;
35319                                               uint32_t imm =
35320                                                   imm6 - dt.GetSize();
35321                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35322                                               vshll(CurrentCond(),
35323                                                     dt,
35324                                                     QRegister(rd),
35325                                                     DRegister(rm),
35326                                                     imm);
35327                                               break;
35328                                             }
35329                                             default:
35330                                               UnallocatedT32(instr);
35331                                               break;
35332                                           }
35333                                           break;
35334                                         }
35335                                         default: {
35336                                           if (((instr & 0x380000) == 0x0) ||
35337                                               ((instr & 0x3f0000) == 0x80000) ||
35338                                               ((instr & 0x3f0000) ==
35339                                                0x100000) ||
35340                                               ((instr & 0x3f0000) ==
35341                                                0x200000)) {
35342                                             UnallocatedT32(instr);
35343                                             return;
35344                                           }
35345                                           DataType dt =
35346                                               Dt_imm6_4_Decode((instr >> 19) &
35347                                                                    0x7,
35348                                                                (instr >> 28) &
35349                                                                    0x1);
35350                                           if (dt.Is(kDataTypeValueInvalid)) {
35351                                             UnallocatedT32(instr);
35352                                             return;
35353                                           }
35354                                           if (((instr >> 12) & 1) != 0) {
35355                                             UnallocatedT32(instr);
35356                                             return;
35357                                           }
35358                                           unsigned rd =
35359                                               ExtractQRegister(instr, 22, 12);
35360                                           unsigned rm =
35361                                               ExtractDRegister(instr, 5, 0);
35362                                           uint32_t imm6 = (instr >> 16) & 0x3f;
35363                                           uint32_t imm = imm6 - dt.GetSize();
35364                                           // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
35365                                           vshll(CurrentCond(),
35366                                                 dt,
35367                                                 QRegister(rd),
35368                                                 DRegister(rm),
35369                                                 imm);
35370                                           break;
35371                                         }
35372                                       }
35373                                       break;
35374                                     }
35375                                     default:
35376                                       UnallocatedT32(instr);
35377                                       break;
35378                                   }
35379                                   break;
35380                                 }
35381                               }
35382                               break;
35383                             }
35384                             default:
35385                               UnallocatedT32(instr);
35386                               break;
35387                           }
35388                           break;
35389                         }
35390                         case 0x00000c00: {
35391                           // 0xef800c10
35392                           switch (instr & 0x00000080) {
35393                             case 0x00000000: {
35394                               // 0xef800c10
35395                               switch (instr & 0x00200000) {
35396                                 case 0x00000000: {
35397                                   // 0xef800c10
35398                                   switch (instr & 0x00180000) {
35399                                     case 0x00000000: {
35400                                       // 0xef800c10
35401                                       switch (instr & 0x00000300) {
35402                                         case 0x00000200: {
35403                                           // 0xef800e10
35404                                           if (((instr & 0x920) == 0x100) ||
35405                                               ((instr & 0x520) == 0x100) ||
35406                                               ((instr & 0x820) == 0x20) ||
35407                                               ((instr & 0x420) == 0x20) ||
35408                                               ((instr & 0x220) == 0x20) ||
35409                                               ((instr & 0x120) == 0x120)) {
35410                                             UnallocatedT32(instr);
35411                                             return;
35412                                           }
35413                                           unsigned cmode =
35414                                               ((instr >> 8) & 0xf) |
35415                                               ((instr >> 1) & 0x10);
35416                                           DataType dt =
35417                                               ImmediateVmov::DecodeDt(cmode);
35418                                           if (dt.Is(kDataTypeValueInvalid)) {
35419                                             UnallocatedT32(instr);
35420                                             return;
35421                                           }
35422                                           unsigned rd =
35423                                               ExtractDRegister(instr, 22, 12);
35424                                           DOperand imm =
35425                                               ImmediateVmov::DecodeImmediate(
35426                                                   cmode,
35427                                                   (instr & 0xf) |
35428                                                       ((instr >> 12) & 0x70) |
35429                                                       ((instr >> 21) & 0x80));
35430                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35431                                           vmov(CurrentCond(),
35432                                                dt,
35433                                                DRegister(rd),
35434                                                imm);
35435                                           break;
35436                                         }
35437                                         case 0x00000300: {
35438                                           // 0xef800f10
35439                                           if (((instr & 0x920) == 0x100) ||
35440                                               ((instr & 0x520) == 0x100) ||
35441                                               ((instr & 0x820) == 0x20) ||
35442                                               ((instr & 0x420) == 0x20) ||
35443                                               ((instr & 0x220) == 0x20) ||
35444                                               ((instr & 0x120) == 0x120)) {
35445                                             UnallocatedT32(instr);
35446                                             return;
35447                                           }
35448                                           unsigned cmode =
35449                                               ((instr >> 8) & 0xf) |
35450                                               ((instr >> 1) & 0x10);
35451                                           DataType dt =
35452                                               ImmediateVmov::DecodeDt(cmode);
35453                                           if (dt.Is(kDataTypeValueInvalid)) {
35454                                             UnallocatedT32(instr);
35455                                             return;
35456                                           }
35457                                           unsigned rd =
35458                                               ExtractDRegister(instr, 22, 12);
35459                                           DOperand imm =
35460                                               ImmediateVmov::DecodeImmediate(
35461                                                   cmode,
35462                                                   (instr & 0xf) |
35463                                                       ((instr >> 12) & 0x70) |
35464                                                       ((instr >> 21) & 0x80));
35465                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35466                                           vmov(CurrentCond(),
35467                                                dt,
35468                                                DRegister(rd),
35469                                                imm);
35470                                           break;
35471                                         }
35472                                         default: {
35473                                           switch (instr & 0x00000020) {
35474                                             case 0x00000020: {
35475                                               // 0xef800c30
35476                                               switch (instr & 0x00000f20) {
35477                                                 case 0x00000000: {
35478                                                   // 0xef800c10
35479                                                   if (((instr & 0x920) ==
35480                                                        0x100) ||
35481                                                       ((instr & 0x520) ==
35482                                                        0x100) ||
35483                                                       ((instr & 0x820) ==
35484                                                        0x20) ||
35485                                                       ((instr & 0x420) ==
35486                                                        0x20) ||
35487                                                       ((instr & 0x220) ==
35488                                                        0x20) ||
35489                                                       ((instr & 0x120) ==
35490                                                        0x120)) {
35491                                                     UnallocatedT32(instr);
35492                                                     return;
35493                                                   }
35494                                                   unsigned cmode =
35495                                                       ((instr >> 8) & 0xf) |
35496                                                       ((instr >> 1) & 0x10);
35497                                                   DataType dt =
35498                                                       ImmediateVmov::DecodeDt(
35499                                                           cmode);
35500                                                   if (dt.Is(
35501                                                           kDataTypeValueInvalid)) {
35502                                                     UnallocatedT32(instr);
35503                                                     return;
35504                                                   }
35505                                                   unsigned rd =
35506                                                       ExtractDRegister(instr,
35507                                                                        22,
35508                                                                        12);
35509                                                   DOperand imm = ImmediateVmov::
35510                                                       DecodeImmediate(
35511                                                           cmode,
35512                                                           (instr & 0xf) |
35513                                                               ((instr >> 12) &
35514                                                                0x70) |
35515                                                               ((instr >> 21) &
35516                                                                0x80));
35517                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35518                                                   vmov(CurrentCond(),
35519                                                        dt,
35520                                                        DRegister(rd),
35521                                                        imm);
35522                                                   break;
35523                                                 }
35524                                                 case 0x00000020: {
35525                                                   // 0xef800c30
35526                                                   if (((instr & 0xd00) ==
35527                                                        0x100) ||
35528                                                       ((instr & 0xd00) ==
35529                                                        0x500) ||
35530                                                       ((instr & 0xd00) ==
35531                                                        0x900) ||
35532                                                       ((instr & 0xe00) ==
35533                                                        0xe00)) {
35534                                                     UnallocatedT32(instr);
35535                                                     return;
35536                                                   }
35537                                                   unsigned cmode =
35538                                                       (instr >> 8) & 0xf;
35539                                                   DataType dt =
35540                                                       ImmediateVmvn::DecodeDt(
35541                                                           cmode);
35542                                                   if (dt.Is(
35543                                                           kDataTypeValueInvalid)) {
35544                                                     UnallocatedT32(instr);
35545                                                     return;
35546                                                   }
35547                                                   unsigned rd =
35548                                                       ExtractDRegister(instr,
35549                                                                        22,
35550                                                                        12);
35551                                                   DOperand imm = ImmediateVmvn::
35552                                                       DecodeImmediate(
35553                                                           cmode,
35554                                                           (instr & 0xf) |
35555                                                               ((instr >> 12) &
35556                                                                0x70) |
35557                                                               ((instr >> 21) &
35558                                                                0x80));
35559                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35560                                                   vmvn(CurrentCond(),
35561                                                        dt,
35562                                                        DRegister(rd),
35563                                                        imm);
35564                                                   break;
35565                                                 }
35566                                                 case 0x00000200: {
35567                                                   // 0xef800e10
35568                                                   if (((instr & 0x920) ==
35569                                                        0x100) ||
35570                                                       ((instr & 0x520) ==
35571                                                        0x100) ||
35572                                                       ((instr & 0x820) ==
35573                                                        0x20) ||
35574                                                       ((instr & 0x420) ==
35575                                                        0x20) ||
35576                                                       ((instr & 0x220) ==
35577                                                        0x20) ||
35578                                                       ((instr & 0x120) ==
35579                                                        0x120)) {
35580                                                     UnallocatedT32(instr);
35581                                                     return;
35582                                                   }
35583                                                   unsigned cmode =
35584                                                       ((instr >> 8) & 0xf) |
35585                                                       ((instr >> 1) & 0x10);
35586                                                   DataType dt =
35587                                                       ImmediateVmov::DecodeDt(
35588                                                           cmode);
35589                                                   if (dt.Is(
35590                                                           kDataTypeValueInvalid)) {
35591                                                     UnallocatedT32(instr);
35592                                                     return;
35593                                                   }
35594                                                   unsigned rd =
35595                                                       ExtractDRegister(instr,
35596                                                                        22,
35597                                                                        12);
35598                                                   DOperand imm = ImmediateVmov::
35599                                                       DecodeImmediate(
35600                                                           cmode,
35601                                                           (instr & 0xf) |
35602                                                               ((instr >> 12) &
35603                                                                0x70) |
35604                                                               ((instr >> 21) &
35605                                                                0x80));
35606                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35607                                                   vmov(CurrentCond(),
35608                                                        dt,
35609                                                        DRegister(rd),
35610                                                        imm);
35611                                                   break;
35612                                                 }
35613                                                 case 0x00000220: {
35614                                                   // 0xef800e30
35615                                                   if (((instr & 0xd00) ==
35616                                                        0x100) ||
35617                                                       ((instr & 0xd00) ==
35618                                                        0x500) ||
35619                                                       ((instr & 0xd00) ==
35620                                                        0x900) ||
35621                                                       ((instr & 0xe00) ==
35622                                                        0xe00)) {
35623                                                     UnallocatedT32(instr);
35624                                                     return;
35625                                                   }
35626                                                   unsigned cmode =
35627                                                       (instr >> 8) & 0xf;
35628                                                   DataType dt =
35629                                                       ImmediateVmvn::DecodeDt(
35630                                                           cmode);
35631                                                   if (dt.Is(
35632                                                           kDataTypeValueInvalid)) {
35633                                                     UnallocatedT32(instr);
35634                                                     return;
35635                                                   }
35636                                                   unsigned rd =
35637                                                       ExtractDRegister(instr,
35638                                                                        22,
35639                                                                        12);
35640                                                   DOperand imm = ImmediateVmvn::
35641                                                       DecodeImmediate(
35642                                                           cmode,
35643                                                           (instr & 0xf) |
35644                                                               ((instr >> 12) &
35645                                                                0x70) |
35646                                                               ((instr >> 21) &
35647                                                                0x80));
35648                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35649                                                   vmvn(CurrentCond(),
35650                                                        dt,
35651                                                        DRegister(rd),
35652                                                        imm);
35653                                                   break;
35654                                                 }
35655                                                 case 0x00000400: {
35656                                                   // 0xef800c10
35657                                                   if (((instr & 0x920) ==
35658                                                        0x100) ||
35659                                                       ((instr & 0x520) ==
35660                                                        0x100) ||
35661                                                       ((instr & 0x820) ==
35662                                                        0x20) ||
35663                                                       ((instr & 0x420) ==
35664                                                        0x20) ||
35665                                                       ((instr & 0x220) ==
35666                                                        0x20) ||
35667                                                       ((instr & 0x120) ==
35668                                                        0x120)) {
35669                                                     UnallocatedT32(instr);
35670                                                     return;
35671                                                   }
35672                                                   unsigned cmode =
35673                                                       ((instr >> 8) & 0xf) |
35674                                                       ((instr >> 1) & 0x10);
35675                                                   DataType dt =
35676                                                       ImmediateVmov::DecodeDt(
35677                                                           cmode);
35678                                                   if (dt.Is(
35679                                                           kDataTypeValueInvalid)) {
35680                                                     UnallocatedT32(instr);
35681                                                     return;
35682                                                   }
35683                                                   unsigned rd =
35684                                                       ExtractDRegister(instr,
35685                                                                        22,
35686                                                                        12);
35687                                                   DOperand imm = ImmediateVmov::
35688                                                       DecodeImmediate(
35689                                                           cmode,
35690                                                           (instr & 0xf) |
35691                                                               ((instr >> 12) &
35692                                                                0x70) |
35693                                                               ((instr >> 21) &
35694                                                                0x80));
35695                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35696                                                   vmov(CurrentCond(),
35697                                                        dt,
35698                                                        DRegister(rd),
35699                                                        imm);
35700                                                   break;
35701                                                 }
35702                                                 case 0x00000420: {
35703                                                   // 0xef800c30
35704                                                   if (((instr & 0xd00) ==
35705                                                        0x100) ||
35706                                                       ((instr & 0xd00) ==
35707                                                        0x500) ||
35708                                                       ((instr & 0xd00) ==
35709                                                        0x900) ||
35710                                                       ((instr & 0xe00) ==
35711                                                        0xe00)) {
35712                                                     UnallocatedT32(instr);
35713                                                     return;
35714                                                   }
35715                                                   unsigned cmode =
35716                                                       (instr >> 8) & 0xf;
35717                                                   DataType dt =
35718                                                       ImmediateVmvn::DecodeDt(
35719                                                           cmode);
35720                                                   if (dt.Is(
35721                                                           kDataTypeValueInvalid)) {
35722                                                     UnallocatedT32(instr);
35723                                                     return;
35724                                                   }
35725                                                   unsigned rd =
35726                                                       ExtractDRegister(instr,
35727                                                                        22,
35728                                                                        12);
35729                                                   DOperand imm = ImmediateVmvn::
35730                                                       DecodeImmediate(
35731                                                           cmode,
35732                                                           (instr & 0xf) |
35733                                                               ((instr >> 12) &
35734                                                                0x70) |
35735                                                               ((instr >> 21) &
35736                                                                0x80));
35737                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35738                                                   vmvn(CurrentCond(),
35739                                                        dt,
35740                                                        DRegister(rd),
35741                                                        imm);
35742                                                   break;
35743                                                 }
35744                                                 case 0x00000600: {
35745                                                   // 0xef800e10
35746                                                   if (((instr & 0x920) ==
35747                                                        0x100) ||
35748                                                       ((instr & 0x520) ==
35749                                                        0x100) ||
35750                                                       ((instr & 0x820) ==
35751                                                        0x20) ||
35752                                                       ((instr & 0x420) ==
35753                                                        0x20) ||
35754                                                       ((instr & 0x220) ==
35755                                                        0x20) ||
35756                                                       ((instr & 0x120) ==
35757                                                        0x120)) {
35758                                                     UnallocatedT32(instr);
35759                                                     return;
35760                                                   }
35761                                                   unsigned cmode =
35762                                                       ((instr >> 8) & 0xf) |
35763                                                       ((instr >> 1) & 0x10);
35764                                                   DataType dt =
35765                                                       ImmediateVmov::DecodeDt(
35766                                                           cmode);
35767                                                   if (dt.Is(
35768                                                           kDataTypeValueInvalid)) {
35769                                                     UnallocatedT32(instr);
35770                                                     return;
35771                                                   }
35772                                                   unsigned rd =
35773                                                       ExtractDRegister(instr,
35774                                                                        22,
35775                                                                        12);
35776                                                   DOperand imm = ImmediateVmov::
35777                                                       DecodeImmediate(
35778                                                           cmode,
35779                                                           (instr & 0xf) |
35780                                                               ((instr >> 12) &
35781                                                                0x70) |
35782                                                               ((instr >> 21) &
35783                                                                0x80));
35784                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35785                                                   vmov(CurrentCond(),
35786                                                        dt,
35787                                                        DRegister(rd),
35788                                                        imm);
35789                                                   break;
35790                                                 }
35791                                                 case 0x00000620: {
35792                                                   // 0xef800e30
35793                                                   if (((instr & 0xd00) ==
35794                                                        0x100) ||
35795                                                       ((instr & 0xd00) ==
35796                                                        0x500) ||
35797                                                       ((instr & 0xd00) ==
35798                                                        0x900) ||
35799                                                       ((instr & 0xe00) ==
35800                                                        0xe00)) {
35801                                                     UnallocatedT32(instr);
35802                                                     return;
35803                                                   }
35804                                                   unsigned cmode =
35805                                                       (instr >> 8) & 0xf;
35806                                                   DataType dt =
35807                                                       ImmediateVmvn::DecodeDt(
35808                                                           cmode);
35809                                                   if (dt.Is(
35810                                                           kDataTypeValueInvalid)) {
35811                                                     UnallocatedT32(instr);
35812                                                     return;
35813                                                   }
35814                                                   unsigned rd =
35815                                                       ExtractDRegister(instr,
35816                                                                        22,
35817                                                                        12);
35818                                                   DOperand imm = ImmediateVmvn::
35819                                                       DecodeImmediate(
35820                                                           cmode,
35821                                                           (instr & 0xf) |
35822                                                               ((instr >> 12) &
35823                                                                0x70) |
35824                                                               ((instr >> 21) &
35825                                                                0x80));
35826                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35827                                                   vmvn(CurrentCond(),
35828                                                        dt,
35829                                                        DRegister(rd),
35830                                                        imm);
35831                                                   break;
35832                                                 }
35833                                                 case 0x00000800: {
35834                                                   // 0xef800c10
35835                                                   if (((instr & 0x920) ==
35836                                                        0x100) ||
35837                                                       ((instr & 0x520) ==
35838                                                        0x100) ||
35839                                                       ((instr & 0x820) ==
35840                                                        0x20) ||
35841                                                       ((instr & 0x420) ==
35842                                                        0x20) ||
35843                                                       ((instr & 0x220) ==
35844                                                        0x20) ||
35845                                                       ((instr & 0x120) ==
35846                                                        0x120)) {
35847                                                     UnallocatedT32(instr);
35848                                                     return;
35849                                                   }
35850                                                   unsigned cmode =
35851                                                       ((instr >> 8) & 0xf) |
35852                                                       ((instr >> 1) & 0x10);
35853                                                   DataType dt =
35854                                                       ImmediateVmov::DecodeDt(
35855                                                           cmode);
35856                                                   if (dt.Is(
35857                                                           kDataTypeValueInvalid)) {
35858                                                     UnallocatedT32(instr);
35859                                                     return;
35860                                                   }
35861                                                   unsigned rd =
35862                                                       ExtractDRegister(instr,
35863                                                                        22,
35864                                                                        12);
35865                                                   DOperand imm = ImmediateVmov::
35866                                                       DecodeImmediate(
35867                                                           cmode,
35868                                                           (instr & 0xf) |
35869                                                               ((instr >> 12) &
35870                                                                0x70) |
35871                                                               ((instr >> 21) &
35872                                                                0x80));
35873                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35874                                                   vmov(CurrentCond(),
35875                                                        dt,
35876                                                        DRegister(rd),
35877                                                        imm);
35878                                                   break;
35879                                                 }
35880                                                 case 0x00000820: {
35881                                                   // 0xef800c30
35882                                                   if (((instr & 0xd00) ==
35883                                                        0x100) ||
35884                                                       ((instr & 0xd00) ==
35885                                                        0x500) ||
35886                                                       ((instr & 0xd00) ==
35887                                                        0x900) ||
35888                                                       ((instr & 0xe00) ==
35889                                                        0xe00)) {
35890                                                     UnallocatedT32(instr);
35891                                                     return;
35892                                                   }
35893                                                   unsigned cmode =
35894                                                       (instr >> 8) & 0xf;
35895                                                   DataType dt =
35896                                                       ImmediateVmvn::DecodeDt(
35897                                                           cmode);
35898                                                   if (dt.Is(
35899                                                           kDataTypeValueInvalid)) {
35900                                                     UnallocatedT32(instr);
35901                                                     return;
35902                                                   }
35903                                                   unsigned rd =
35904                                                       ExtractDRegister(instr,
35905                                                                        22,
35906                                                                        12);
35907                                                   DOperand imm = ImmediateVmvn::
35908                                                       DecodeImmediate(
35909                                                           cmode,
35910                                                           (instr & 0xf) |
35911                                                               ((instr >> 12) &
35912                                                                0x70) |
35913                                                               ((instr >> 21) &
35914                                                                0x80));
35915                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35916                                                   vmvn(CurrentCond(),
35917                                                        dt,
35918                                                        DRegister(rd),
35919                                                        imm);
35920                                                   break;
35921                                                 }
35922                                                 case 0x00000a00: {
35923                                                   // 0xef800e10
35924                                                   if (((instr & 0x920) ==
35925                                                        0x100) ||
35926                                                       ((instr & 0x520) ==
35927                                                        0x100) ||
35928                                                       ((instr & 0x820) ==
35929                                                        0x20) ||
35930                                                       ((instr & 0x420) ==
35931                                                        0x20) ||
35932                                                       ((instr & 0x220) ==
35933                                                        0x20) ||
35934                                                       ((instr & 0x120) ==
35935                                                        0x120)) {
35936                                                     UnallocatedT32(instr);
35937                                                     return;
35938                                                   }
35939                                                   unsigned cmode =
35940                                                       ((instr >> 8) & 0xf) |
35941                                                       ((instr >> 1) & 0x10);
35942                                                   DataType dt =
35943                                                       ImmediateVmov::DecodeDt(
35944                                                           cmode);
35945                                                   if (dt.Is(
35946                                                           kDataTypeValueInvalid)) {
35947                                                     UnallocatedT32(instr);
35948                                                     return;
35949                                                   }
35950                                                   unsigned rd =
35951                                                       ExtractDRegister(instr,
35952                                                                        22,
35953                                                                        12);
35954                                                   DOperand imm = ImmediateVmov::
35955                                                       DecodeImmediate(
35956                                                           cmode,
35957                                                           (instr & 0xf) |
35958                                                               ((instr >> 12) &
35959                                                                0x70) |
35960                                                               ((instr >> 21) &
35961                                                                0x80));
35962                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
35963                                                   vmov(CurrentCond(),
35964                                                        dt,
35965                                                        DRegister(rd),
35966                                                        imm);
35967                                                   break;
35968                                                 }
35969                                                 case 0x00000a20: {
35970                                                   // 0xef800e30
35971                                                   if (((instr & 0xd00) ==
35972                                                        0x100) ||
35973                                                       ((instr & 0xd00) ==
35974                                                        0x500) ||
35975                                                       ((instr & 0xd00) ==
35976                                                        0x900) ||
35977                                                       ((instr & 0xe00) ==
35978                                                        0xe00)) {
35979                                                     UnallocatedT32(instr);
35980                                                     return;
35981                                                   }
35982                                                   unsigned cmode =
35983                                                       (instr >> 8) & 0xf;
35984                                                   DataType dt =
35985                                                       ImmediateVmvn::DecodeDt(
35986                                                           cmode);
35987                                                   if (dt.Is(
35988                                                           kDataTypeValueInvalid)) {
35989                                                     UnallocatedT32(instr);
35990                                                     return;
35991                                                   }
35992                                                   unsigned rd =
35993                                                       ExtractDRegister(instr,
35994                                                                        22,
35995                                                                        12);
35996                                                   DOperand imm = ImmediateVmvn::
35997                                                       DecodeImmediate(
35998                                                           cmode,
35999                                                           (instr & 0xf) |
36000                                                               ((instr >> 12) &
36001                                                                0x70) |
36002                                                               ((instr >> 21) &
36003                                                                0x80));
36004                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36005                                                   vmvn(CurrentCond(),
36006                                                        dt,
36007                                                        DRegister(rd),
36008                                                        imm);
36009                                                   break;
36010                                                 }
36011                                                 case 0x00000c00: {
36012                                                   // 0xef800c10
36013                                                   if (((instr & 0x920) ==
36014                                                        0x100) ||
36015                                                       ((instr & 0x520) ==
36016                                                        0x100) ||
36017                                                       ((instr & 0x820) ==
36018                                                        0x20) ||
36019                                                       ((instr & 0x420) ==
36020                                                        0x20) ||
36021                                                       ((instr & 0x220) ==
36022                                                        0x20) ||
36023                                                       ((instr & 0x120) ==
36024                                                        0x120)) {
36025                                                     UnallocatedT32(instr);
36026                                                     return;
36027                                                   }
36028                                                   unsigned cmode =
36029                                                       ((instr >> 8) & 0xf) |
36030                                                       ((instr >> 1) & 0x10);
36031                                                   DataType dt =
36032                                                       ImmediateVmov::DecodeDt(
36033                                                           cmode);
36034                                                   if (dt.Is(
36035                                                           kDataTypeValueInvalid)) {
36036                                                     UnallocatedT32(instr);
36037                                                     return;
36038                                                   }
36039                                                   unsigned rd =
36040                                                       ExtractDRegister(instr,
36041                                                                        22,
36042                                                                        12);
36043                                                   DOperand imm = ImmediateVmov::
36044                                                       DecodeImmediate(
36045                                                           cmode,
36046                                                           (instr & 0xf) |
36047                                                               ((instr >> 12) &
36048                                                                0x70) |
36049                                                               ((instr >> 21) &
36050                                                                0x80));
36051                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36052                                                   vmov(CurrentCond(),
36053                                                        dt,
36054                                                        DRegister(rd),
36055                                                        imm);
36056                                                   break;
36057                                                 }
36058                                                 case 0x00000c20: {
36059                                                   // 0xef800c30
36060                                                   if (((instr & 0xd00) ==
36061                                                        0x100) ||
36062                                                       ((instr & 0xd00) ==
36063                                                        0x500) ||
36064                                                       ((instr & 0xd00) ==
36065                                                        0x900) ||
36066                                                       ((instr & 0xe00) ==
36067                                                        0xe00)) {
36068                                                     UnallocatedT32(instr);
36069                                                     return;
36070                                                   }
36071                                                   unsigned cmode =
36072                                                       (instr >> 8) & 0xf;
36073                                                   DataType dt =
36074                                                       ImmediateVmvn::DecodeDt(
36075                                                           cmode);
36076                                                   if (dt.Is(
36077                                                           kDataTypeValueInvalid)) {
36078                                                     UnallocatedT32(instr);
36079                                                     return;
36080                                                   }
36081                                                   unsigned rd =
36082                                                       ExtractDRegister(instr,
36083                                                                        22,
36084                                                                        12);
36085                                                   DOperand imm = ImmediateVmvn::
36086                                                       DecodeImmediate(
36087                                                           cmode,
36088                                                           (instr & 0xf) |
36089                                                               ((instr >> 12) &
36090                                                                0x70) |
36091                                                               ((instr >> 21) &
36092                                                                0x80));
36093                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36094                                                   vmvn(CurrentCond(),
36095                                                        dt,
36096                                                        DRegister(rd),
36097                                                        imm);
36098                                                   break;
36099                                                 }
36100                                                 case 0x00000d00: {
36101                                                   // 0xef800d10
36102                                                   if (((instr & 0x920) ==
36103                                                        0x100) ||
36104                                                       ((instr & 0x520) ==
36105                                                        0x100) ||
36106                                                       ((instr & 0x820) ==
36107                                                        0x20) ||
36108                                                       ((instr & 0x420) ==
36109                                                        0x20) ||
36110                                                       ((instr & 0x220) ==
36111                                                        0x20) ||
36112                                                       ((instr & 0x120) ==
36113                                                        0x120)) {
36114                                                     UnallocatedT32(instr);
36115                                                     return;
36116                                                   }
36117                                                   unsigned cmode =
36118                                                       ((instr >> 8) & 0xf) |
36119                                                       ((instr >> 1) & 0x10);
36120                                                   DataType dt =
36121                                                       ImmediateVmov::DecodeDt(
36122                                                           cmode);
36123                                                   if (dt.Is(
36124                                                           kDataTypeValueInvalid)) {
36125                                                     UnallocatedT32(instr);
36126                                                     return;
36127                                                   }
36128                                                   unsigned rd =
36129                                                       ExtractDRegister(instr,
36130                                                                        22,
36131                                                                        12);
36132                                                   DOperand imm = ImmediateVmov::
36133                                                       DecodeImmediate(
36134                                                           cmode,
36135                                                           (instr & 0xf) |
36136                                                               ((instr >> 12) &
36137                                                                0x70) |
36138                                                               ((instr >> 21) &
36139                                                                0x80));
36140                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36141                                                   vmov(CurrentCond(),
36142                                                        dt,
36143                                                        DRegister(rd),
36144                                                        imm);
36145                                                   break;
36146                                                 }
36147                                                 case 0x00000d20: {
36148                                                   // 0xef800d30
36149                                                   if (((instr & 0xd00) ==
36150                                                        0x100) ||
36151                                                       ((instr & 0xd00) ==
36152                                                        0x500) ||
36153                                                       ((instr & 0xd00) ==
36154                                                        0x900) ||
36155                                                       ((instr & 0xe00) ==
36156                                                        0xe00)) {
36157                                                     UnallocatedT32(instr);
36158                                                     return;
36159                                                   }
36160                                                   unsigned cmode =
36161                                                       (instr >> 8) & 0xf;
36162                                                   DataType dt =
36163                                                       ImmediateVmvn::DecodeDt(
36164                                                           cmode);
36165                                                   if (dt.Is(
36166                                                           kDataTypeValueInvalid)) {
36167                                                     UnallocatedT32(instr);
36168                                                     return;
36169                                                   }
36170                                                   unsigned rd =
36171                                                       ExtractDRegister(instr,
36172                                                                        22,
36173                                                                        12);
36174                                                   DOperand imm = ImmediateVmvn::
36175                                                       DecodeImmediate(
36176                                                           cmode,
36177                                                           (instr & 0xf) |
36178                                                               ((instr >> 12) &
36179                                                                0x70) |
36180                                                               ((instr >> 21) &
36181                                                                0x80));
36182                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36183                                                   vmvn(CurrentCond(),
36184                                                        dt,
36185                                                        DRegister(rd),
36186                                                        imm);
36187                                                   break;
36188                                                 }
36189                                                 case 0x00000e00: {
36190                                                   // 0xef800e10
36191                                                   if (((instr & 0x920) ==
36192                                                        0x100) ||
36193                                                       ((instr & 0x520) ==
36194                                                        0x100) ||
36195                                                       ((instr & 0x820) ==
36196                                                        0x20) ||
36197                                                       ((instr & 0x420) ==
36198                                                        0x20) ||
36199                                                       ((instr & 0x220) ==
36200                                                        0x20) ||
36201                                                       ((instr & 0x120) ==
36202                                                        0x120)) {
36203                                                     UnallocatedT32(instr);
36204                                                     return;
36205                                                   }
36206                                                   unsigned cmode =
36207                                                       ((instr >> 8) & 0xf) |
36208                                                       ((instr >> 1) & 0x10);
36209                                                   DataType dt =
36210                                                       ImmediateVmov::DecodeDt(
36211                                                           cmode);
36212                                                   if (dt.Is(
36213                                                           kDataTypeValueInvalid)) {
36214                                                     UnallocatedT32(instr);
36215                                                     return;
36216                                                   }
36217                                                   unsigned rd =
36218                                                       ExtractDRegister(instr,
36219                                                                        22,
36220                                                                        12);
36221                                                   DOperand imm = ImmediateVmov::
36222                                                       DecodeImmediate(
36223                                                           cmode,
36224                                                           (instr & 0xf) |
36225                                                               ((instr >> 12) &
36226                                                                0x70) |
36227                                                               ((instr >> 21) &
36228                                                                0x80));
36229                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36230                                                   vmov(CurrentCond(),
36231                                                        dt,
36232                                                        DRegister(rd),
36233                                                        imm);
36234                                                   break;
36235                                                 }
36236                                                 case 0x00000e20: {
36237                                                   // 0xef800e30
36238                                                   if (((instr & 0x920) ==
36239                                                        0x100) ||
36240                                                       ((instr & 0x520) ==
36241                                                        0x100) ||
36242                                                       ((instr & 0x820) ==
36243                                                        0x20) ||
36244                                                       ((instr & 0x420) ==
36245                                                        0x20) ||
36246                                                       ((instr & 0x220) ==
36247                                                        0x20) ||
36248                                                       ((instr & 0x120) ==
36249                                                        0x120)) {
36250                                                     UnallocatedT32(instr);
36251                                                     return;
36252                                                   }
36253                                                   unsigned cmode =
36254                                                       ((instr >> 8) & 0xf) |
36255                                                       ((instr >> 1) & 0x10);
36256                                                   DataType dt =
36257                                                       ImmediateVmov::DecodeDt(
36258                                                           cmode);
36259                                                   if (dt.Is(
36260                                                           kDataTypeValueInvalid)) {
36261                                                     UnallocatedT32(instr);
36262                                                     return;
36263                                                   }
36264                                                   unsigned rd =
36265                                                       ExtractDRegister(instr,
36266                                                                        22,
36267                                                                        12);
36268                                                   DOperand imm = ImmediateVmov::
36269                                                       DecodeImmediate(
36270                                                           cmode,
36271                                                           (instr & 0xf) |
36272                                                               ((instr >> 12) &
36273                                                                0x70) |
36274                                                               ((instr >> 21) &
36275                                                                0x80));
36276                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36277                                                   vmov(CurrentCond(),
36278                                                        dt,
36279                                                        DRegister(rd),
36280                                                        imm);
36281                                                   break;
36282                                                 }
36283                                                 case 0x00000f00: {
36284                                                   // 0xef800f10
36285                                                   if (((instr & 0x920) ==
36286                                                        0x100) ||
36287                                                       ((instr & 0x520) ==
36288                                                        0x100) ||
36289                                                       ((instr & 0x820) ==
36290                                                        0x20) ||
36291                                                       ((instr & 0x420) ==
36292                                                        0x20) ||
36293                                                       ((instr & 0x220) ==
36294                                                        0x20) ||
36295                                                       ((instr & 0x120) ==
36296                                                        0x120)) {
36297                                                     UnallocatedT32(instr);
36298                                                     return;
36299                                                   }
36300                                                   unsigned cmode =
36301                                                       ((instr >> 8) & 0xf) |
36302                                                       ((instr >> 1) & 0x10);
36303                                                   DataType dt =
36304                                                       ImmediateVmov::DecodeDt(
36305                                                           cmode);
36306                                                   if (dt.Is(
36307                                                           kDataTypeValueInvalid)) {
36308                                                     UnallocatedT32(instr);
36309                                                     return;
36310                                                   }
36311                                                   unsigned rd =
36312                                                       ExtractDRegister(instr,
36313                                                                        22,
36314                                                                        12);
36315                                                   DOperand imm = ImmediateVmov::
36316                                                       DecodeImmediate(
36317                                                           cmode,
36318                                                           (instr & 0xf) |
36319                                                               ((instr >> 12) &
36320                                                                0x70) |
36321                                                               ((instr >> 21) &
36322                                                                0x80));
36323                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36324                                                   vmov(CurrentCond(),
36325                                                        dt,
36326                                                        DRegister(rd),
36327                                                        imm);
36328                                                   break;
36329                                                 }
36330                                                 default:
36331                                                   UnallocatedT32(instr);
36332                                                   break;
36333                                               }
36334                                               break;
36335                                             }
36336                                             default: {
36337                                               if (((instr & 0x920) == 0x100) ||
36338                                                   ((instr & 0x520) == 0x100) ||
36339                                                   ((instr & 0x820) == 0x20) ||
36340                                                   ((instr & 0x420) == 0x20) ||
36341                                                   ((instr & 0x220) == 0x20) ||
36342                                                   ((instr & 0x120) == 0x120)) {
36343                                                 UnallocatedT32(instr);
36344                                                 return;
36345                                               }
36346                                               unsigned cmode =
36347                                                   ((instr >> 8) & 0xf) |
36348                                                   ((instr >> 1) & 0x10);
36349                                               DataType dt =
36350                                                   ImmediateVmov::DecodeDt(
36351                                                       cmode);
36352                                               if (dt.Is(
36353                                                       kDataTypeValueInvalid)) {
36354                                                 UnallocatedT32(instr);
36355                                                 return;
36356                                               }
36357                                               unsigned rd =
36358                                                   ExtractDRegister(instr,
36359                                                                    22,
36360                                                                    12);
36361                                               DOperand imm = ImmediateVmov::
36362                                                   DecodeImmediate(cmode,
36363                                                                   (instr &
36364                                                                    0xf) |
36365                                                                       ((instr >>
36366                                                                         12) &
36367                                                                        0x70) |
36368                                                                       ((instr >>
36369                                                                         21) &
36370                                                                        0x80));
36371                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36372                                               vmov(CurrentCond(),
36373                                                    dt,
36374                                                    DRegister(rd),
36375                                                    imm);
36376                                               break;
36377                                             }
36378                                           }
36379                                           break;
36380                                         }
36381                                       }
36382                                       break;
36383                                     }
36384                                     default:
36385                                       UnallocatedT32(instr);
36386                                       break;
36387                                   }
36388                                   break;
36389                                 }
36390                                 default: {
36391                                   if ((instr & 0x00000200) == 0x00000200) {
36392                                     if (((instr & 0x200000) == 0x0)) {
36393                                       UnallocatedT32(instr);
36394                                       return;
36395                                     }
36396                                     DataType dt1 = Dt_op_U_1_Decode1(
36397                                         ((instr >> 28) & 0x1) |
36398                                         ((instr >> 7) & 0x2));
36399                                     if (dt1.Is(kDataTypeValueInvalid)) {
36400                                       UnallocatedT32(instr);
36401                                       return;
36402                                     }
36403                                     DataType dt2 = Dt_op_U_1_Decode2(
36404                                         ((instr >> 28) & 0x1) |
36405                                         ((instr >> 7) & 0x2));
36406                                     if (dt2.Is(kDataTypeValueInvalid)) {
36407                                       UnallocatedT32(instr);
36408                                       return;
36409                                     }
36410                                     unsigned rd =
36411                                         ExtractDRegister(instr, 22, 12);
36412                                     unsigned rm = ExtractDRegister(instr, 5, 0);
36413                                     uint32_t fbits =
36414                                         64 - ((instr >> 16) & 0x3f);
36415                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
36416                                     vcvt(CurrentCond(),
36417                                          dt1,
36418                                          dt2,
36419                                          DRegister(rd),
36420                                          DRegister(rm),
36421                                          fbits);
36422                                   } else {
36423                                     UnallocatedT32(instr);
36424                                   }
36425                                   break;
36426                                 }
36427                               }
36428                               break;
36429                             }
36430                             default:
36431                               UnallocatedT32(instr);
36432                               break;
36433                           }
36434                           break;
36435                         }
36436                       }
36437                       break;
36438                     }
36439                     case 0x00800040: {
36440                       // 0xef800050
36441                       switch (instr & 0x00000c00) {
36442                         case 0x00000000: {
36443                           // 0xef800050
36444                           switch (instr & 0x00380080) {
36445                             case 0x00000000: {
36446                               // 0xef800050
36447                               switch (instr & 0x00000100) {
36448                                 case 0x00000000: {
36449                                   // 0xef800050
36450                                   switch (instr & 0x00000200) {
36451                                     default: {
36452                                       switch (instr & 0x00000020) {
36453                                         case 0x00000020: {
36454                                           // 0xef800070
36455                                           if (((instr & 0xd00) == 0x100) ||
36456                                               ((instr & 0xd00) == 0x500) ||
36457                                               ((instr & 0xd00) == 0x900) ||
36458                                               ((instr & 0xe00) == 0xe00)) {
36459                                             UnallocatedT32(instr);
36460                                             return;
36461                                           }
36462                                           unsigned cmode = (instr >> 8) & 0xf;
36463                                           DataType dt =
36464                                               ImmediateVmvn::DecodeDt(cmode);
36465                                           if (dt.Is(kDataTypeValueInvalid)) {
36466                                             UnallocatedT32(instr);
36467                                             return;
36468                                           }
36469                                           if (((instr >> 12) & 1) != 0) {
36470                                             UnallocatedT32(instr);
36471                                             return;
36472                                           }
36473                                           unsigned rd =
36474                                               ExtractQRegister(instr, 22, 12);
36475                                           QOperand imm =
36476                                               ImmediateVmvn::DecodeImmediate(
36477                                                   cmode,
36478                                                   (instr & 0xf) |
36479                                                       ((instr >> 12) & 0x70) |
36480                                                       ((instr >> 21) & 0x80));
36481                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36482                                           vmvn(CurrentCond(),
36483                                                dt,
36484                                                QRegister(rd),
36485                                                imm);
36486                                           break;
36487                                         }
36488                                         default: {
36489                                           if (((instr & 0x920) == 0x100) ||
36490                                               ((instr & 0x520) == 0x100) ||
36491                                               ((instr & 0x820) == 0x20) ||
36492                                               ((instr & 0x420) == 0x20) ||
36493                                               ((instr & 0x220) == 0x20) ||
36494                                               ((instr & 0x120) == 0x120)) {
36495                                             UnallocatedT32(instr);
36496                                             return;
36497                                           }
36498                                           unsigned cmode =
36499                                               ((instr >> 8) & 0xf) |
36500                                               ((instr >> 1) & 0x10);
36501                                           DataType dt =
36502                                               ImmediateVmov::DecodeDt(cmode);
36503                                           if (dt.Is(kDataTypeValueInvalid)) {
36504                                             UnallocatedT32(instr);
36505                                             return;
36506                                           }
36507                                           if (((instr >> 12) & 1) != 0) {
36508                                             UnallocatedT32(instr);
36509                                             return;
36510                                           }
36511                                           unsigned rd =
36512                                               ExtractQRegister(instr, 22, 12);
36513                                           QOperand imm =
36514                                               ImmediateVmov::DecodeImmediate(
36515                                                   cmode,
36516                                                   (instr & 0xf) |
36517                                                       ((instr >> 12) & 0x70) |
36518                                                       ((instr >> 21) & 0x80));
36519                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36520                                           vmov(CurrentCond(),
36521                                                dt,
36522                                                QRegister(rd),
36523                                                imm);
36524                                           break;
36525                                         }
36526                                       }
36527                                       break;
36528                                     }
36529                                   }
36530                                   break;
36531                                 }
36532                                 case 0x00000100: {
36533                                   // 0xef800150
36534                                   switch (instr & 0x00000020) {
36535                                     case 0x00000000: {
36536                                       // 0xef800150
36537                                       if (((instr & 0x100) == 0x0) ||
36538                                           ((instr & 0xc00) == 0xc00)) {
36539                                         UnallocatedT32(instr);
36540                                         return;
36541                                       }
36542                                       unsigned cmode = (instr >> 8) & 0xf;
36543                                       DataType dt =
36544                                           ImmediateVorr::DecodeDt(cmode);
36545                                       if (dt.Is(kDataTypeValueInvalid)) {
36546                                         UnallocatedT32(instr);
36547                                         return;
36548                                       }
36549                                       if (((instr >> 12) & 1) != 0) {
36550                                         UnallocatedT32(instr);
36551                                         return;
36552                                       }
36553                                       unsigned rd =
36554                                           ExtractQRegister(instr, 22, 12);
36555                                       QOperand imm =
36556                                           ImmediateVorr::DecodeImmediate(
36557                                               cmode,
36558                                               (instr & 0xf) |
36559                                                   ((instr >> 12) & 0x70) |
36560                                                   ((instr >> 21) & 0x80));
36561                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36562                                       vorr(CurrentCond(),
36563                                            dt,
36564                                            QRegister(rd),
36565                                            QRegister(rd),
36566                                            imm);
36567                                       break;
36568                                     }
36569                                     case 0x00000020: {
36570                                       // 0xef800170
36571                                       if (((instr & 0x100) == 0x0) ||
36572                                           ((instr & 0xc00) == 0xc00)) {
36573                                         UnallocatedT32(instr);
36574                                         return;
36575                                       }
36576                                       unsigned cmode = (instr >> 8) & 0xf;
36577                                       DataType dt =
36578                                           ImmediateVbic::DecodeDt(cmode);
36579                                       if (dt.Is(kDataTypeValueInvalid)) {
36580                                         UnallocatedT32(instr);
36581                                         return;
36582                                       }
36583                                       if (((instr >> 12) & 1) != 0) {
36584                                         UnallocatedT32(instr);
36585                                         return;
36586                                       }
36587                                       unsigned rd =
36588                                           ExtractQRegister(instr, 22, 12);
36589                                       QOperand imm =
36590                                           ImmediateVbic::DecodeImmediate(
36591                                               cmode,
36592                                               (instr & 0xf) |
36593                                                   ((instr >> 12) & 0x70) |
36594                                                   ((instr >> 21) & 0x80));
36595                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36596                                       vbic(CurrentCond(),
36597                                            dt,
36598                                            QRegister(rd),
36599                                            QRegister(rd),
36600                                            imm);
36601                                       break;
36602                                     }
36603                                   }
36604                                   break;
36605                                 }
36606                               }
36607                               break;
36608                             }
36609                             default: {
36610                               switch (instr & 0x00000300) {
36611                                 case 0x00000000: {
36612                                   // 0xef800050
36613                                   if (((instr & 0x380080) == 0x0)) {
36614                                     UnallocatedT32(instr);
36615                                     return;
36616                                   }
36617                                   DataType dt =
36618                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36619                                                              ((instr >> 4) &
36620                                                               0x8),
36621                                                          (instr >> 28) & 0x1);
36622                                   if (dt.Is(kDataTypeValueInvalid)) {
36623                                     UnallocatedT32(instr);
36624                                     return;
36625                                   }
36626                                   if (((instr >> 12) & 1) != 0) {
36627                                     UnallocatedT32(instr);
36628                                     return;
36629                                   }
36630                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36631                                   if ((instr & 1) != 0) {
36632                                     UnallocatedT32(instr);
36633                                     return;
36634                                   }
36635                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36636                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36637                                   uint32_t imm =
36638                                       (dt.IsSize(64) ? 64
36639                                                      : (dt.GetSize() * 2)) -
36640                                       imm6;
36641                                   // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36642                                   vshr(CurrentCond(),
36643                                        dt,
36644                                        QRegister(rd),
36645                                        QRegister(rm),
36646                                        imm);
36647                                   break;
36648                                 }
36649                                 case 0x00000100: {
36650                                   // 0xef800150
36651                                   if (((instr & 0x380080) == 0x0)) {
36652                                     UnallocatedT32(instr);
36653                                     return;
36654                                   }
36655                                   DataType dt =
36656                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36657                                                              ((instr >> 4) &
36658                                                               0x8),
36659                                                          (instr >> 28) & 0x1);
36660                                   if (dt.Is(kDataTypeValueInvalid)) {
36661                                     UnallocatedT32(instr);
36662                                     return;
36663                                   }
36664                                   if (((instr >> 12) & 1) != 0) {
36665                                     UnallocatedT32(instr);
36666                                     return;
36667                                   }
36668                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36669                                   if ((instr & 1) != 0) {
36670                                     UnallocatedT32(instr);
36671                                     return;
36672                                   }
36673                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36674                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36675                                   uint32_t imm =
36676                                       (dt.IsSize(64) ? 64
36677                                                      : (dt.GetSize() * 2)) -
36678                                       imm6;
36679                                   // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36680                                   vsra(CurrentCond(),
36681                                        dt,
36682                                        QRegister(rd),
36683                                        QRegister(rm),
36684                                        imm);
36685                                   break;
36686                                 }
36687                                 case 0x00000200: {
36688                                   // 0xef800250
36689                                   if (((instr & 0x380080) == 0x0)) {
36690                                     UnallocatedT32(instr);
36691                                     return;
36692                                   }
36693                                   DataType dt =
36694                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36695                                                              ((instr >> 4) &
36696                                                               0x8),
36697                                                          (instr >> 28) & 0x1);
36698                                   if (dt.Is(kDataTypeValueInvalid)) {
36699                                     UnallocatedT32(instr);
36700                                     return;
36701                                   }
36702                                   if (((instr >> 12) & 1) != 0) {
36703                                     UnallocatedT32(instr);
36704                                     return;
36705                                   }
36706                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36707                                   if ((instr & 1) != 0) {
36708                                     UnallocatedT32(instr);
36709                                     return;
36710                                   }
36711                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36712                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36713                                   uint32_t imm =
36714                                       (dt.IsSize(64) ? 64
36715                                                      : (dt.GetSize() * 2)) -
36716                                       imm6;
36717                                   // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36718                                   vrshr(CurrentCond(),
36719                                         dt,
36720                                         QRegister(rd),
36721                                         QRegister(rm),
36722                                         imm);
36723                                   break;
36724                                 }
36725                                 case 0x00000300: {
36726                                   // 0xef800350
36727                                   if (((instr & 0x380080) == 0x0)) {
36728                                     UnallocatedT32(instr);
36729                                     return;
36730                                   }
36731                                   DataType dt =
36732                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
36733                                                              ((instr >> 4) &
36734                                                               0x8),
36735                                                          (instr >> 28) & 0x1);
36736                                   if (dt.Is(kDataTypeValueInvalid)) {
36737                                     UnallocatedT32(instr);
36738                                     return;
36739                                   }
36740                                   if (((instr >> 12) & 1) != 0) {
36741                                     UnallocatedT32(instr);
36742                                     return;
36743                                   }
36744                                   unsigned rd = ExtractQRegister(instr, 22, 12);
36745                                   if ((instr & 1) != 0) {
36746                                     UnallocatedT32(instr);
36747                                     return;
36748                                   }
36749                                   unsigned rm = ExtractQRegister(instr, 5, 0);
36750                                   uint32_t imm6 = (instr >> 16) & 0x3f;
36751                                   uint32_t imm =
36752                                       (dt.IsSize(64) ? 64
36753                                                      : (dt.GetSize() * 2)) -
36754                                       imm6;
36755                                   // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36756                                   vrsra(CurrentCond(),
36757                                         dt,
36758                                         QRegister(rd),
36759                                         QRegister(rm),
36760                                         imm);
36761                                   break;
36762                                 }
36763                               }
36764                               break;
36765                             }
36766                           }
36767                           break;
36768                         }
36769                         case 0x00000400: {
36770                           // 0xef800450
36771                           switch (instr & 0x00380080) {
36772                             case 0x00000000: {
36773                               // 0xef800450
36774                               switch (instr & 0x00000100) {
36775                                 case 0x00000000: {
36776                                   // 0xef800450
36777                                   switch (instr & 0x00000200) {
36778                                     default: {
36779                                       switch (instr & 0x00000020) {
36780                                         case 0x00000020: {
36781                                           // 0xef800470
36782                                           if (((instr & 0xd00) == 0x100) ||
36783                                               ((instr & 0xd00) == 0x500) ||
36784                                               ((instr & 0xd00) == 0x900) ||
36785                                               ((instr & 0xe00) == 0xe00)) {
36786                                             UnallocatedT32(instr);
36787                                             return;
36788                                           }
36789                                           unsigned cmode = (instr >> 8) & 0xf;
36790                                           DataType dt =
36791                                               ImmediateVmvn::DecodeDt(cmode);
36792                                           if (dt.Is(kDataTypeValueInvalid)) {
36793                                             UnallocatedT32(instr);
36794                                             return;
36795                                           }
36796                                           if (((instr >> 12) & 1) != 0) {
36797                                             UnallocatedT32(instr);
36798                                             return;
36799                                           }
36800                                           unsigned rd =
36801                                               ExtractQRegister(instr, 22, 12);
36802                                           QOperand imm =
36803                                               ImmediateVmvn::DecodeImmediate(
36804                                                   cmode,
36805                                                   (instr & 0xf) |
36806                                                       ((instr >> 12) & 0x70) |
36807                                                       ((instr >> 21) & 0x80));
36808                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36809                                           vmvn(CurrentCond(),
36810                                                dt,
36811                                                QRegister(rd),
36812                                                imm);
36813                                           break;
36814                                         }
36815                                         default: {
36816                                           if (((instr & 0x920) == 0x100) ||
36817                                               ((instr & 0x520) == 0x100) ||
36818                                               ((instr & 0x820) == 0x20) ||
36819                                               ((instr & 0x420) == 0x20) ||
36820                                               ((instr & 0x220) == 0x20) ||
36821                                               ((instr & 0x120) == 0x120)) {
36822                                             UnallocatedT32(instr);
36823                                             return;
36824                                           }
36825                                           unsigned cmode =
36826                                               ((instr >> 8) & 0xf) |
36827                                               ((instr >> 1) & 0x10);
36828                                           DataType dt =
36829                                               ImmediateVmov::DecodeDt(cmode);
36830                                           if (dt.Is(kDataTypeValueInvalid)) {
36831                                             UnallocatedT32(instr);
36832                                             return;
36833                                           }
36834                                           if (((instr >> 12) & 1) != 0) {
36835                                             UnallocatedT32(instr);
36836                                             return;
36837                                           }
36838                                           unsigned rd =
36839                                               ExtractQRegister(instr, 22, 12);
36840                                           QOperand imm =
36841                                               ImmediateVmov::DecodeImmediate(
36842                                                   cmode,
36843                                                   (instr & 0xf) |
36844                                                       ((instr >> 12) & 0x70) |
36845                                                       ((instr >> 21) & 0x80));
36846                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
36847                                           vmov(CurrentCond(),
36848                                                dt,
36849                                                QRegister(rd),
36850                                                imm);
36851                                           break;
36852                                         }
36853                                       }
36854                                       break;
36855                                     }
36856                                   }
36857                                   break;
36858                                 }
36859                                 case 0x00000100: {
36860                                   // 0xef800550
36861                                   switch (instr & 0x00000020) {
36862                                     case 0x00000000: {
36863                                       // 0xef800550
36864                                       if (((instr & 0x100) == 0x0) ||
36865                                           ((instr & 0xc00) == 0xc00)) {
36866                                         UnallocatedT32(instr);
36867                                         return;
36868                                       }
36869                                       unsigned cmode = (instr >> 8) & 0xf;
36870                                       DataType dt =
36871                                           ImmediateVorr::DecodeDt(cmode);
36872                                       if (dt.Is(kDataTypeValueInvalid)) {
36873                                         UnallocatedT32(instr);
36874                                         return;
36875                                       }
36876                                       if (((instr >> 12) & 1) != 0) {
36877                                         UnallocatedT32(instr);
36878                                         return;
36879                                       }
36880                                       unsigned rd =
36881                                           ExtractQRegister(instr, 22, 12);
36882                                       QOperand imm =
36883                                           ImmediateVorr::DecodeImmediate(
36884                                               cmode,
36885                                               (instr & 0xf) |
36886                                                   ((instr >> 12) & 0x70) |
36887                                                   ((instr >> 21) & 0x80));
36888                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36889                                       vorr(CurrentCond(),
36890                                            dt,
36891                                            QRegister(rd),
36892                                            QRegister(rd),
36893                                            imm);
36894                                       break;
36895                                     }
36896                                     case 0x00000020: {
36897                                       // 0xef800570
36898                                       if (((instr & 0x100) == 0x0) ||
36899                                           ((instr & 0xc00) == 0xc00)) {
36900                                         UnallocatedT32(instr);
36901                                         return;
36902                                       }
36903                                       unsigned cmode = (instr >> 8) & 0xf;
36904                                       DataType dt =
36905                                           ImmediateVbic::DecodeDt(cmode);
36906                                       if (dt.Is(kDataTypeValueInvalid)) {
36907                                         UnallocatedT32(instr);
36908                                         return;
36909                                       }
36910                                       if (((instr >> 12) & 1) != 0) {
36911                                         UnallocatedT32(instr);
36912                                         return;
36913                                       }
36914                                       unsigned rd =
36915                                           ExtractQRegister(instr, 22, 12);
36916                                       QOperand imm =
36917                                           ImmediateVbic::DecodeImmediate(
36918                                               cmode,
36919                                               (instr & 0xf) |
36920                                                   ((instr >> 12) & 0x70) |
36921                                                   ((instr >> 21) & 0x80));
36922                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
36923                                       vbic(CurrentCond(),
36924                                            dt,
36925                                            QRegister(rd),
36926                                            QRegister(rd),
36927                                            imm);
36928                                       break;
36929                                     }
36930                                   }
36931                                   break;
36932                                 }
36933                               }
36934                               break;
36935                             }
36936                             default: {
36937                               switch (instr & 0x00000300) {
36938                                 case 0x00000000: {
36939                                   // 0xef800450
36940                                   if ((instr & 0x10000000) == 0x10000000) {
36941                                     if (((instr & 0x380080) == 0x0)) {
36942                                       UnallocatedT32(instr);
36943                                       return;
36944                                     }
36945                                     DataType dt = Dt_L_imm6_4_Decode(
36946                                         ((instr >> 19) & 0x7) |
36947                                         ((instr >> 4) & 0x8));
36948                                     if (dt.Is(kDataTypeValueInvalid)) {
36949                                       UnallocatedT32(instr);
36950                                       return;
36951                                     }
36952                                     if (((instr >> 12) & 1) != 0) {
36953                                       UnallocatedT32(instr);
36954                                       return;
36955                                     }
36956                                     unsigned rd =
36957                                         ExtractQRegister(instr, 22, 12);
36958                                     if ((instr & 1) != 0) {
36959                                       UnallocatedT32(instr);
36960                                       return;
36961                                     }
36962                                     unsigned rm = ExtractQRegister(instr, 5, 0);
36963                                     uint32_t imm6 = (instr >> 16) & 0x3f;
36964                                     uint32_t imm =
36965                                         (dt.IsSize(64) ? 64
36966                                                        : (dt.GetSize() * 2)) -
36967                                         imm6;
36968                                     // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
36969                                     vsri(CurrentCond(),
36970                                          dt,
36971                                          QRegister(rd),
36972                                          QRegister(rm),
36973                                          imm);
36974                                   } else {
36975                                     UnallocatedT32(instr);
36976                                   }
36977                                   break;
36978                                 }
36979                                 case 0x00000100: {
36980                                   // 0xef800550
36981                                   switch (instr & 0x10000000) {
36982                                     case 0x00000000: {
36983                                       // 0xef800550
36984                                       if (((instr & 0x380080) == 0x0)) {
36985                                         UnallocatedT32(instr);
36986                                         return;
36987                                       }
36988                                       DataType dt = Dt_L_imm6_3_Decode(
36989                                           ((instr >> 19) & 0x7) |
36990                                           ((instr >> 4) & 0x8));
36991                                       if (dt.Is(kDataTypeValueInvalid)) {
36992                                         UnallocatedT32(instr);
36993                                         return;
36994                                       }
36995                                       if (((instr >> 12) & 1) != 0) {
36996                                         UnallocatedT32(instr);
36997                                         return;
36998                                       }
36999                                       unsigned rd =
37000                                           ExtractQRegister(instr, 22, 12);
37001                                       if ((instr & 1) != 0) {
37002                                         UnallocatedT32(instr);
37003                                         return;
37004                                       }
37005                                       unsigned rm =
37006                                           ExtractQRegister(instr, 5, 0);
37007                                       uint32_t imm6 = (instr >> 16) & 0x3f;
37008                                       uint32_t imm =
37009                                           imm6 -
37010                                           (dt.IsSize(64) ? 0 : dt.GetSize());
37011                                       // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37012                                       vshl(CurrentCond(),
37013                                            dt,
37014                                            QRegister(rd),
37015                                            QRegister(rm),
37016                                            imm);
37017                                       break;
37018                                     }
37019                                     case 0x10000000: {
37020                                       // 0xff800550
37021                                       if (((instr & 0x380080) == 0x0)) {
37022                                         UnallocatedT32(instr);
37023                                         return;
37024                                       }
37025                                       DataType dt = Dt_L_imm6_4_Decode(
37026                                           ((instr >> 19) & 0x7) |
37027                                           ((instr >> 4) & 0x8));
37028                                       if (dt.Is(kDataTypeValueInvalid)) {
37029                                         UnallocatedT32(instr);
37030                                         return;
37031                                       }
37032                                       if (((instr >> 12) & 1) != 0) {
37033                                         UnallocatedT32(instr);
37034                                         return;
37035                                       }
37036                                       unsigned rd =
37037                                           ExtractQRegister(instr, 22, 12);
37038                                       if ((instr & 1) != 0) {
37039                                         UnallocatedT32(instr);
37040                                         return;
37041                                       }
37042                                       unsigned rm =
37043                                           ExtractQRegister(instr, 5, 0);
37044                                       uint32_t imm6 = (instr >> 16) & 0x3f;
37045                                       uint32_t imm =
37046                                           imm6 -
37047                                           (dt.IsSize(64) ? 0 : dt.GetSize());
37048                                       // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37049                                       vsli(CurrentCond(),
37050                                            dt,
37051                                            QRegister(rd),
37052                                            QRegister(rm),
37053                                            imm);
37054                                       break;
37055                                     }
37056                                   }
37057                                   break;
37058                                 }
37059                                 case 0x00000200: {
37060                                   // 0xef800650
37061                                   if (((instr & 0x380080) == 0x0)) {
37062                                     UnallocatedT32(instr);
37063                                     return;
37064                                   }
37065                                   DataType dt =
37066                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
37067                                                              ((instr >> 4) &
37068                                                               0x8),
37069                                                          (instr >> 28) & 0x1);
37070                                   if (dt.Is(kDataTypeValueInvalid)) {
37071                                     UnallocatedT32(instr);
37072                                     return;
37073                                   }
37074                                   if (((instr >> 12) & 1) != 0) {
37075                                     UnallocatedT32(instr);
37076                                     return;
37077                                   }
37078                                   unsigned rd = ExtractQRegister(instr, 22, 12);
37079                                   if ((instr & 1) != 0) {
37080                                     UnallocatedT32(instr);
37081                                     return;
37082                                   }
37083                                   unsigned rm = ExtractQRegister(instr, 5, 0);
37084                                   uint32_t imm6 = (instr >> 16) & 0x3f;
37085                                   uint32_t imm =
37086                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
37087                                   // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37088                                   vqshlu(CurrentCond(),
37089                                          dt,
37090                                          QRegister(rd),
37091                                          QRegister(rm),
37092                                          imm);
37093                                   break;
37094                                 }
37095                                 case 0x00000300: {
37096                                   // 0xef800750
37097                                   if (((instr & 0x380080) == 0x0)) {
37098                                     UnallocatedT32(instr);
37099                                     return;
37100                                   }
37101                                   DataType dt =
37102                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
37103                                                              ((instr >> 4) &
37104                                                               0x8),
37105                                                          (instr >> 28) & 0x1);
37106                                   if (dt.Is(kDataTypeValueInvalid)) {
37107                                     UnallocatedT32(instr);
37108                                     return;
37109                                   }
37110                                   if (((instr >> 12) & 1) != 0) {
37111                                     UnallocatedT32(instr);
37112                                     return;
37113                                   }
37114                                   unsigned rd = ExtractQRegister(instr, 22, 12);
37115                                   if ((instr & 1) != 0) {
37116                                     UnallocatedT32(instr);
37117                                     return;
37118                                   }
37119                                   unsigned rm = ExtractQRegister(instr, 5, 0);
37120                                   uint32_t imm6 = (instr >> 16) & 0x3f;
37121                                   uint32_t imm =
37122                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
37123                                   // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37124                                   vqshl(CurrentCond(),
37125                                         dt,
37126                                         QRegister(rd),
37127                                         QRegister(rm),
37128                                         imm);
37129                                   break;
37130                                 }
37131                               }
37132                               break;
37133                             }
37134                           }
37135                           break;
37136                         }
37137                         case 0x00000800: {
37138                           // 0xef800850
37139                           switch (instr & 0x00000080) {
37140                             case 0x00000000: {
37141                               // 0xef800850
37142                               switch (instr & 0x00380000) {
37143                                 case 0x00000000: {
37144                                   // 0xef800850
37145                                   switch (instr & 0x00000100) {
37146                                     case 0x00000000: {
37147                                       // 0xef800850
37148                                       switch (instr & 0x00000200) {
37149                                         default: {
37150                                           switch (instr & 0x00000020) {
37151                                             case 0x00000020: {
37152                                               // 0xef800870
37153                                               if (((instr & 0xd00) == 0x100) ||
37154                                                   ((instr & 0xd00) == 0x500) ||
37155                                                   ((instr & 0xd00) == 0x900) ||
37156                                                   ((instr & 0xe00) == 0xe00)) {
37157                                                 UnallocatedT32(instr);
37158                                                 return;
37159                                               }
37160                                               unsigned cmode =
37161                                                   (instr >> 8) & 0xf;
37162                                               DataType dt =
37163                                                   ImmediateVmvn::DecodeDt(
37164                                                       cmode);
37165                                               if (dt.Is(
37166                                                       kDataTypeValueInvalid)) {
37167                                                 UnallocatedT32(instr);
37168                                                 return;
37169                                               }
37170                                               if (((instr >> 12) & 1) != 0) {
37171                                                 UnallocatedT32(instr);
37172                                                 return;
37173                                               }
37174                                               unsigned rd =
37175                                                   ExtractQRegister(instr,
37176                                                                    22,
37177                                                                    12);
37178                                               QOperand imm = ImmediateVmvn::
37179                                                   DecodeImmediate(cmode,
37180                                                                   (instr &
37181                                                                    0xf) |
37182                                                                       ((instr >>
37183                                                                         12) &
37184                                                                        0x70) |
37185                                                                       ((instr >>
37186                                                                         21) &
37187                                                                        0x80));
37188                                               // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37189                                               vmvn(CurrentCond(),
37190                                                    dt,
37191                                                    QRegister(rd),
37192                                                    imm);
37193                                               break;
37194                                             }
37195                                             default: {
37196                                               if (((instr & 0x920) == 0x100) ||
37197                                                   ((instr & 0x520) == 0x100) ||
37198                                                   ((instr & 0x820) == 0x20) ||
37199                                                   ((instr & 0x420) == 0x20) ||
37200                                                   ((instr & 0x220) == 0x20) ||
37201                                                   ((instr & 0x120) == 0x120)) {
37202                                                 UnallocatedT32(instr);
37203                                                 return;
37204                                               }
37205                                               unsigned cmode =
37206                                                   ((instr >> 8) & 0xf) |
37207                                                   ((instr >> 1) & 0x10);
37208                                               DataType dt =
37209                                                   ImmediateVmov::DecodeDt(
37210                                                       cmode);
37211                                               if (dt.Is(
37212                                                       kDataTypeValueInvalid)) {
37213                                                 UnallocatedT32(instr);
37214                                                 return;
37215                                               }
37216                                               if (((instr >> 12) & 1) != 0) {
37217                                                 UnallocatedT32(instr);
37218                                                 return;
37219                                               }
37220                                               unsigned rd =
37221                                                   ExtractQRegister(instr,
37222                                                                    22,
37223                                                                    12);
37224                                               QOperand imm = ImmediateVmov::
37225                                                   DecodeImmediate(cmode,
37226                                                                   (instr &
37227                                                                    0xf) |
37228                                                                       ((instr >>
37229                                                                         12) &
37230                                                                        0x70) |
37231                                                                       ((instr >>
37232                                                                         21) &
37233                                                                        0x80));
37234                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37235                                               vmov(CurrentCond(),
37236                                                    dt,
37237                                                    QRegister(rd),
37238                                                    imm);
37239                                               break;
37240                                             }
37241                                           }
37242                                           break;
37243                                         }
37244                                       }
37245                                       break;
37246                                     }
37247                                     case 0x00000100: {
37248                                       // 0xef800950
37249                                       switch (instr & 0x00000020) {
37250                                         case 0x00000000: {
37251                                           // 0xef800950
37252                                           if (((instr & 0x100) == 0x0) ||
37253                                               ((instr & 0xc00) == 0xc00)) {
37254                                             UnallocatedT32(instr);
37255                                             return;
37256                                           }
37257                                           unsigned cmode = (instr >> 8) & 0xf;
37258                                           DataType dt =
37259                                               ImmediateVorr::DecodeDt(cmode);
37260                                           if (dt.Is(kDataTypeValueInvalid)) {
37261                                             UnallocatedT32(instr);
37262                                             return;
37263                                           }
37264                                           if (((instr >> 12) & 1) != 0) {
37265                                             UnallocatedT32(instr);
37266                                             return;
37267                                           }
37268                                           unsigned rd =
37269                                               ExtractQRegister(instr, 22, 12);
37270                                           QOperand imm =
37271                                               ImmediateVorr::DecodeImmediate(
37272                                                   cmode,
37273                                                   (instr & 0xf) |
37274                                                       ((instr >> 12) & 0x70) |
37275                                                       ((instr >> 21) & 0x80));
37276                                           // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
37277                                           vorr(CurrentCond(),
37278                                                dt,
37279                                                QRegister(rd),
37280                                                QRegister(rd),
37281                                                imm);
37282                                           break;
37283                                         }
37284                                         case 0x00000020: {
37285                                           // 0xef800970
37286                                           if (((instr & 0x100) == 0x0) ||
37287                                               ((instr & 0xc00) == 0xc00)) {
37288                                             UnallocatedT32(instr);
37289                                             return;
37290                                           }
37291                                           unsigned cmode = (instr >> 8) & 0xf;
37292                                           DataType dt =
37293                                               ImmediateVbic::DecodeDt(cmode);
37294                                           if (dt.Is(kDataTypeValueInvalid)) {
37295                                             UnallocatedT32(instr);
37296                                             return;
37297                                           }
37298                                           if (((instr >> 12) & 1) != 0) {
37299                                             UnallocatedT32(instr);
37300                                             return;
37301                                           }
37302                                           unsigned rd =
37303                                               ExtractQRegister(instr, 22, 12);
37304                                           QOperand imm =
37305                                               ImmediateVbic::DecodeImmediate(
37306                                                   cmode,
37307                                                   (instr & 0xf) |
37308                                                       ((instr >> 12) & 0x70) |
37309                                                       ((instr >> 21) & 0x80));
37310                                           // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
37311                                           vbic(CurrentCond(),
37312                                                dt,
37313                                                QRegister(rd),
37314                                                QRegister(rd),
37315                                                imm);
37316                                           break;
37317                                         }
37318                                       }
37319                                       break;
37320                                     }
37321                                   }
37322                                   break;
37323                                 }
37324                                 default: {
37325                                   switch (instr & 0x00000300) {
37326                                     case 0x00000000: {
37327                                       // 0xef800850
37328                                       switch (instr & 0x10000000) {
37329                                         case 0x00000000: {
37330                                           // 0xef800850
37331                                           if (((instr & 0x380000) == 0x0)) {
37332                                             UnallocatedT32(instr);
37333                                             return;
37334                                           }
37335                                           DataType dt = Dt_imm6_3_Decode(
37336                                               (instr >> 19) & 0x7);
37337                                           if (dt.Is(kDataTypeValueInvalid)) {
37338                                             UnallocatedT32(instr);
37339                                             return;
37340                                           }
37341                                           unsigned rd =
37342                                               ExtractDRegister(instr, 22, 12);
37343                                           if ((instr & 1) != 0) {
37344                                             UnallocatedT32(instr);
37345                                             return;
37346                                           }
37347                                           unsigned rm =
37348                                               ExtractQRegister(instr, 5, 0);
37349                                           uint32_t imm6 = (instr >> 16) & 0x3f;
37350                                           uint32_t imm = dt.GetSize() - imm6;
37351                                           // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37352                                           vrshrn(CurrentCond(),
37353                                                  dt,
37354                                                  DRegister(rd),
37355                                                  QRegister(rm),
37356                                                  imm);
37357                                           break;
37358                                         }
37359                                         case 0x10000000: {
37360                                           // 0xff800850
37361                                           if (((instr & 0x380000) == 0x0)) {
37362                                             UnallocatedT32(instr);
37363                                             return;
37364                                           }
37365                                           DataType dt =
37366                                               Dt_imm6_2_Decode((instr >> 19) &
37367                                                                    0x7,
37368                                                                (instr >> 28) &
37369                                                                    0x1);
37370                                           if (dt.Is(kDataTypeValueInvalid)) {
37371                                             UnallocatedT32(instr);
37372                                             return;
37373                                           }
37374                                           unsigned rd =
37375                                               ExtractDRegister(instr, 22, 12);
37376                                           if ((instr & 1) != 0) {
37377                                             UnallocatedT32(instr);
37378                                             return;
37379                                           }
37380                                           unsigned rm =
37381                                               ExtractQRegister(instr, 5, 0);
37382                                           uint32_t imm6 = (instr >> 16) & 0x3f;
37383                                           uint32_t imm = dt.GetSize() - imm6;
37384                                           // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37385                                           vqrshrun(CurrentCond(),
37386                                                    dt,
37387                                                    DRegister(rd),
37388                                                    QRegister(rm),
37389                                                    imm);
37390                                           break;
37391                                         }
37392                                       }
37393                                       break;
37394                                     }
37395                                     case 0x00000100: {
37396                                       // 0xef800950
37397                                       if (((instr & 0x380000) == 0x0)) {
37398                                         UnallocatedT32(instr);
37399                                         return;
37400                                       }
37401                                       DataType dt =
37402                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
37403                                                            (instr >> 28) & 0x1);
37404                                       if (dt.Is(kDataTypeValueInvalid)) {
37405                                         UnallocatedT32(instr);
37406                                         return;
37407                                       }
37408                                       unsigned rd =
37409                                           ExtractDRegister(instr, 22, 12);
37410                                       if ((instr & 1) != 0) {
37411                                         UnallocatedT32(instr);
37412                                         return;
37413                                       }
37414                                       unsigned rm =
37415                                           ExtractQRegister(instr, 5, 0);
37416                                       uint32_t imm6 = (instr >> 16) & 0x3f;
37417                                       uint32_t imm = dt.GetSize() - imm6;
37418                                       // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
37419                                       vqrshrn(CurrentCond(),
37420                                               dt,
37421                                               DRegister(rd),
37422                                               QRegister(rm),
37423                                               imm);
37424                                       break;
37425                                     }
37426                                     default:
37427                                       UnallocatedT32(instr);
37428                                       break;
37429                                   }
37430                                   break;
37431                                 }
37432                               }
37433                               break;
37434                             }
37435                             default:
37436                               UnallocatedT32(instr);
37437                               break;
37438                           }
37439                           break;
37440                         }
37441                         case 0x00000c00: {
37442                           // 0xef800c50
37443                           switch (instr & 0x00000080) {
37444                             case 0x00000000: {
37445                               // 0xef800c50
37446                               switch (instr & 0x00200000) {
37447                                 case 0x00000000: {
37448                                   // 0xef800c50
37449                                   switch (instr & 0x00180000) {
37450                                     case 0x00000000: {
37451                                       // 0xef800c50
37452                                       switch (instr & 0x00000300) {
37453                                         case 0x00000200: {
37454                                           // 0xef800e50
37455                                           if (((instr & 0x920) == 0x100) ||
37456                                               ((instr & 0x520) == 0x100) ||
37457                                               ((instr & 0x820) == 0x20) ||
37458                                               ((instr & 0x420) == 0x20) ||
37459                                               ((instr & 0x220) == 0x20) ||
37460                                               ((instr & 0x120) == 0x120)) {
37461                                             UnallocatedT32(instr);
37462                                             return;
37463                                           }
37464                                           unsigned cmode =
37465                                               ((instr >> 8) & 0xf) |
37466                                               ((instr >> 1) & 0x10);
37467                                           DataType dt =
37468                                               ImmediateVmov::DecodeDt(cmode);
37469                                           if (dt.Is(kDataTypeValueInvalid)) {
37470                                             UnallocatedT32(instr);
37471                                             return;
37472                                           }
37473                                           if (((instr >> 12) & 1) != 0) {
37474                                             UnallocatedT32(instr);
37475                                             return;
37476                                           }
37477                                           unsigned rd =
37478                                               ExtractQRegister(instr, 22, 12);
37479                                           QOperand imm =
37480                                               ImmediateVmov::DecodeImmediate(
37481                                                   cmode,
37482                                                   (instr & 0xf) |
37483                                                       ((instr >> 12) & 0x70) |
37484                                                       ((instr >> 21) & 0x80));
37485                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37486                                           vmov(CurrentCond(),
37487                                                dt,
37488                                                QRegister(rd),
37489                                                imm);
37490                                           break;
37491                                         }
37492                                         case 0x00000300: {
37493                                           // 0xef800f50
37494                                           if (((instr & 0x920) == 0x100) ||
37495                                               ((instr & 0x520) == 0x100) ||
37496                                               ((instr & 0x820) == 0x20) ||
37497                                               ((instr & 0x420) == 0x20) ||
37498                                               ((instr & 0x220) == 0x20) ||
37499                                               ((instr & 0x120) == 0x120)) {
37500                                             UnallocatedT32(instr);
37501                                             return;
37502                                           }
37503                                           unsigned cmode =
37504                                               ((instr >> 8) & 0xf) |
37505                                               ((instr >> 1) & 0x10);
37506                                           DataType dt =
37507                                               ImmediateVmov::DecodeDt(cmode);
37508                                           if (dt.Is(kDataTypeValueInvalid)) {
37509                                             UnallocatedT32(instr);
37510                                             return;
37511                                           }
37512                                           if (((instr >> 12) & 1) != 0) {
37513                                             UnallocatedT32(instr);
37514                                             return;
37515                                           }
37516                                           unsigned rd =
37517                                               ExtractQRegister(instr, 22, 12);
37518                                           QOperand imm =
37519                                               ImmediateVmov::DecodeImmediate(
37520                                                   cmode,
37521                                                   (instr & 0xf) |
37522                                                       ((instr >> 12) & 0x70) |
37523                                                       ((instr >> 21) & 0x80));
37524                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37525                                           vmov(CurrentCond(),
37526                                                dt,
37527                                                QRegister(rd),
37528                                                imm);
37529                                           break;
37530                                         }
37531                                         default: {
37532                                           switch (instr & 0x00000020) {
37533                                             case 0x00000020: {
37534                                               // 0xef800c70
37535                                               switch (instr & 0x00000f20) {
37536                                                 case 0x00000000: {
37537                                                   // 0xef800c50
37538                                                   if (((instr & 0x920) ==
37539                                                        0x100) ||
37540                                                       ((instr & 0x520) ==
37541                                                        0x100) ||
37542                                                       ((instr & 0x820) ==
37543                                                        0x20) ||
37544                                                       ((instr & 0x420) ==
37545                                                        0x20) ||
37546                                                       ((instr & 0x220) ==
37547                                                        0x20) ||
37548                                                       ((instr & 0x120) ==
37549                                                        0x120)) {
37550                                                     UnallocatedT32(instr);
37551                                                     return;
37552                                                   }
37553                                                   unsigned cmode =
37554                                                       ((instr >> 8) & 0xf) |
37555                                                       ((instr >> 1) & 0x10);
37556                                                   DataType dt =
37557                                                       ImmediateVmov::DecodeDt(
37558                                                           cmode);
37559                                                   if (dt.Is(
37560                                                           kDataTypeValueInvalid)) {
37561                                                     UnallocatedT32(instr);
37562                                                     return;
37563                                                   }
37564                                                   if (((instr >> 12) & 1) !=
37565                                                       0) {
37566                                                     UnallocatedT32(instr);
37567                                                     return;
37568                                                   }
37569                                                   unsigned rd =
37570                                                       ExtractQRegister(instr,
37571                                                                        22,
37572                                                                        12);
37573                                                   QOperand imm = ImmediateVmov::
37574                                                       DecodeImmediate(
37575                                                           cmode,
37576                                                           (instr & 0xf) |
37577                                                               ((instr >> 12) &
37578                                                                0x70) |
37579                                                               ((instr >> 21) &
37580                                                                0x80));
37581                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37582                                                   vmov(CurrentCond(),
37583                                                        dt,
37584                                                        QRegister(rd),
37585                                                        imm);
37586                                                   break;
37587                                                 }
37588                                                 case 0x00000020: {
37589                                                   // 0xef800c70
37590                                                   if (((instr & 0xd00) ==
37591                                                        0x100) ||
37592                                                       ((instr & 0xd00) ==
37593                                                        0x500) ||
37594                                                       ((instr & 0xd00) ==
37595                                                        0x900) ||
37596                                                       ((instr & 0xe00) ==
37597                                                        0xe00)) {
37598                                                     UnallocatedT32(instr);
37599                                                     return;
37600                                                   }
37601                                                   unsigned cmode =
37602                                                       (instr >> 8) & 0xf;
37603                                                   DataType dt =
37604                                                       ImmediateVmvn::DecodeDt(
37605                                                           cmode);
37606                                                   if (dt.Is(
37607                                                           kDataTypeValueInvalid)) {
37608                                                     UnallocatedT32(instr);
37609                                                     return;
37610                                                   }
37611                                                   if (((instr >> 12) & 1) !=
37612                                                       0) {
37613                                                     UnallocatedT32(instr);
37614                                                     return;
37615                                                   }
37616                                                   unsigned rd =
37617                                                       ExtractQRegister(instr,
37618                                                                        22,
37619                                                                        12);
37620                                                   QOperand imm = ImmediateVmvn::
37621                                                       DecodeImmediate(
37622                                                           cmode,
37623                                                           (instr & 0xf) |
37624                                                               ((instr >> 12) &
37625                                                                0x70) |
37626                                                               ((instr >> 21) &
37627                                                                0x80));
37628                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37629                                                   vmvn(CurrentCond(),
37630                                                        dt,
37631                                                        QRegister(rd),
37632                                                        imm);
37633                                                   break;
37634                                                 }
37635                                                 case 0x00000200: {
37636                                                   // 0xef800e50
37637                                                   if (((instr & 0x920) ==
37638                                                        0x100) ||
37639                                                       ((instr & 0x520) ==
37640                                                        0x100) ||
37641                                                       ((instr & 0x820) ==
37642                                                        0x20) ||
37643                                                       ((instr & 0x420) ==
37644                                                        0x20) ||
37645                                                       ((instr & 0x220) ==
37646                                                        0x20) ||
37647                                                       ((instr & 0x120) ==
37648                                                        0x120)) {
37649                                                     UnallocatedT32(instr);
37650                                                     return;
37651                                                   }
37652                                                   unsigned cmode =
37653                                                       ((instr >> 8) & 0xf) |
37654                                                       ((instr >> 1) & 0x10);
37655                                                   DataType dt =
37656                                                       ImmediateVmov::DecodeDt(
37657                                                           cmode);
37658                                                   if (dt.Is(
37659                                                           kDataTypeValueInvalid)) {
37660                                                     UnallocatedT32(instr);
37661                                                     return;
37662                                                   }
37663                                                   if (((instr >> 12) & 1) !=
37664                                                       0) {
37665                                                     UnallocatedT32(instr);
37666                                                     return;
37667                                                   }
37668                                                   unsigned rd =
37669                                                       ExtractQRegister(instr,
37670                                                                        22,
37671                                                                        12);
37672                                                   QOperand imm = ImmediateVmov::
37673                                                       DecodeImmediate(
37674                                                           cmode,
37675                                                           (instr & 0xf) |
37676                                                               ((instr >> 12) &
37677                                                                0x70) |
37678                                                               ((instr >> 21) &
37679                                                                0x80));
37680                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37681                                                   vmov(CurrentCond(),
37682                                                        dt,
37683                                                        QRegister(rd),
37684                                                        imm);
37685                                                   break;
37686                                                 }
37687                                                 case 0x00000220: {
37688                                                   // 0xef800e70
37689                                                   if (((instr & 0xd00) ==
37690                                                        0x100) ||
37691                                                       ((instr & 0xd00) ==
37692                                                        0x500) ||
37693                                                       ((instr & 0xd00) ==
37694                                                        0x900) ||
37695                                                       ((instr & 0xe00) ==
37696                                                        0xe00)) {
37697                                                     UnallocatedT32(instr);
37698                                                     return;
37699                                                   }
37700                                                   unsigned cmode =
37701                                                       (instr >> 8) & 0xf;
37702                                                   DataType dt =
37703                                                       ImmediateVmvn::DecodeDt(
37704                                                           cmode);
37705                                                   if (dt.Is(
37706                                                           kDataTypeValueInvalid)) {
37707                                                     UnallocatedT32(instr);
37708                                                     return;
37709                                                   }
37710                                                   if (((instr >> 12) & 1) !=
37711                                                       0) {
37712                                                     UnallocatedT32(instr);
37713                                                     return;
37714                                                   }
37715                                                   unsigned rd =
37716                                                       ExtractQRegister(instr,
37717                                                                        22,
37718                                                                        12);
37719                                                   QOperand imm = ImmediateVmvn::
37720                                                       DecodeImmediate(
37721                                                           cmode,
37722                                                           (instr & 0xf) |
37723                                                               ((instr >> 12) &
37724                                                                0x70) |
37725                                                               ((instr >> 21) &
37726                                                                0x80));
37727                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37728                                                   vmvn(CurrentCond(),
37729                                                        dt,
37730                                                        QRegister(rd),
37731                                                        imm);
37732                                                   break;
37733                                                 }
37734                                                 case 0x00000400: {
37735                                                   // 0xef800c50
37736                                                   if (((instr & 0x920) ==
37737                                                        0x100) ||
37738                                                       ((instr & 0x520) ==
37739                                                        0x100) ||
37740                                                       ((instr & 0x820) ==
37741                                                        0x20) ||
37742                                                       ((instr & 0x420) ==
37743                                                        0x20) ||
37744                                                       ((instr & 0x220) ==
37745                                                        0x20) ||
37746                                                       ((instr & 0x120) ==
37747                                                        0x120)) {
37748                                                     UnallocatedT32(instr);
37749                                                     return;
37750                                                   }
37751                                                   unsigned cmode =
37752                                                       ((instr >> 8) & 0xf) |
37753                                                       ((instr >> 1) & 0x10);
37754                                                   DataType dt =
37755                                                       ImmediateVmov::DecodeDt(
37756                                                           cmode);
37757                                                   if (dt.Is(
37758                                                           kDataTypeValueInvalid)) {
37759                                                     UnallocatedT32(instr);
37760                                                     return;
37761                                                   }
37762                                                   if (((instr >> 12) & 1) !=
37763                                                       0) {
37764                                                     UnallocatedT32(instr);
37765                                                     return;
37766                                                   }
37767                                                   unsigned rd =
37768                                                       ExtractQRegister(instr,
37769                                                                        22,
37770                                                                        12);
37771                                                   QOperand imm = ImmediateVmov::
37772                                                       DecodeImmediate(
37773                                                           cmode,
37774                                                           (instr & 0xf) |
37775                                                               ((instr >> 12) &
37776                                                                0x70) |
37777                                                               ((instr >> 21) &
37778                                                                0x80));
37779                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37780                                                   vmov(CurrentCond(),
37781                                                        dt,
37782                                                        QRegister(rd),
37783                                                        imm);
37784                                                   break;
37785                                                 }
37786                                                 case 0x00000420: {
37787                                                   // 0xef800c70
37788                                                   if (((instr & 0xd00) ==
37789                                                        0x100) ||
37790                                                       ((instr & 0xd00) ==
37791                                                        0x500) ||
37792                                                       ((instr & 0xd00) ==
37793                                                        0x900) ||
37794                                                       ((instr & 0xe00) ==
37795                                                        0xe00)) {
37796                                                     UnallocatedT32(instr);
37797                                                     return;
37798                                                   }
37799                                                   unsigned cmode =
37800                                                       (instr >> 8) & 0xf;
37801                                                   DataType dt =
37802                                                       ImmediateVmvn::DecodeDt(
37803                                                           cmode);
37804                                                   if (dt.Is(
37805                                                           kDataTypeValueInvalid)) {
37806                                                     UnallocatedT32(instr);
37807                                                     return;
37808                                                   }
37809                                                   if (((instr >> 12) & 1) !=
37810                                                       0) {
37811                                                     UnallocatedT32(instr);
37812                                                     return;
37813                                                   }
37814                                                   unsigned rd =
37815                                                       ExtractQRegister(instr,
37816                                                                        22,
37817                                                                        12);
37818                                                   QOperand imm = ImmediateVmvn::
37819                                                       DecodeImmediate(
37820                                                           cmode,
37821                                                           (instr & 0xf) |
37822                                                               ((instr >> 12) &
37823                                                                0x70) |
37824                                                               ((instr >> 21) &
37825                                                                0x80));
37826                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37827                                                   vmvn(CurrentCond(),
37828                                                        dt,
37829                                                        QRegister(rd),
37830                                                        imm);
37831                                                   break;
37832                                                 }
37833                                                 case 0x00000600: {
37834                                                   // 0xef800e50
37835                                                   if (((instr & 0x920) ==
37836                                                        0x100) ||
37837                                                       ((instr & 0x520) ==
37838                                                        0x100) ||
37839                                                       ((instr & 0x820) ==
37840                                                        0x20) ||
37841                                                       ((instr & 0x420) ==
37842                                                        0x20) ||
37843                                                       ((instr & 0x220) ==
37844                                                        0x20) ||
37845                                                       ((instr & 0x120) ==
37846                                                        0x120)) {
37847                                                     UnallocatedT32(instr);
37848                                                     return;
37849                                                   }
37850                                                   unsigned cmode =
37851                                                       ((instr >> 8) & 0xf) |
37852                                                       ((instr >> 1) & 0x10);
37853                                                   DataType dt =
37854                                                       ImmediateVmov::DecodeDt(
37855                                                           cmode);
37856                                                   if (dt.Is(
37857                                                           kDataTypeValueInvalid)) {
37858                                                     UnallocatedT32(instr);
37859                                                     return;
37860                                                   }
37861                                                   if (((instr >> 12) & 1) !=
37862                                                       0) {
37863                                                     UnallocatedT32(instr);
37864                                                     return;
37865                                                   }
37866                                                   unsigned rd =
37867                                                       ExtractQRegister(instr,
37868                                                                        22,
37869                                                                        12);
37870                                                   QOperand imm = ImmediateVmov::
37871                                                       DecodeImmediate(
37872                                                           cmode,
37873                                                           (instr & 0xf) |
37874                                                               ((instr >> 12) &
37875                                                                0x70) |
37876                                                               ((instr >> 21) &
37877                                                                0x80));
37878                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37879                                                   vmov(CurrentCond(),
37880                                                        dt,
37881                                                        QRegister(rd),
37882                                                        imm);
37883                                                   break;
37884                                                 }
37885                                                 case 0x00000620: {
37886                                                   // 0xef800e70
37887                                                   if (((instr & 0xd00) ==
37888                                                        0x100) ||
37889                                                       ((instr & 0xd00) ==
37890                                                        0x500) ||
37891                                                       ((instr & 0xd00) ==
37892                                                        0x900) ||
37893                                                       ((instr & 0xe00) ==
37894                                                        0xe00)) {
37895                                                     UnallocatedT32(instr);
37896                                                     return;
37897                                                   }
37898                                                   unsigned cmode =
37899                                                       (instr >> 8) & 0xf;
37900                                                   DataType dt =
37901                                                       ImmediateVmvn::DecodeDt(
37902                                                           cmode);
37903                                                   if (dt.Is(
37904                                                           kDataTypeValueInvalid)) {
37905                                                     UnallocatedT32(instr);
37906                                                     return;
37907                                                   }
37908                                                   if (((instr >> 12) & 1) !=
37909                                                       0) {
37910                                                     UnallocatedT32(instr);
37911                                                     return;
37912                                                   }
37913                                                   unsigned rd =
37914                                                       ExtractQRegister(instr,
37915                                                                        22,
37916                                                                        12);
37917                                                   QOperand imm = ImmediateVmvn::
37918                                                       DecodeImmediate(
37919                                                           cmode,
37920                                                           (instr & 0xf) |
37921                                                               ((instr >> 12) &
37922                                                                0x70) |
37923                                                               ((instr >> 21) &
37924                                                                0x80));
37925                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37926                                                   vmvn(CurrentCond(),
37927                                                        dt,
37928                                                        QRegister(rd),
37929                                                        imm);
37930                                                   break;
37931                                                 }
37932                                                 case 0x00000800: {
37933                                                   // 0xef800c50
37934                                                   if (((instr & 0x920) ==
37935                                                        0x100) ||
37936                                                       ((instr & 0x520) ==
37937                                                        0x100) ||
37938                                                       ((instr & 0x820) ==
37939                                                        0x20) ||
37940                                                       ((instr & 0x420) ==
37941                                                        0x20) ||
37942                                                       ((instr & 0x220) ==
37943                                                        0x20) ||
37944                                                       ((instr & 0x120) ==
37945                                                        0x120)) {
37946                                                     UnallocatedT32(instr);
37947                                                     return;
37948                                                   }
37949                                                   unsigned cmode =
37950                                                       ((instr >> 8) & 0xf) |
37951                                                       ((instr >> 1) & 0x10);
37952                                                   DataType dt =
37953                                                       ImmediateVmov::DecodeDt(
37954                                                           cmode);
37955                                                   if (dt.Is(
37956                                                           kDataTypeValueInvalid)) {
37957                                                     UnallocatedT32(instr);
37958                                                     return;
37959                                                   }
37960                                                   if (((instr >> 12) & 1) !=
37961                                                       0) {
37962                                                     UnallocatedT32(instr);
37963                                                     return;
37964                                                   }
37965                                                   unsigned rd =
37966                                                       ExtractQRegister(instr,
37967                                                                        22,
37968                                                                        12);
37969                                                   QOperand imm = ImmediateVmov::
37970                                                       DecodeImmediate(
37971                                                           cmode,
37972                                                           (instr & 0xf) |
37973                                                               ((instr >> 12) &
37974                                                                0x70) |
37975                                                               ((instr >> 21) &
37976                                                                0x80));
37977                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
37978                                                   vmov(CurrentCond(),
37979                                                        dt,
37980                                                        QRegister(rd),
37981                                                        imm);
37982                                                   break;
37983                                                 }
37984                                                 case 0x00000820: {
37985                                                   // 0xef800c70
37986                                                   if (((instr & 0xd00) ==
37987                                                        0x100) ||
37988                                                       ((instr & 0xd00) ==
37989                                                        0x500) ||
37990                                                       ((instr & 0xd00) ==
37991                                                        0x900) ||
37992                                                       ((instr & 0xe00) ==
37993                                                        0xe00)) {
37994                                                     UnallocatedT32(instr);
37995                                                     return;
37996                                                   }
37997                                                   unsigned cmode =
37998                                                       (instr >> 8) & 0xf;
37999                                                   DataType dt =
38000                                                       ImmediateVmvn::DecodeDt(
38001                                                           cmode);
38002                                                   if (dt.Is(
38003                                                           kDataTypeValueInvalid)) {
38004                                                     UnallocatedT32(instr);
38005                                                     return;
38006                                                   }
38007                                                   if (((instr >> 12) & 1) !=
38008                                                       0) {
38009                                                     UnallocatedT32(instr);
38010                                                     return;
38011                                                   }
38012                                                   unsigned rd =
38013                                                       ExtractQRegister(instr,
38014                                                                        22,
38015                                                                        12);
38016                                                   QOperand imm = ImmediateVmvn::
38017                                                       DecodeImmediate(
38018                                                           cmode,
38019                                                           (instr & 0xf) |
38020                                                               ((instr >> 12) &
38021                                                                0x70) |
38022                                                               ((instr >> 21) &
38023                                                                0x80));
38024                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38025                                                   vmvn(CurrentCond(),
38026                                                        dt,
38027                                                        QRegister(rd),
38028                                                        imm);
38029                                                   break;
38030                                                 }
38031                                                 case 0x00000a00: {
38032                                                   // 0xef800e50
38033                                                   if (((instr & 0x920) ==
38034                                                        0x100) ||
38035                                                       ((instr & 0x520) ==
38036                                                        0x100) ||
38037                                                       ((instr & 0x820) ==
38038                                                        0x20) ||
38039                                                       ((instr & 0x420) ==
38040                                                        0x20) ||
38041                                                       ((instr & 0x220) ==
38042                                                        0x20) ||
38043                                                       ((instr & 0x120) ==
38044                                                        0x120)) {
38045                                                     UnallocatedT32(instr);
38046                                                     return;
38047                                                   }
38048                                                   unsigned cmode =
38049                                                       ((instr >> 8) & 0xf) |
38050                                                       ((instr >> 1) & 0x10);
38051                                                   DataType dt =
38052                                                       ImmediateVmov::DecodeDt(
38053                                                           cmode);
38054                                                   if (dt.Is(
38055                                                           kDataTypeValueInvalid)) {
38056                                                     UnallocatedT32(instr);
38057                                                     return;
38058                                                   }
38059                                                   if (((instr >> 12) & 1) !=
38060                                                       0) {
38061                                                     UnallocatedT32(instr);
38062                                                     return;
38063                                                   }
38064                                                   unsigned rd =
38065                                                       ExtractQRegister(instr,
38066                                                                        22,
38067                                                                        12);
38068                                                   QOperand imm = ImmediateVmov::
38069                                                       DecodeImmediate(
38070                                                           cmode,
38071                                                           (instr & 0xf) |
38072                                                               ((instr >> 12) &
38073                                                                0x70) |
38074                                                               ((instr >> 21) &
38075                                                                0x80));
38076                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38077                                                   vmov(CurrentCond(),
38078                                                        dt,
38079                                                        QRegister(rd),
38080                                                        imm);
38081                                                   break;
38082                                                 }
38083                                                 case 0x00000a20: {
38084                                                   // 0xef800e70
38085                                                   if (((instr & 0xd00) ==
38086                                                        0x100) ||
38087                                                       ((instr & 0xd00) ==
38088                                                        0x500) ||
38089                                                       ((instr & 0xd00) ==
38090                                                        0x900) ||
38091                                                       ((instr & 0xe00) ==
38092                                                        0xe00)) {
38093                                                     UnallocatedT32(instr);
38094                                                     return;
38095                                                   }
38096                                                   unsigned cmode =
38097                                                       (instr >> 8) & 0xf;
38098                                                   DataType dt =
38099                                                       ImmediateVmvn::DecodeDt(
38100                                                           cmode);
38101                                                   if (dt.Is(
38102                                                           kDataTypeValueInvalid)) {
38103                                                     UnallocatedT32(instr);
38104                                                     return;
38105                                                   }
38106                                                   if (((instr >> 12) & 1) !=
38107                                                       0) {
38108                                                     UnallocatedT32(instr);
38109                                                     return;
38110                                                   }
38111                                                   unsigned rd =
38112                                                       ExtractQRegister(instr,
38113                                                                        22,
38114                                                                        12);
38115                                                   QOperand imm = ImmediateVmvn::
38116                                                       DecodeImmediate(
38117                                                           cmode,
38118                                                           (instr & 0xf) |
38119                                                               ((instr >> 12) &
38120                                                                0x70) |
38121                                                               ((instr >> 21) &
38122                                                                0x80));
38123                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38124                                                   vmvn(CurrentCond(),
38125                                                        dt,
38126                                                        QRegister(rd),
38127                                                        imm);
38128                                                   break;
38129                                                 }
38130                                                 case 0x00000c00: {
38131                                                   // 0xef800c50
38132                                                   if (((instr & 0x920) ==
38133                                                        0x100) ||
38134                                                       ((instr & 0x520) ==
38135                                                        0x100) ||
38136                                                       ((instr & 0x820) ==
38137                                                        0x20) ||
38138                                                       ((instr & 0x420) ==
38139                                                        0x20) ||
38140                                                       ((instr & 0x220) ==
38141                                                        0x20) ||
38142                                                       ((instr & 0x120) ==
38143                                                        0x120)) {
38144                                                     UnallocatedT32(instr);
38145                                                     return;
38146                                                   }
38147                                                   unsigned cmode =
38148                                                       ((instr >> 8) & 0xf) |
38149                                                       ((instr >> 1) & 0x10);
38150                                                   DataType dt =
38151                                                       ImmediateVmov::DecodeDt(
38152                                                           cmode);
38153                                                   if (dt.Is(
38154                                                           kDataTypeValueInvalid)) {
38155                                                     UnallocatedT32(instr);
38156                                                     return;
38157                                                   }
38158                                                   if (((instr >> 12) & 1) !=
38159                                                       0) {
38160                                                     UnallocatedT32(instr);
38161                                                     return;
38162                                                   }
38163                                                   unsigned rd =
38164                                                       ExtractQRegister(instr,
38165                                                                        22,
38166                                                                        12);
38167                                                   QOperand imm = ImmediateVmov::
38168                                                       DecodeImmediate(
38169                                                           cmode,
38170                                                           (instr & 0xf) |
38171                                                               ((instr >> 12) &
38172                                                                0x70) |
38173                                                               ((instr >> 21) &
38174                                                                0x80));
38175                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38176                                                   vmov(CurrentCond(),
38177                                                        dt,
38178                                                        QRegister(rd),
38179                                                        imm);
38180                                                   break;
38181                                                 }
38182                                                 case 0x00000c20: {
38183                                                   // 0xef800c70
38184                                                   if (((instr & 0xd00) ==
38185                                                        0x100) ||
38186                                                       ((instr & 0xd00) ==
38187                                                        0x500) ||
38188                                                       ((instr & 0xd00) ==
38189                                                        0x900) ||
38190                                                       ((instr & 0xe00) ==
38191                                                        0xe00)) {
38192                                                     UnallocatedT32(instr);
38193                                                     return;
38194                                                   }
38195                                                   unsigned cmode =
38196                                                       (instr >> 8) & 0xf;
38197                                                   DataType dt =
38198                                                       ImmediateVmvn::DecodeDt(
38199                                                           cmode);
38200                                                   if (dt.Is(
38201                                                           kDataTypeValueInvalid)) {
38202                                                     UnallocatedT32(instr);
38203                                                     return;
38204                                                   }
38205                                                   if (((instr >> 12) & 1) !=
38206                                                       0) {
38207                                                     UnallocatedT32(instr);
38208                                                     return;
38209                                                   }
38210                                                   unsigned rd =
38211                                                       ExtractQRegister(instr,
38212                                                                        22,
38213                                                                        12);
38214                                                   QOperand imm = ImmediateVmvn::
38215                                                       DecodeImmediate(
38216                                                           cmode,
38217                                                           (instr & 0xf) |
38218                                                               ((instr >> 12) &
38219                                                                0x70) |
38220                                                               ((instr >> 21) &
38221                                                                0x80));
38222                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38223                                                   vmvn(CurrentCond(),
38224                                                        dt,
38225                                                        QRegister(rd),
38226                                                        imm);
38227                                                   break;
38228                                                 }
38229                                                 case 0x00000d00: {
38230                                                   // 0xef800d50
38231                                                   if (((instr & 0x920) ==
38232                                                        0x100) ||
38233                                                       ((instr & 0x520) ==
38234                                                        0x100) ||
38235                                                       ((instr & 0x820) ==
38236                                                        0x20) ||
38237                                                       ((instr & 0x420) ==
38238                                                        0x20) ||
38239                                                       ((instr & 0x220) ==
38240                                                        0x20) ||
38241                                                       ((instr & 0x120) ==
38242                                                        0x120)) {
38243                                                     UnallocatedT32(instr);
38244                                                     return;
38245                                                   }
38246                                                   unsigned cmode =
38247                                                       ((instr >> 8) & 0xf) |
38248                                                       ((instr >> 1) & 0x10);
38249                                                   DataType dt =
38250                                                       ImmediateVmov::DecodeDt(
38251                                                           cmode);
38252                                                   if (dt.Is(
38253                                                           kDataTypeValueInvalid)) {
38254                                                     UnallocatedT32(instr);
38255                                                     return;
38256                                                   }
38257                                                   if (((instr >> 12) & 1) !=
38258                                                       0) {
38259                                                     UnallocatedT32(instr);
38260                                                     return;
38261                                                   }
38262                                                   unsigned rd =
38263                                                       ExtractQRegister(instr,
38264                                                                        22,
38265                                                                        12);
38266                                                   QOperand imm = ImmediateVmov::
38267                                                       DecodeImmediate(
38268                                                           cmode,
38269                                                           (instr & 0xf) |
38270                                                               ((instr >> 12) &
38271                                                                0x70) |
38272                                                               ((instr >> 21) &
38273                                                                0x80));
38274                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38275                                                   vmov(CurrentCond(),
38276                                                        dt,
38277                                                        QRegister(rd),
38278                                                        imm);
38279                                                   break;
38280                                                 }
38281                                                 case 0x00000d20: {
38282                                                   // 0xef800d70
38283                                                   if (((instr & 0xd00) ==
38284                                                        0x100) ||
38285                                                       ((instr & 0xd00) ==
38286                                                        0x500) ||
38287                                                       ((instr & 0xd00) ==
38288                                                        0x900) ||
38289                                                       ((instr & 0xe00) ==
38290                                                        0xe00)) {
38291                                                     UnallocatedT32(instr);
38292                                                     return;
38293                                                   }
38294                                                   unsigned cmode =
38295                                                       (instr >> 8) & 0xf;
38296                                                   DataType dt =
38297                                                       ImmediateVmvn::DecodeDt(
38298                                                           cmode);
38299                                                   if (dt.Is(
38300                                                           kDataTypeValueInvalid)) {
38301                                                     UnallocatedT32(instr);
38302                                                     return;
38303                                                   }
38304                                                   if (((instr >> 12) & 1) !=
38305                                                       0) {
38306                                                     UnallocatedT32(instr);
38307                                                     return;
38308                                                   }
38309                                                   unsigned rd =
38310                                                       ExtractQRegister(instr,
38311                                                                        22,
38312                                                                        12);
38313                                                   QOperand imm = ImmediateVmvn::
38314                                                       DecodeImmediate(
38315                                                           cmode,
38316                                                           (instr & 0xf) |
38317                                                               ((instr >> 12) &
38318                                                                0x70) |
38319                                                               ((instr >> 21) &
38320                                                                0x80));
38321                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38322                                                   vmvn(CurrentCond(),
38323                                                        dt,
38324                                                        QRegister(rd),
38325                                                        imm);
38326                                                   break;
38327                                                 }
38328                                                 case 0x00000e00: {
38329                                                   // 0xef800e50
38330                                                   if (((instr & 0x920) ==
38331                                                        0x100) ||
38332                                                       ((instr & 0x520) ==
38333                                                        0x100) ||
38334                                                       ((instr & 0x820) ==
38335                                                        0x20) ||
38336                                                       ((instr & 0x420) ==
38337                                                        0x20) ||
38338                                                       ((instr & 0x220) ==
38339                                                        0x20) ||
38340                                                       ((instr & 0x120) ==
38341                                                        0x120)) {
38342                                                     UnallocatedT32(instr);
38343                                                     return;
38344                                                   }
38345                                                   unsigned cmode =
38346                                                       ((instr >> 8) & 0xf) |
38347                                                       ((instr >> 1) & 0x10);
38348                                                   DataType dt =
38349                                                       ImmediateVmov::DecodeDt(
38350                                                           cmode);
38351                                                   if (dt.Is(
38352                                                           kDataTypeValueInvalid)) {
38353                                                     UnallocatedT32(instr);
38354                                                     return;
38355                                                   }
38356                                                   if (((instr >> 12) & 1) !=
38357                                                       0) {
38358                                                     UnallocatedT32(instr);
38359                                                     return;
38360                                                   }
38361                                                   unsigned rd =
38362                                                       ExtractQRegister(instr,
38363                                                                        22,
38364                                                                        12);
38365                                                   QOperand imm = ImmediateVmov::
38366                                                       DecodeImmediate(
38367                                                           cmode,
38368                                                           (instr & 0xf) |
38369                                                               ((instr >> 12) &
38370                                                                0x70) |
38371                                                               ((instr >> 21) &
38372                                                                0x80));
38373                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38374                                                   vmov(CurrentCond(),
38375                                                        dt,
38376                                                        QRegister(rd),
38377                                                        imm);
38378                                                   break;
38379                                                 }
38380                                                 case 0x00000e20: {
38381                                                   // 0xef800e70
38382                                                   if (((instr & 0x920) ==
38383                                                        0x100) ||
38384                                                       ((instr & 0x520) ==
38385                                                        0x100) ||
38386                                                       ((instr & 0x820) ==
38387                                                        0x20) ||
38388                                                       ((instr & 0x420) ==
38389                                                        0x20) ||
38390                                                       ((instr & 0x220) ==
38391                                                        0x20) ||
38392                                                       ((instr & 0x120) ==
38393                                                        0x120)) {
38394                                                     UnallocatedT32(instr);
38395                                                     return;
38396                                                   }
38397                                                   unsigned cmode =
38398                                                       ((instr >> 8) & 0xf) |
38399                                                       ((instr >> 1) & 0x10);
38400                                                   DataType dt =
38401                                                       ImmediateVmov::DecodeDt(
38402                                                           cmode);
38403                                                   if (dt.Is(
38404                                                           kDataTypeValueInvalid)) {
38405                                                     UnallocatedT32(instr);
38406                                                     return;
38407                                                   }
38408                                                   if (((instr >> 12) & 1) !=
38409                                                       0) {
38410                                                     UnallocatedT32(instr);
38411                                                     return;
38412                                                   }
38413                                                   unsigned rd =
38414                                                       ExtractQRegister(instr,
38415                                                                        22,
38416                                                                        12);
38417                                                   QOperand imm = ImmediateVmov::
38418                                                       DecodeImmediate(
38419                                                           cmode,
38420                                                           (instr & 0xf) |
38421                                                               ((instr >> 12) &
38422                                                                0x70) |
38423                                                               ((instr >> 21) &
38424                                                                0x80));
38425                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38426                                                   vmov(CurrentCond(),
38427                                                        dt,
38428                                                        QRegister(rd),
38429                                                        imm);
38430                                                   break;
38431                                                 }
38432                                                 case 0x00000f00: {
38433                                                   // 0xef800f50
38434                                                   if (((instr & 0x920) ==
38435                                                        0x100) ||
38436                                                       ((instr & 0x520) ==
38437                                                        0x100) ||
38438                                                       ((instr & 0x820) ==
38439                                                        0x20) ||
38440                                                       ((instr & 0x420) ==
38441                                                        0x20) ||
38442                                                       ((instr & 0x220) ==
38443                                                        0x20) ||
38444                                                       ((instr & 0x120) ==
38445                                                        0x120)) {
38446                                                     UnallocatedT32(instr);
38447                                                     return;
38448                                                   }
38449                                                   unsigned cmode =
38450                                                       ((instr >> 8) & 0xf) |
38451                                                       ((instr >> 1) & 0x10);
38452                                                   DataType dt =
38453                                                       ImmediateVmov::DecodeDt(
38454                                                           cmode);
38455                                                   if (dt.Is(
38456                                                           kDataTypeValueInvalid)) {
38457                                                     UnallocatedT32(instr);
38458                                                     return;
38459                                                   }
38460                                                   if (((instr >> 12) & 1) !=
38461                                                       0) {
38462                                                     UnallocatedT32(instr);
38463                                                     return;
38464                                                   }
38465                                                   unsigned rd =
38466                                                       ExtractQRegister(instr,
38467                                                                        22,
38468                                                                        12);
38469                                                   QOperand imm = ImmediateVmov::
38470                                                       DecodeImmediate(
38471                                                           cmode,
38472                                                           (instr & 0xf) |
38473                                                               ((instr >> 12) &
38474                                                                0x70) |
38475                                                               ((instr >> 21) &
38476                                                                0x80));
38477                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38478                                                   vmov(CurrentCond(),
38479                                                        dt,
38480                                                        QRegister(rd),
38481                                                        imm);
38482                                                   break;
38483                                                 }
38484                                                 default:
38485                                                   UnallocatedT32(instr);
38486                                                   break;
38487                                               }
38488                                               break;
38489                                             }
38490                                             default: {
38491                                               if (((instr & 0x920) == 0x100) ||
38492                                                   ((instr & 0x520) == 0x100) ||
38493                                                   ((instr & 0x820) == 0x20) ||
38494                                                   ((instr & 0x420) == 0x20) ||
38495                                                   ((instr & 0x220) == 0x20) ||
38496                                                   ((instr & 0x120) == 0x120)) {
38497                                                 UnallocatedT32(instr);
38498                                                 return;
38499                                               }
38500                                               unsigned cmode =
38501                                                   ((instr >> 8) & 0xf) |
38502                                                   ((instr >> 1) & 0x10);
38503                                               DataType dt =
38504                                                   ImmediateVmov::DecodeDt(
38505                                                       cmode);
38506                                               if (dt.Is(
38507                                                       kDataTypeValueInvalid)) {
38508                                                 UnallocatedT32(instr);
38509                                                 return;
38510                                               }
38511                                               if (((instr >> 12) & 1) != 0) {
38512                                                 UnallocatedT32(instr);
38513                                                 return;
38514                                               }
38515                                               unsigned rd =
38516                                                   ExtractQRegister(instr,
38517                                                                    22,
38518                                                                    12);
38519                                               QOperand imm = ImmediateVmov::
38520                                                   DecodeImmediate(cmode,
38521                                                                   (instr &
38522                                                                    0xf) |
38523                                                                       ((instr >>
38524                                                                         12) &
38525                                                                        0x70) |
38526                                                                       ((instr >>
38527                                                                         21) &
38528                                                                        0x80));
38529                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
38530                                               vmov(CurrentCond(),
38531                                                    dt,
38532                                                    QRegister(rd),
38533                                                    imm);
38534                                               break;
38535                                             }
38536                                           }
38537                                           break;
38538                                         }
38539                                       }
38540                                       break;
38541                                     }
38542                                     default:
38543                                       UnallocatedT32(instr);
38544                                       break;
38545                                   }
38546                                   break;
38547                                 }
38548                                 default: {
38549                                   if ((instr & 0x00000200) == 0x00000200) {
38550                                     if (((instr & 0x200000) == 0x0)) {
38551                                       UnallocatedT32(instr);
38552                                       return;
38553                                     }
38554                                     DataType dt1 = Dt_op_U_1_Decode1(
38555                                         ((instr >> 28) & 0x1) |
38556                                         ((instr >> 7) & 0x2));
38557                                     if (dt1.Is(kDataTypeValueInvalid)) {
38558                                       UnallocatedT32(instr);
38559                                       return;
38560                                     }
38561                                     DataType dt2 = Dt_op_U_1_Decode2(
38562                                         ((instr >> 28) & 0x1) |
38563                                         ((instr >> 7) & 0x2));
38564                                     if (dt2.Is(kDataTypeValueInvalid)) {
38565                                       UnallocatedT32(instr);
38566                                       return;
38567                                     }
38568                                     if (((instr >> 12) & 1) != 0) {
38569                                       UnallocatedT32(instr);
38570                                       return;
38571                                     }
38572                                     unsigned rd =
38573                                         ExtractQRegister(instr, 22, 12);
38574                                     if ((instr & 1) != 0) {
38575                                       UnallocatedT32(instr);
38576                                       return;
38577                                     }
38578                                     unsigned rm = ExtractQRegister(instr, 5, 0);
38579                                     uint32_t fbits =
38580                                         64 - ((instr >> 16) & 0x3f);
38581                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
38582                                     vcvt(CurrentCond(),
38583                                          dt1,
38584                                          dt2,
38585                                          QRegister(rd),
38586                                          QRegister(rm),
38587                                          fbits);
38588                                   } else {
38589                                     UnallocatedT32(instr);
38590                                   }
38591                                   break;
38592                                 }
38593                               }
38594                               break;
38595                             }
38596                             default:
38597                               UnallocatedT32(instr);
38598                               break;
38599                           }
38600                           break;
38601                         }
38602                       }
38603                       break;
38604                     }
38605                   }
38606                   break;
38607                 }
38608               }
38609               break;
38610             }
38611           }
38612           break;
38613         }
38614       }
38615       break;
38616     }
38617   }
38618 }  // NOLINT(readability/fn_size)
38619 
DecodeA32(uint32_t instr)38620 void Disassembler::DecodeA32(uint32_t instr) {
38621   A32CodeAddressIncrementer incrementer(&code_address_);
38622   if ((instr & 0xf0000000) == 0xf0000000) {
38623     switch (instr & 0x0e000000) {
38624       case 0x00000000: {
38625         // 0xf0000000
38626         switch (instr & 0x01f10020) {
38627           case 0x01000000: {
38628             // 0xf1000000
38629             switch (instr & 0x000e0000) {
38630               case 0x00020000: {
38631                 // 0xf1020000
38632                 if ((instr & 0x000001c0) == 0x00000000) {
38633                   UnimplementedA32("CPS", instr);
38634                 } else {
38635                   UnallocatedA32(instr);
38636                 }
38637                 break;
38638               }
38639               case 0x00080000: {
38640                 // 0xf1080000
38641                 if ((instr & 0x0000001f) == 0x00000000) {
38642                   UnimplementedA32("CPSIE", instr);
38643                 } else {
38644                   UnallocatedA32(instr);
38645                 }
38646                 break;
38647               }
38648               case 0x000a0000: {
38649                 // 0xf10a0000
38650                 UnimplementedA32("CPSIE", instr);
38651                 break;
38652               }
38653               case 0x000c0000: {
38654                 // 0xf10c0000
38655                 if ((instr & 0x0000001f) == 0x00000000) {
38656                   UnimplementedA32("CPSID", instr);
38657                 } else {
38658                   UnallocatedA32(instr);
38659                 }
38660                 break;
38661               }
38662               case 0x000e0000: {
38663                 // 0xf10e0000
38664                 UnimplementedA32("CPSID", instr);
38665                 break;
38666               }
38667               default:
38668                 UnallocatedA32(instr);
38669                 break;
38670             }
38671             break;
38672           }
38673           case 0x01010000: {
38674             // 0xf1010000
38675             if ((instr & 0x000000d0) == 0x00000000) {
38676               UnimplementedA32("SETEND", instr);
38677             } else {
38678               UnallocatedA32(instr);
38679             }
38680             break;
38681           }
38682           default:
38683             UnallocatedA32(instr);
38684             break;
38685         }
38686         break;
38687       }
38688       case 0x02000000: {
38689         // 0xf2000000
38690         switch (instr & 0x00800010) {
38691           case 0x00000000: {
38692             // 0xf2000000
38693             switch (instr & 0x00000f40) {
38694               case 0x00000000: {
38695                 // 0xf2000000
38696                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38697                                                  ((instr >> 22) & 0x4));
38698                 if (dt.Is(kDataTypeValueInvalid)) {
38699                   UnallocatedA32(instr);
38700                   return;
38701                 }
38702                 unsigned rd = ExtractDRegister(instr, 22, 12);
38703                 unsigned rn = ExtractDRegister(instr, 7, 16);
38704                 unsigned rm = ExtractDRegister(instr, 5, 0);
38705                 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38706                 vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38707                 break;
38708               }
38709               case 0x00000040: {
38710                 // 0xf2000040
38711                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38712                                                  ((instr >> 22) & 0x4));
38713                 if (dt.Is(kDataTypeValueInvalid)) {
38714                   UnallocatedA32(instr);
38715                   return;
38716                 }
38717                 if (((instr >> 12) & 1) != 0) {
38718                   UnallocatedA32(instr);
38719                   return;
38720                 }
38721                 unsigned rd = ExtractQRegister(instr, 22, 12);
38722                 if (((instr >> 16) & 1) != 0) {
38723                   UnallocatedA32(instr);
38724                   return;
38725                 }
38726                 unsigned rn = ExtractQRegister(instr, 7, 16);
38727                 if ((instr & 1) != 0) {
38728                   UnallocatedA32(instr);
38729                   return;
38730                 }
38731                 unsigned rm = ExtractQRegister(instr, 5, 0);
38732                 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38733                 vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38734                 break;
38735               }
38736               case 0x00000100: {
38737                 // 0xf2000100
38738                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38739                                                  ((instr >> 22) & 0x4));
38740                 if (dt.Is(kDataTypeValueInvalid)) {
38741                   UnallocatedA32(instr);
38742                   return;
38743                 }
38744                 unsigned rd = ExtractDRegister(instr, 22, 12);
38745                 unsigned rn = ExtractDRegister(instr, 7, 16);
38746                 unsigned rm = ExtractDRegister(instr, 5, 0);
38747                 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38748                 vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38749                 break;
38750               }
38751               case 0x00000140: {
38752                 // 0xf2000140
38753                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38754                                                  ((instr >> 22) & 0x4));
38755                 if (dt.Is(kDataTypeValueInvalid)) {
38756                   UnallocatedA32(instr);
38757                   return;
38758                 }
38759                 if (((instr >> 12) & 1) != 0) {
38760                   UnallocatedA32(instr);
38761                   return;
38762                 }
38763                 unsigned rd = ExtractQRegister(instr, 22, 12);
38764                 if (((instr >> 16) & 1) != 0) {
38765                   UnallocatedA32(instr);
38766                   return;
38767                 }
38768                 unsigned rn = ExtractQRegister(instr, 7, 16);
38769                 if ((instr & 1) != 0) {
38770                   UnallocatedA32(instr);
38771                   return;
38772                 }
38773                 unsigned rm = ExtractQRegister(instr, 5, 0);
38774                 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38775                 vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38776                 break;
38777               }
38778               case 0x00000200: {
38779                 // 0xf2000200
38780                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38781                                                  ((instr >> 22) & 0x4));
38782                 if (dt.Is(kDataTypeValueInvalid)) {
38783                   UnallocatedA32(instr);
38784                   return;
38785                 }
38786                 unsigned rd = ExtractDRegister(instr, 22, 12);
38787                 unsigned rn = ExtractDRegister(instr, 7, 16);
38788                 unsigned rm = ExtractDRegister(instr, 5, 0);
38789                 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38790                 vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38791                 break;
38792               }
38793               case 0x00000240: {
38794                 // 0xf2000240
38795                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38796                                                  ((instr >> 22) & 0x4));
38797                 if (dt.Is(kDataTypeValueInvalid)) {
38798                   UnallocatedA32(instr);
38799                   return;
38800                 }
38801                 if (((instr >> 12) & 1) != 0) {
38802                   UnallocatedA32(instr);
38803                   return;
38804                 }
38805                 unsigned rd = ExtractQRegister(instr, 22, 12);
38806                 if (((instr >> 16) & 1) != 0) {
38807                   UnallocatedA32(instr);
38808                   return;
38809                 }
38810                 unsigned rn = ExtractQRegister(instr, 7, 16);
38811                 if ((instr & 1) != 0) {
38812                   UnallocatedA32(instr);
38813                   return;
38814                 }
38815                 unsigned rm = ExtractQRegister(instr, 5, 0);
38816                 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38817                 vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38818                 break;
38819               }
38820               case 0x00000300: {
38821                 // 0xf2000300
38822                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38823                                                  ((instr >> 22) & 0x4));
38824                 if (dt.Is(kDataTypeValueInvalid)) {
38825                   UnallocatedA32(instr);
38826                   return;
38827                 }
38828                 unsigned rd = ExtractDRegister(instr, 22, 12);
38829                 unsigned rn = ExtractDRegister(instr, 7, 16);
38830                 unsigned rm = ExtractDRegister(instr, 5, 0);
38831                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38832                 vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38833                 break;
38834               }
38835               case 0x00000340: {
38836                 // 0xf2000340
38837                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38838                                                  ((instr >> 22) & 0x4));
38839                 if (dt.Is(kDataTypeValueInvalid)) {
38840                   UnallocatedA32(instr);
38841                   return;
38842                 }
38843                 if (((instr >> 12) & 1) != 0) {
38844                   UnallocatedA32(instr);
38845                   return;
38846                 }
38847                 unsigned rd = ExtractQRegister(instr, 22, 12);
38848                 if (((instr >> 16) & 1) != 0) {
38849                   UnallocatedA32(instr);
38850                   return;
38851                 }
38852                 unsigned rn = ExtractQRegister(instr, 7, 16);
38853                 if ((instr & 1) != 0) {
38854                   UnallocatedA32(instr);
38855                   return;
38856                 }
38857                 unsigned rm = ExtractQRegister(instr, 5, 0);
38858                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38859                 vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38860                 break;
38861               }
38862               case 0x00000400: {
38863                 // 0xf2000400
38864                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38865                                                  ((instr >> 22) & 0x4));
38866                 if (dt.Is(kDataTypeValueInvalid)) {
38867                   UnallocatedA32(instr);
38868                   return;
38869                 }
38870                 unsigned rd = ExtractDRegister(instr, 22, 12);
38871                 unsigned rm = ExtractDRegister(instr, 5, 0);
38872                 unsigned rn = ExtractDRegister(instr, 7, 16);
38873                 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
38874                 vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
38875                 break;
38876               }
38877               case 0x00000440: {
38878                 // 0xf2000440
38879                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38880                                                  ((instr >> 22) & 0x4));
38881                 if (dt.Is(kDataTypeValueInvalid)) {
38882                   UnallocatedA32(instr);
38883                   return;
38884                 }
38885                 if (((instr >> 12) & 1) != 0) {
38886                   UnallocatedA32(instr);
38887                   return;
38888                 }
38889                 unsigned rd = ExtractQRegister(instr, 22, 12);
38890                 if ((instr & 1) != 0) {
38891                   UnallocatedA32(instr);
38892                   return;
38893                 }
38894                 unsigned rm = ExtractQRegister(instr, 5, 0);
38895                 if (((instr >> 16) & 1) != 0) {
38896                   UnallocatedA32(instr);
38897                   return;
38898                 }
38899                 unsigned rn = ExtractQRegister(instr, 7, 16);
38900                 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
38901                 vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
38902                 break;
38903               }
38904               case 0x00000500: {
38905                 // 0xf2000500
38906                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38907                                                  ((instr >> 22) & 0x4));
38908                 if (dt.Is(kDataTypeValueInvalid)) {
38909                   UnallocatedA32(instr);
38910                   return;
38911                 }
38912                 unsigned rd = ExtractDRegister(instr, 22, 12);
38913                 unsigned rm = ExtractDRegister(instr, 5, 0);
38914                 unsigned rn = ExtractDRegister(instr, 7, 16);
38915                 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
38916                 vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
38917                 break;
38918               }
38919               case 0x00000540: {
38920                 // 0xf2000540
38921                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
38922                                                  ((instr >> 22) & 0x4));
38923                 if (dt.Is(kDataTypeValueInvalid)) {
38924                   UnallocatedA32(instr);
38925                   return;
38926                 }
38927                 if (((instr >> 12) & 1) != 0) {
38928                   UnallocatedA32(instr);
38929                   return;
38930                 }
38931                 unsigned rd = ExtractQRegister(instr, 22, 12);
38932                 if ((instr & 1) != 0) {
38933                   UnallocatedA32(instr);
38934                   return;
38935                 }
38936                 unsigned rm = ExtractQRegister(instr, 5, 0);
38937                 if (((instr >> 16) & 1) != 0) {
38938                   UnallocatedA32(instr);
38939                   return;
38940                 }
38941                 unsigned rn = ExtractQRegister(instr, 7, 16);
38942                 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
38943                 vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
38944                 break;
38945               }
38946               case 0x00000600: {
38947                 // 0xf2000600
38948                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38949                                                  ((instr >> 22) & 0x4));
38950                 if (dt.Is(kDataTypeValueInvalid)) {
38951                   UnallocatedA32(instr);
38952                   return;
38953                 }
38954                 unsigned rd = ExtractDRegister(instr, 22, 12);
38955                 unsigned rn = ExtractDRegister(instr, 7, 16);
38956                 unsigned rm = ExtractDRegister(instr, 5, 0);
38957                 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
38958                 vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
38959                 break;
38960               }
38961               case 0x00000640: {
38962                 // 0xf2000640
38963                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38964                                                  ((instr >> 22) & 0x4));
38965                 if (dt.Is(kDataTypeValueInvalid)) {
38966                   UnallocatedA32(instr);
38967                   return;
38968                 }
38969                 if (((instr >> 12) & 1) != 0) {
38970                   UnallocatedA32(instr);
38971                   return;
38972                 }
38973                 unsigned rd = ExtractQRegister(instr, 22, 12);
38974                 if (((instr >> 16) & 1) != 0) {
38975                   UnallocatedA32(instr);
38976                   return;
38977                 }
38978                 unsigned rn = ExtractQRegister(instr, 7, 16);
38979                 if ((instr & 1) != 0) {
38980                   UnallocatedA32(instr);
38981                   return;
38982                 }
38983                 unsigned rm = ExtractQRegister(instr, 5, 0);
38984                 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
38985                 vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
38986                 break;
38987               }
38988               case 0x00000700: {
38989                 // 0xf2000700
38990                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
38991                                                  ((instr >> 22) & 0x4));
38992                 if (dt.Is(kDataTypeValueInvalid)) {
38993                   UnallocatedA32(instr);
38994                   return;
38995                 }
38996                 unsigned rd = ExtractDRegister(instr, 22, 12);
38997                 unsigned rn = ExtractDRegister(instr, 7, 16);
38998                 unsigned rm = ExtractDRegister(instr, 5, 0);
38999                 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39000                 vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39001                 break;
39002               }
39003               case 0x00000740: {
39004                 // 0xf2000740
39005                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39006                                                  ((instr >> 22) & 0x4));
39007                 if (dt.Is(kDataTypeValueInvalid)) {
39008                   UnallocatedA32(instr);
39009                   return;
39010                 }
39011                 if (((instr >> 12) & 1) != 0) {
39012                   UnallocatedA32(instr);
39013                   return;
39014                 }
39015                 unsigned rd = ExtractQRegister(instr, 22, 12);
39016                 if (((instr >> 16) & 1) != 0) {
39017                   UnallocatedA32(instr);
39018                   return;
39019                 }
39020                 unsigned rn = ExtractQRegister(instr, 7, 16);
39021                 if ((instr & 1) != 0) {
39022                   UnallocatedA32(instr);
39023                   return;
39024                 }
39025                 unsigned rm = ExtractQRegister(instr, 5, 0);
39026                 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39027                 vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39028                 break;
39029               }
39030               case 0x00000800: {
39031                 // 0xf2000800
39032                 switch (instr & 0x01000000) {
39033                   case 0x00000000: {
39034                     // 0xf2000800
39035                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39036                     if (dt.Is(kDataTypeValueInvalid)) {
39037                       UnallocatedA32(instr);
39038                       return;
39039                     }
39040                     unsigned rd = ExtractDRegister(instr, 22, 12);
39041                     unsigned rn = ExtractDRegister(instr, 7, 16);
39042                     unsigned rm = ExtractDRegister(instr, 5, 0);
39043                     // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39044                     vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39045                     break;
39046                   }
39047                   case 0x01000000: {
39048                     // 0xf3000800
39049                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39050                     if (dt.Is(kDataTypeValueInvalid)) {
39051                       UnallocatedA32(instr);
39052                       return;
39053                     }
39054                     unsigned rd = ExtractDRegister(instr, 22, 12);
39055                     unsigned rn = ExtractDRegister(instr, 7, 16);
39056                     unsigned rm = ExtractDRegister(instr, 5, 0);
39057                     // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39058                     vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39059                     break;
39060                   }
39061                 }
39062                 break;
39063               }
39064               case 0x00000840: {
39065                 // 0xf2000840
39066                 switch (instr & 0x01000000) {
39067                   case 0x00000000: {
39068                     // 0xf2000840
39069                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39070                     if (dt.Is(kDataTypeValueInvalid)) {
39071                       UnallocatedA32(instr);
39072                       return;
39073                     }
39074                     if (((instr >> 12) & 1) != 0) {
39075                       UnallocatedA32(instr);
39076                       return;
39077                     }
39078                     unsigned rd = ExtractQRegister(instr, 22, 12);
39079                     if (((instr >> 16) & 1) != 0) {
39080                       UnallocatedA32(instr);
39081                       return;
39082                     }
39083                     unsigned rn = ExtractQRegister(instr, 7, 16);
39084                     if ((instr & 1) != 0) {
39085                       UnallocatedA32(instr);
39086                       return;
39087                     }
39088                     unsigned rm = ExtractQRegister(instr, 5, 0);
39089                     // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39090                     vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39091                     break;
39092                   }
39093                   case 0x01000000: {
39094                     // 0xf3000840
39095                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
39096                     if (dt.Is(kDataTypeValueInvalid)) {
39097                       UnallocatedA32(instr);
39098                       return;
39099                     }
39100                     if (((instr >> 12) & 1) != 0) {
39101                       UnallocatedA32(instr);
39102                       return;
39103                     }
39104                     unsigned rd = ExtractQRegister(instr, 22, 12);
39105                     if (((instr >> 16) & 1) != 0) {
39106                       UnallocatedA32(instr);
39107                       return;
39108                     }
39109                     unsigned rn = ExtractQRegister(instr, 7, 16);
39110                     if ((instr & 1) != 0) {
39111                       UnallocatedA32(instr);
39112                       return;
39113                     }
39114                     unsigned rm = ExtractQRegister(instr, 5, 0);
39115                     // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39116                     vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39117                     break;
39118                   }
39119                 }
39120                 break;
39121               }
39122               case 0x00000900: {
39123                 // 0xf2000900
39124                 switch (instr & 0x01000000) {
39125                   case 0x00000000: {
39126                     // 0xf2000900
39127                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39128                     if (dt.Is(kDataTypeValueInvalid)) {
39129                       UnallocatedA32(instr);
39130                       return;
39131                     }
39132                     unsigned rd = ExtractDRegister(instr, 22, 12);
39133                     unsigned rn = ExtractDRegister(instr, 7, 16);
39134                     unsigned rm = ExtractDRegister(instr, 5, 0);
39135                     // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
39136                     vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39137                     break;
39138                   }
39139                   case 0x01000000: {
39140                     // 0xf3000900
39141                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39142                     if (dt.Is(kDataTypeValueInvalid)) {
39143                       UnallocatedA32(instr);
39144                       return;
39145                     }
39146                     unsigned rd = ExtractDRegister(instr, 22, 12);
39147                     unsigned rn = ExtractDRegister(instr, 7, 16);
39148                     unsigned rm = ExtractDRegister(instr, 5, 0);
39149                     // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
39150                     vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39151                     break;
39152                   }
39153                 }
39154                 break;
39155               }
39156               case 0x00000940: {
39157                 // 0xf2000940
39158                 switch (instr & 0x01000000) {
39159                   case 0x00000000: {
39160                     // 0xf2000940
39161                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39162                     if (dt.Is(kDataTypeValueInvalid)) {
39163                       UnallocatedA32(instr);
39164                       return;
39165                     }
39166                     if (((instr >> 12) & 1) != 0) {
39167                       UnallocatedA32(instr);
39168                       return;
39169                     }
39170                     unsigned rd = ExtractQRegister(instr, 22, 12);
39171                     if (((instr >> 16) & 1) != 0) {
39172                       UnallocatedA32(instr);
39173                       return;
39174                     }
39175                     unsigned rn = ExtractQRegister(instr, 7, 16);
39176                     if ((instr & 1) != 0) {
39177                       UnallocatedA32(instr);
39178                       return;
39179                     }
39180                     unsigned rm = ExtractQRegister(instr, 5, 0);
39181                     // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
39182                     vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39183                     break;
39184                   }
39185                   case 0x01000000: {
39186                     // 0xf3000940
39187                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
39188                     if (dt.Is(kDataTypeValueInvalid)) {
39189                       UnallocatedA32(instr);
39190                       return;
39191                     }
39192                     if (((instr >> 12) & 1) != 0) {
39193                       UnallocatedA32(instr);
39194                       return;
39195                     }
39196                     unsigned rd = ExtractQRegister(instr, 22, 12);
39197                     if (((instr >> 16) & 1) != 0) {
39198                       UnallocatedA32(instr);
39199                       return;
39200                     }
39201                     unsigned rn = ExtractQRegister(instr, 7, 16);
39202                     if ((instr & 1) != 0) {
39203                       UnallocatedA32(instr);
39204                       return;
39205                     }
39206                     unsigned rm = ExtractQRegister(instr, 5, 0);
39207                     // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
39208                     vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39209                     break;
39210                   }
39211                 }
39212                 break;
39213               }
39214               case 0x00000a00: {
39215                 // 0xf2000a00
39216                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
39217                                                  ((instr >> 22) & 0x4));
39218                 if (dt.Is(kDataTypeValueInvalid)) {
39219                   UnallocatedA32(instr);
39220                   return;
39221                 }
39222                 unsigned rd = ExtractDRegister(instr, 22, 12);
39223                 unsigned rn = ExtractDRegister(instr, 7, 16);
39224                 unsigned rm = ExtractDRegister(instr, 5, 0);
39225                 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39226                 vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39227                 break;
39228               }
39229               case 0x00000b00: {
39230                 // 0xf2000b00
39231                 switch (instr & 0x01000000) {
39232                   case 0x00000000: {
39233                     // 0xf2000b00
39234                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39235                     if (dt.Is(kDataTypeValueInvalid)) {
39236                       UnallocatedA32(instr);
39237                       return;
39238                     }
39239                     unsigned rd = ExtractDRegister(instr, 22, 12);
39240                     unsigned rn = ExtractDRegister(instr, 7, 16);
39241                     unsigned rm = ExtractDRegister(instr, 5, 0);
39242                     // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39243                     vqdmulh(al,
39244                             dt,
39245                             DRegister(rd),
39246                             DRegister(rn),
39247                             DRegister(rm));
39248                     break;
39249                   }
39250                   case 0x01000000: {
39251                     // 0xf3000b00
39252                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39253                     if (dt.Is(kDataTypeValueInvalid)) {
39254                       UnallocatedA32(instr);
39255                       return;
39256                     }
39257                     unsigned rd = ExtractDRegister(instr, 22, 12);
39258                     unsigned rn = ExtractDRegister(instr, 7, 16);
39259                     unsigned rm = ExtractDRegister(instr, 5, 0);
39260                     // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39261                     vqrdmulh(al,
39262                              dt,
39263                              DRegister(rd),
39264                              DRegister(rn),
39265                              DRegister(rm));
39266                     break;
39267                   }
39268                 }
39269                 break;
39270               }
39271               case 0x00000b40: {
39272                 // 0xf2000b40
39273                 switch (instr & 0x01000000) {
39274                   case 0x00000000: {
39275                     // 0xf2000b40
39276                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39277                     if (dt.Is(kDataTypeValueInvalid)) {
39278                       UnallocatedA32(instr);
39279                       return;
39280                     }
39281                     if (((instr >> 12) & 1) != 0) {
39282                       UnallocatedA32(instr);
39283                       return;
39284                     }
39285                     unsigned rd = ExtractQRegister(instr, 22, 12);
39286                     if (((instr >> 16) & 1) != 0) {
39287                       UnallocatedA32(instr);
39288                       return;
39289                     }
39290                     unsigned rn = ExtractQRegister(instr, 7, 16);
39291                     if ((instr & 1) != 0) {
39292                       UnallocatedA32(instr);
39293                       return;
39294                     }
39295                     unsigned rm = ExtractQRegister(instr, 5, 0);
39296                     // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39297                     vqdmulh(al,
39298                             dt,
39299                             QRegister(rd),
39300                             QRegister(rn),
39301                             QRegister(rm));
39302                     break;
39303                   }
39304                   case 0x01000000: {
39305                     // 0xf3000b40
39306                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
39307                     if (dt.Is(kDataTypeValueInvalid)) {
39308                       UnallocatedA32(instr);
39309                       return;
39310                     }
39311                     if (((instr >> 12) & 1) != 0) {
39312                       UnallocatedA32(instr);
39313                       return;
39314                     }
39315                     unsigned rd = ExtractQRegister(instr, 22, 12);
39316                     if (((instr >> 16) & 1) != 0) {
39317                       UnallocatedA32(instr);
39318                       return;
39319                     }
39320                     unsigned rn = ExtractQRegister(instr, 7, 16);
39321                     if ((instr & 1) != 0) {
39322                       UnallocatedA32(instr);
39323                       return;
39324                     }
39325                     unsigned rm = ExtractQRegister(instr, 5, 0);
39326                     // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39327                     vqrdmulh(al,
39328                              dt,
39329                              QRegister(rd),
39330                              QRegister(rn),
39331                              QRegister(rm));
39332                     break;
39333                   }
39334                 }
39335                 break;
39336               }
39337               case 0x00000c40: {
39338                 // 0xf2000c40
39339                 switch (instr & 0x01300000) {
39340                   case 0x00000000: {
39341                     // 0xf2000c40
39342                     UnimplementedA32("SHA1C", instr);
39343                     break;
39344                   }
39345                   case 0x00100000: {
39346                     // 0xf2100c40
39347                     UnimplementedA32("SHA1P", instr);
39348                     break;
39349                   }
39350                   case 0x00200000: {
39351                     // 0xf2200c40
39352                     UnimplementedA32("SHA1M", instr);
39353                     break;
39354                   }
39355                   case 0x00300000: {
39356                     // 0xf2300c40
39357                     UnimplementedA32("SHA1SU0", instr);
39358                     break;
39359                   }
39360                   case 0x01000000: {
39361                     // 0xf3000c40
39362                     UnimplementedA32("SHA256H", instr);
39363                     break;
39364                   }
39365                   case 0x01100000: {
39366                     // 0xf3100c40
39367                     UnimplementedA32("SHA256H2", instr);
39368                     break;
39369                   }
39370                   case 0x01200000: {
39371                     // 0xf3200c40
39372                     UnimplementedA32("SHA256SU1", instr);
39373                     break;
39374                   }
39375                   default:
39376                     UnallocatedA32(instr);
39377                     break;
39378                 }
39379                 break;
39380               }
39381               case 0x00000d00: {
39382                 // 0xf2000d00
39383                 switch (instr & 0x01300000) {
39384                   case 0x00000000: {
39385                     // 0xf2000d00
39386                     unsigned rd = ExtractDRegister(instr, 22, 12);
39387                     unsigned rn = ExtractDRegister(instr, 7, 16);
39388                     unsigned rm = ExtractDRegister(instr, 5, 0);
39389                     // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39390                     vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39391                     break;
39392                   }
39393                   case 0x00200000: {
39394                     // 0xf2200d00
39395                     unsigned rd = ExtractDRegister(instr, 22, 12);
39396                     unsigned rn = ExtractDRegister(instr, 7, 16);
39397                     unsigned rm = ExtractDRegister(instr, 5, 0);
39398                     // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39399                     vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39400                     break;
39401                   }
39402                   case 0x01000000: {
39403                     // 0xf3000d00
39404                     unsigned rd = ExtractDRegister(instr, 22, 12);
39405                     unsigned rn = ExtractDRegister(instr, 7, 16);
39406                     unsigned rm = ExtractDRegister(instr, 5, 0);
39407                     // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39408                     vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39409                     break;
39410                   }
39411                   case 0x01200000: {
39412                     // 0xf3200d00
39413                     unsigned rd = ExtractDRegister(instr, 22, 12);
39414                     unsigned rn = ExtractDRegister(instr, 7, 16);
39415                     unsigned rm = ExtractDRegister(instr, 5, 0);
39416                     // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39417                     vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39418                     break;
39419                   }
39420                   default:
39421                     UnallocatedA32(instr);
39422                     break;
39423                 }
39424                 break;
39425               }
39426               case 0x00000d40: {
39427                 // 0xf2000d40
39428                 switch (instr & 0x01300000) {
39429                   case 0x00000000: {
39430                     // 0xf2000d40
39431                     if (((instr >> 12) & 1) != 0) {
39432                       UnallocatedA32(instr);
39433                       return;
39434                     }
39435                     unsigned rd = ExtractQRegister(instr, 22, 12);
39436                     if (((instr >> 16) & 1) != 0) {
39437                       UnallocatedA32(instr);
39438                       return;
39439                     }
39440                     unsigned rn = ExtractQRegister(instr, 7, 16);
39441                     if ((instr & 1) != 0) {
39442                       UnallocatedA32(instr);
39443                       return;
39444                     }
39445                     unsigned rm = ExtractQRegister(instr, 5, 0);
39446                     // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39447                     vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39448                     break;
39449                   }
39450                   case 0x00200000: {
39451                     // 0xf2200d40
39452                     if (((instr >> 12) & 1) != 0) {
39453                       UnallocatedA32(instr);
39454                       return;
39455                     }
39456                     unsigned rd = ExtractQRegister(instr, 22, 12);
39457                     if (((instr >> 16) & 1) != 0) {
39458                       UnallocatedA32(instr);
39459                       return;
39460                     }
39461                     unsigned rn = ExtractQRegister(instr, 7, 16);
39462                     if ((instr & 1) != 0) {
39463                       UnallocatedA32(instr);
39464                       return;
39465                     }
39466                     unsigned rm = ExtractQRegister(instr, 5, 0);
39467                     // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39468                     vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39469                     break;
39470                   }
39471                   case 0x01200000: {
39472                     // 0xf3200d40
39473                     if (((instr >> 12) & 1) != 0) {
39474                       UnallocatedA32(instr);
39475                       return;
39476                     }
39477                     unsigned rd = ExtractQRegister(instr, 22, 12);
39478                     if (((instr >> 16) & 1) != 0) {
39479                       UnallocatedA32(instr);
39480                       return;
39481                     }
39482                     unsigned rn = ExtractQRegister(instr, 7, 16);
39483                     if ((instr & 1) != 0) {
39484                       UnallocatedA32(instr);
39485                       return;
39486                     }
39487                     unsigned rm = ExtractQRegister(instr, 5, 0);
39488                     // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39489                     vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39490                     break;
39491                   }
39492                   default:
39493                     UnallocatedA32(instr);
39494                     break;
39495                 }
39496                 break;
39497               }
39498               case 0x00000e00: {
39499                 // 0xf2000e00
39500                 switch (instr & 0x01200000) {
39501                   case 0x00000000: {
39502                     // 0xf2000e00
39503                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39504                     if (dt.Is(kDataTypeValueInvalid)) {
39505                       UnallocatedA32(instr);
39506                       return;
39507                     }
39508                     unsigned rd = ExtractDRegister(instr, 22, 12);
39509                     unsigned rn = ExtractDRegister(instr, 7, 16);
39510                     unsigned rm = ExtractDRegister(instr, 5, 0);
39511                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
39512                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39513                     break;
39514                   }
39515                   case 0x01000000: {
39516                     // 0xf3000e00
39517                     if ((instr & 0x00100000) == 0x00000000) {
39518                       unsigned rd = ExtractDRegister(instr, 22, 12);
39519                       unsigned rn = ExtractDRegister(instr, 7, 16);
39520                       unsigned rm = ExtractDRegister(instr, 5, 0);
39521                       // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39522                       vcge(al,
39523                            F32,
39524                            DRegister(rd),
39525                            DRegister(rn),
39526                            DRegister(rm));
39527                     } else {
39528                       UnallocatedA32(instr);
39529                     }
39530                     break;
39531                   }
39532                   case 0x01200000: {
39533                     // 0xf3200e00
39534                     if ((instr & 0x00100000) == 0x00000000) {
39535                       unsigned rd = ExtractDRegister(instr, 22, 12);
39536                       unsigned rn = ExtractDRegister(instr, 7, 16);
39537                       unsigned rm = ExtractDRegister(instr, 5, 0);
39538                       // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
39539                       vcgt(al,
39540                            F32,
39541                            DRegister(rd),
39542                            DRegister(rn),
39543                            DRegister(rm));
39544                     } else {
39545                       UnallocatedA32(instr);
39546                     }
39547                     break;
39548                   }
39549                   default:
39550                     UnallocatedA32(instr);
39551                     break;
39552                 }
39553                 break;
39554               }
39555               case 0x00000e40: {
39556                 // 0xf2000e40
39557                 switch (instr & 0x01200000) {
39558                   case 0x00000000: {
39559                     // 0xf2000e40
39560                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
39561                     if (dt.Is(kDataTypeValueInvalid)) {
39562                       UnallocatedA32(instr);
39563                       return;
39564                     }
39565                     if (((instr >> 12) & 1) != 0) {
39566                       UnallocatedA32(instr);
39567                       return;
39568                     }
39569                     unsigned rd = ExtractQRegister(instr, 22, 12);
39570                     if (((instr >> 16) & 1) != 0) {
39571                       UnallocatedA32(instr);
39572                       return;
39573                     }
39574                     unsigned rn = ExtractQRegister(instr, 7, 16);
39575                     if ((instr & 1) != 0) {
39576                       UnallocatedA32(instr);
39577                       return;
39578                     }
39579                     unsigned rm = ExtractQRegister(instr, 5, 0);
39580                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
39581                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39582                     break;
39583                   }
39584                   case 0x01000000: {
39585                     // 0xf3000e40
39586                     if ((instr & 0x00100000) == 0x00000000) {
39587                       if (((instr >> 12) & 1) != 0) {
39588                         UnallocatedA32(instr);
39589                         return;
39590                       }
39591                       unsigned rd = ExtractQRegister(instr, 22, 12);
39592                       if (((instr >> 16) & 1) != 0) {
39593                         UnallocatedA32(instr);
39594                         return;
39595                       }
39596                       unsigned rn = ExtractQRegister(instr, 7, 16);
39597                       if ((instr & 1) != 0) {
39598                         UnallocatedA32(instr);
39599                         return;
39600                       }
39601                       unsigned rm = ExtractQRegister(instr, 5, 0);
39602                       // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39603                       vcge(al,
39604                            F32,
39605                            QRegister(rd),
39606                            QRegister(rn),
39607                            QRegister(rm));
39608                     } else {
39609                       UnallocatedA32(instr);
39610                     }
39611                     break;
39612                   }
39613                   case 0x01200000: {
39614                     // 0xf3200e40
39615                     if ((instr & 0x00100000) == 0x00000000) {
39616                       if (((instr >> 12) & 1) != 0) {
39617                         UnallocatedA32(instr);
39618                         return;
39619                       }
39620                       unsigned rd = ExtractQRegister(instr, 22, 12);
39621                       if (((instr >> 16) & 1) != 0) {
39622                         UnallocatedA32(instr);
39623                         return;
39624                       }
39625                       unsigned rn = ExtractQRegister(instr, 7, 16);
39626                       if ((instr & 1) != 0) {
39627                         UnallocatedA32(instr);
39628                         return;
39629                       }
39630                       unsigned rm = ExtractQRegister(instr, 5, 0);
39631                       // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
39632                       vcgt(al,
39633                            F32,
39634                            QRegister(rd),
39635                            QRegister(rn),
39636                            QRegister(rm));
39637                     } else {
39638                       UnallocatedA32(instr);
39639                     }
39640                     break;
39641                   }
39642                   default:
39643                     UnallocatedA32(instr);
39644                     break;
39645                 }
39646                 break;
39647               }
39648               case 0x00000f00: {
39649                 // 0xf2000f00
39650                 switch (instr & 0x01300000) {
39651                   case 0x00000000: {
39652                     // 0xf2000f00
39653                     unsigned rd = ExtractDRegister(instr, 22, 12);
39654                     unsigned rn = ExtractDRegister(instr, 7, 16);
39655                     unsigned rm = ExtractDRegister(instr, 5, 0);
39656                     // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39657                     vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39658                     break;
39659                   }
39660                   case 0x00200000: {
39661                     // 0xf2200f00
39662                     unsigned rd = ExtractDRegister(instr, 22, 12);
39663                     unsigned rn = ExtractDRegister(instr, 7, 16);
39664                     unsigned rm = ExtractDRegister(instr, 5, 0);
39665                     // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39666                     vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39667                     break;
39668                   }
39669                   case 0x01000000: {
39670                     // 0xf3000f00
39671                     unsigned rd = ExtractDRegister(instr, 22, 12);
39672                     unsigned rn = ExtractDRegister(instr, 7, 16);
39673                     unsigned rm = ExtractDRegister(instr, 5, 0);
39674                     // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39675                     vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39676                     break;
39677                   }
39678                   case 0x01200000: {
39679                     // 0xf3200f00
39680                     unsigned rd = ExtractDRegister(instr, 22, 12);
39681                     unsigned rn = ExtractDRegister(instr, 7, 16);
39682                     unsigned rm = ExtractDRegister(instr, 5, 0);
39683                     // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
39684                     vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
39685                     break;
39686                   }
39687                   default:
39688                     UnallocatedA32(instr);
39689                     break;
39690                 }
39691                 break;
39692               }
39693               case 0x00000f40: {
39694                 // 0xf2000f40
39695                 switch (instr & 0x01300000) {
39696                   case 0x00000000: {
39697                     // 0xf2000f40
39698                     if (((instr >> 12) & 1) != 0) {
39699                       UnallocatedA32(instr);
39700                       return;
39701                     }
39702                     unsigned rd = ExtractQRegister(instr, 22, 12);
39703                     if (((instr >> 16) & 1) != 0) {
39704                       UnallocatedA32(instr);
39705                       return;
39706                     }
39707                     unsigned rn = ExtractQRegister(instr, 7, 16);
39708                     if ((instr & 1) != 0) {
39709                       UnallocatedA32(instr);
39710                       return;
39711                     }
39712                     unsigned rm = ExtractQRegister(instr, 5, 0);
39713                     // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39714                     vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39715                     break;
39716                   }
39717                   case 0x00200000: {
39718                     // 0xf2200f40
39719                     if (((instr >> 12) & 1) != 0) {
39720                       UnallocatedA32(instr);
39721                       return;
39722                     }
39723                     unsigned rd = ExtractQRegister(instr, 22, 12);
39724                     if (((instr >> 16) & 1) != 0) {
39725                       UnallocatedA32(instr);
39726                       return;
39727                     }
39728                     unsigned rn = ExtractQRegister(instr, 7, 16);
39729                     if ((instr & 1) != 0) {
39730                       UnallocatedA32(instr);
39731                       return;
39732                     }
39733                     unsigned rm = ExtractQRegister(instr, 5, 0);
39734                     // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
39735                     vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
39736                     break;
39737                   }
39738                   default:
39739                     UnallocatedA32(instr);
39740                     break;
39741                 }
39742                 break;
39743               }
39744               default:
39745                 UnallocatedA32(instr);
39746                 break;
39747             }
39748             break;
39749           }
39750           case 0x00000010: {
39751             // 0xf2000010
39752             switch (instr & 0x00000f40) {
39753               case 0x00000000: {
39754                 // 0xf2000010
39755                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39756                                                  ((instr >> 22) & 0x4));
39757                 if (dt.Is(kDataTypeValueInvalid)) {
39758                   UnallocatedA32(instr);
39759                   return;
39760                 }
39761                 unsigned rd = ExtractDRegister(instr, 22, 12);
39762                 unsigned rn = ExtractDRegister(instr, 7, 16);
39763                 unsigned rm = ExtractDRegister(instr, 5, 0);
39764                 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
39765                 vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
39766                 break;
39767               }
39768               case 0x00000040: {
39769                 // 0xf2000050
39770                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
39771                                                  ((instr >> 22) & 0x4));
39772                 if (dt.Is(kDataTypeValueInvalid)) {
39773                   UnallocatedA32(instr);
39774                   return;
39775                 }
39776                 if (((instr >> 12) & 1) != 0) {
39777                   UnallocatedA32(instr);
39778                   return;
39779                 }
39780                 unsigned rd = ExtractQRegister(instr, 22, 12);
39781                 if (((instr >> 16) & 1) != 0) {
39782                   UnallocatedA32(instr);
39783                   return;
39784                 }
39785                 unsigned rn = ExtractQRegister(instr, 7, 16);
39786                 if ((instr & 1) != 0) {
39787                   UnallocatedA32(instr);
39788                   return;
39789                 }
39790                 unsigned rm = ExtractQRegister(instr, 5, 0);
39791                 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
39792                 vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
39793                 break;
39794               }
39795               case 0x00000100: {
39796                 // 0xf2000110
39797                 switch (instr & 0x01300000) {
39798                   case 0x00000000: {
39799                     // 0xf2000110
39800                     unsigned rd = ExtractDRegister(instr, 22, 12);
39801                     unsigned rn = ExtractDRegister(instr, 7, 16);
39802                     unsigned rm = ExtractDRegister(instr, 5, 0);
39803                     // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39804                     vand(al,
39805                          kDataTypeValueNone,
39806                          DRegister(rd),
39807                          DRegister(rn),
39808                          DRegister(rm));
39809                     break;
39810                   }
39811                   case 0x00100000: {
39812                     // 0xf2100110
39813                     unsigned rd = ExtractDRegister(instr, 22, 12);
39814                     unsigned rn = ExtractDRegister(instr, 7, 16);
39815                     unsigned rm = ExtractDRegister(instr, 5, 0);
39816                     // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39817                     vbic(al,
39818                          kDataTypeValueNone,
39819                          DRegister(rd),
39820                          DRegister(rn),
39821                          DRegister(rm));
39822                     break;
39823                   }
39824                   case 0x00200000: {
39825                     // 0xf2200110
39826                     if (((instr & 0x00000040) == 0x00000000) &&
39827                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39828                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
39829                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39830                           (Uint32(instr) & Uint32(0xf))))) {
39831                       unsigned rd = ExtractDRegister(instr, 22, 12);
39832                       unsigned rm = ExtractDRegister(instr, 7, 16);
39833                       // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
39834                       vmov(al,
39835                            kDataTypeValueNone,
39836                            DRegister(rd),
39837                            DRegister(rm));
39838                       return;
39839                     }
39840                     unsigned rd = ExtractDRegister(instr, 22, 12);
39841                     unsigned rn = ExtractDRegister(instr, 7, 16);
39842                     unsigned rm = ExtractDRegister(instr, 5, 0);
39843                     // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39844                     vorr(al,
39845                          kDataTypeValueNone,
39846                          DRegister(rd),
39847                          DRegister(rn),
39848                          DRegister(rm));
39849                     break;
39850                   }
39851                   case 0x00300000: {
39852                     // 0xf2300110
39853                     unsigned rd = ExtractDRegister(instr, 22, 12);
39854                     unsigned rn = ExtractDRegister(instr, 7, 16);
39855                     unsigned rm = ExtractDRegister(instr, 5, 0);
39856                     // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39857                     vorn(al,
39858                          kDataTypeValueNone,
39859                          DRegister(rd),
39860                          DRegister(rn),
39861                          DRegister(rm));
39862                     break;
39863                   }
39864                   case 0x01000000: {
39865                     // 0xf3000110
39866                     unsigned rd = ExtractDRegister(instr, 22, 12);
39867                     unsigned rn = ExtractDRegister(instr, 7, 16);
39868                     unsigned rm = ExtractDRegister(instr, 5, 0);
39869                     // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39870                     veor(al,
39871                          kDataTypeValueNone,
39872                          DRegister(rd),
39873                          DRegister(rn),
39874                          DRegister(rm));
39875                     break;
39876                   }
39877                   case 0x01100000: {
39878                     // 0xf3100110
39879                     unsigned rd = ExtractDRegister(instr, 22, 12);
39880                     unsigned rn = ExtractDRegister(instr, 7, 16);
39881                     unsigned rm = ExtractDRegister(instr, 5, 0);
39882                     // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39883                     vbsl(al,
39884                          kDataTypeValueNone,
39885                          DRegister(rd),
39886                          DRegister(rn),
39887                          DRegister(rm));
39888                     break;
39889                   }
39890                   case 0x01200000: {
39891                     // 0xf3200110
39892                     unsigned rd = ExtractDRegister(instr, 22, 12);
39893                     unsigned rn = ExtractDRegister(instr, 7, 16);
39894                     unsigned rm = ExtractDRegister(instr, 5, 0);
39895                     // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39896                     vbit(al,
39897                          kDataTypeValueNone,
39898                          DRegister(rd),
39899                          DRegister(rn),
39900                          DRegister(rm));
39901                     break;
39902                   }
39903                   case 0x01300000: {
39904                     // 0xf3300110
39905                     unsigned rd = ExtractDRegister(instr, 22, 12);
39906                     unsigned rn = ExtractDRegister(instr, 7, 16);
39907                     unsigned rm = ExtractDRegister(instr, 5, 0);
39908                     // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
39909                     vbif(al,
39910                          kDataTypeValueNone,
39911                          DRegister(rd),
39912                          DRegister(rn),
39913                          DRegister(rm));
39914                     break;
39915                   }
39916                 }
39917                 break;
39918               }
39919               case 0x00000140: {
39920                 // 0xf2000150
39921                 switch (instr & 0x01300000) {
39922                   case 0x00000000: {
39923                     // 0xf2000150
39924                     if (((instr >> 12) & 1) != 0) {
39925                       UnallocatedA32(instr);
39926                       return;
39927                     }
39928                     unsigned rd = ExtractQRegister(instr, 22, 12);
39929                     if (((instr >> 16) & 1) != 0) {
39930                       UnallocatedA32(instr);
39931                       return;
39932                     }
39933                     unsigned rn = ExtractQRegister(instr, 7, 16);
39934                     if ((instr & 1) != 0) {
39935                       UnallocatedA32(instr);
39936                       return;
39937                     }
39938                     unsigned rm = ExtractQRegister(instr, 5, 0);
39939                     // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39940                     vand(al,
39941                          kDataTypeValueNone,
39942                          QRegister(rd),
39943                          QRegister(rn),
39944                          QRegister(rm));
39945                     break;
39946                   }
39947                   case 0x00100000: {
39948                     // 0xf2100150
39949                     if (((instr >> 12) & 1) != 0) {
39950                       UnallocatedA32(instr);
39951                       return;
39952                     }
39953                     unsigned rd = ExtractQRegister(instr, 22, 12);
39954                     if (((instr >> 16) & 1) != 0) {
39955                       UnallocatedA32(instr);
39956                       return;
39957                     }
39958                     unsigned rn = ExtractQRegister(instr, 7, 16);
39959                     if ((instr & 1) != 0) {
39960                       UnallocatedA32(instr);
39961                       return;
39962                     }
39963                     unsigned rm = ExtractQRegister(instr, 5, 0);
39964                     // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
39965                     vbic(al,
39966                          kDataTypeValueNone,
39967                          QRegister(rd),
39968                          QRegister(rn),
39969                          QRegister(rm));
39970                     break;
39971                   }
39972                   case 0x00200000: {
39973                     // 0xf2200150
39974                     if (((instr & 0x00000040) == 0x00000040) &&
39975                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
39976                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
39977                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
39978                           (Uint32(instr) & Uint32(0xf))))) {
39979                       if (((instr >> 12) & 1) != 0) {
39980                         UnallocatedA32(instr);
39981                         return;
39982                       }
39983                       unsigned rd = ExtractQRegister(instr, 22, 12);
39984                       if (((instr >> 16) & 1) != 0) {
39985                         UnallocatedA32(instr);
39986                         return;
39987                       }
39988                       unsigned rm = ExtractQRegister(instr, 7, 16);
39989                       // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
39990                       vmov(al,
39991                            kDataTypeValueNone,
39992                            QRegister(rd),
39993                            QRegister(rm));
39994                       return;
39995                     }
39996                     if (((instr >> 12) & 1) != 0) {
39997                       UnallocatedA32(instr);
39998                       return;
39999                     }
40000                     unsigned rd = ExtractQRegister(instr, 22, 12);
40001                     if (((instr >> 16) & 1) != 0) {
40002                       UnallocatedA32(instr);
40003                       return;
40004                     }
40005                     unsigned rn = ExtractQRegister(instr, 7, 16);
40006                     if ((instr & 1) != 0) {
40007                       UnallocatedA32(instr);
40008                       return;
40009                     }
40010                     unsigned rm = ExtractQRegister(instr, 5, 0);
40011                     // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40012                     vorr(al,
40013                          kDataTypeValueNone,
40014                          QRegister(rd),
40015                          QRegister(rn),
40016                          QRegister(rm));
40017                     break;
40018                   }
40019                   case 0x00300000: {
40020                     // 0xf2300150
40021                     if (((instr >> 12) & 1) != 0) {
40022                       UnallocatedA32(instr);
40023                       return;
40024                     }
40025                     unsigned rd = ExtractQRegister(instr, 22, 12);
40026                     if (((instr >> 16) & 1) != 0) {
40027                       UnallocatedA32(instr);
40028                       return;
40029                     }
40030                     unsigned rn = ExtractQRegister(instr, 7, 16);
40031                     if ((instr & 1) != 0) {
40032                       UnallocatedA32(instr);
40033                       return;
40034                     }
40035                     unsigned rm = ExtractQRegister(instr, 5, 0);
40036                     // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40037                     vorn(al,
40038                          kDataTypeValueNone,
40039                          QRegister(rd),
40040                          QRegister(rn),
40041                          QRegister(rm));
40042                     break;
40043                   }
40044                   case 0x01000000: {
40045                     // 0xf3000150
40046                     if (((instr >> 12) & 1) != 0) {
40047                       UnallocatedA32(instr);
40048                       return;
40049                     }
40050                     unsigned rd = ExtractQRegister(instr, 22, 12);
40051                     if (((instr >> 16) & 1) != 0) {
40052                       UnallocatedA32(instr);
40053                       return;
40054                     }
40055                     unsigned rn = ExtractQRegister(instr, 7, 16);
40056                     if ((instr & 1) != 0) {
40057                       UnallocatedA32(instr);
40058                       return;
40059                     }
40060                     unsigned rm = ExtractQRegister(instr, 5, 0);
40061                     // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40062                     veor(al,
40063                          kDataTypeValueNone,
40064                          QRegister(rd),
40065                          QRegister(rn),
40066                          QRegister(rm));
40067                     break;
40068                   }
40069                   case 0x01100000: {
40070                     // 0xf3100150
40071                     if (((instr >> 12) & 1) != 0) {
40072                       UnallocatedA32(instr);
40073                       return;
40074                     }
40075                     unsigned rd = ExtractQRegister(instr, 22, 12);
40076                     if (((instr >> 16) & 1) != 0) {
40077                       UnallocatedA32(instr);
40078                       return;
40079                     }
40080                     unsigned rn = ExtractQRegister(instr, 7, 16);
40081                     if ((instr & 1) != 0) {
40082                       UnallocatedA32(instr);
40083                       return;
40084                     }
40085                     unsigned rm = ExtractQRegister(instr, 5, 0);
40086                     // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40087                     vbsl(al,
40088                          kDataTypeValueNone,
40089                          QRegister(rd),
40090                          QRegister(rn),
40091                          QRegister(rm));
40092                     break;
40093                   }
40094                   case 0x01200000: {
40095                     // 0xf3200150
40096                     if (((instr >> 12) & 1) != 0) {
40097                       UnallocatedA32(instr);
40098                       return;
40099                     }
40100                     unsigned rd = ExtractQRegister(instr, 22, 12);
40101                     if (((instr >> 16) & 1) != 0) {
40102                       UnallocatedA32(instr);
40103                       return;
40104                     }
40105                     unsigned rn = ExtractQRegister(instr, 7, 16);
40106                     if ((instr & 1) != 0) {
40107                       UnallocatedA32(instr);
40108                       return;
40109                     }
40110                     unsigned rm = ExtractQRegister(instr, 5, 0);
40111                     // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40112                     vbit(al,
40113                          kDataTypeValueNone,
40114                          QRegister(rd),
40115                          QRegister(rn),
40116                          QRegister(rm));
40117                     break;
40118                   }
40119                   case 0x01300000: {
40120                     // 0xf3300150
40121                     if (((instr >> 12) & 1) != 0) {
40122                       UnallocatedA32(instr);
40123                       return;
40124                     }
40125                     unsigned rd = ExtractQRegister(instr, 22, 12);
40126                     if (((instr >> 16) & 1) != 0) {
40127                       UnallocatedA32(instr);
40128                       return;
40129                     }
40130                     unsigned rn = ExtractQRegister(instr, 7, 16);
40131                     if ((instr & 1) != 0) {
40132                       UnallocatedA32(instr);
40133                       return;
40134                     }
40135                     unsigned rm = ExtractQRegister(instr, 5, 0);
40136                     // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
40137                     vbif(al,
40138                          kDataTypeValueNone,
40139                          QRegister(rd),
40140                          QRegister(rn),
40141                          QRegister(rm));
40142                     break;
40143                   }
40144                 }
40145                 break;
40146               }
40147               case 0x00000200: {
40148                 // 0xf2000210
40149                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40150                                                  ((instr >> 22) & 0x4));
40151                 if (dt.Is(kDataTypeValueInvalid)) {
40152                   UnallocatedA32(instr);
40153                   return;
40154                 }
40155                 unsigned rd = ExtractDRegister(instr, 22, 12);
40156                 unsigned rn = ExtractDRegister(instr, 7, 16);
40157                 unsigned rm = ExtractDRegister(instr, 5, 0);
40158                 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40159                 vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40160                 break;
40161               }
40162               case 0x00000240: {
40163                 // 0xf2000250
40164                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40165                                                  ((instr >> 22) & 0x4));
40166                 if (dt.Is(kDataTypeValueInvalid)) {
40167                   UnallocatedA32(instr);
40168                   return;
40169                 }
40170                 if (((instr >> 12) & 1) != 0) {
40171                   UnallocatedA32(instr);
40172                   return;
40173                 }
40174                 unsigned rd = ExtractQRegister(instr, 22, 12);
40175                 if (((instr >> 16) & 1) != 0) {
40176                   UnallocatedA32(instr);
40177                   return;
40178                 }
40179                 unsigned rn = ExtractQRegister(instr, 7, 16);
40180                 if ((instr & 1) != 0) {
40181                   UnallocatedA32(instr);
40182                   return;
40183                 }
40184                 unsigned rm = ExtractQRegister(instr, 5, 0);
40185                 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40186                 vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40187                 break;
40188               }
40189               case 0x00000300: {
40190                 // 0xf2000310
40191                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40192                                                  ((instr >> 22) & 0x4));
40193                 if (dt.Is(kDataTypeValueInvalid)) {
40194                   UnallocatedA32(instr);
40195                   return;
40196                 }
40197                 unsigned rd = ExtractDRegister(instr, 22, 12);
40198                 unsigned rn = ExtractDRegister(instr, 7, 16);
40199                 unsigned rm = ExtractDRegister(instr, 5, 0);
40200                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40201                 vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40202                 break;
40203               }
40204               case 0x00000340: {
40205                 // 0xf2000350
40206                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40207                                                  ((instr >> 22) & 0x4));
40208                 if (dt.Is(kDataTypeValueInvalid)) {
40209                   UnallocatedA32(instr);
40210                   return;
40211                 }
40212                 if (((instr >> 12) & 1) != 0) {
40213                   UnallocatedA32(instr);
40214                   return;
40215                 }
40216                 unsigned rd = ExtractQRegister(instr, 22, 12);
40217                 if (((instr >> 16) & 1) != 0) {
40218                   UnallocatedA32(instr);
40219                   return;
40220                 }
40221                 unsigned rn = ExtractQRegister(instr, 7, 16);
40222                 if ((instr & 1) != 0) {
40223                   UnallocatedA32(instr);
40224                   return;
40225                 }
40226                 unsigned rm = ExtractQRegister(instr, 5, 0);
40227                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40228                 vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40229                 break;
40230               }
40231               case 0x00000400: {
40232                 // 0xf2000410
40233                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40234                                                  ((instr >> 22) & 0x4));
40235                 if (dt.Is(kDataTypeValueInvalid)) {
40236                   UnallocatedA32(instr);
40237                   return;
40238                 }
40239                 unsigned rd = ExtractDRegister(instr, 22, 12);
40240                 unsigned rm = ExtractDRegister(instr, 5, 0);
40241                 unsigned rn = ExtractDRegister(instr, 7, 16);
40242                 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
40243                 vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
40244                 break;
40245               }
40246               case 0x00000440: {
40247                 // 0xf2000450
40248                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40249                                                  ((instr >> 22) & 0x4));
40250                 if (dt.Is(kDataTypeValueInvalid)) {
40251                   UnallocatedA32(instr);
40252                   return;
40253                 }
40254                 if (((instr >> 12) & 1) != 0) {
40255                   UnallocatedA32(instr);
40256                   return;
40257                 }
40258                 unsigned rd = ExtractQRegister(instr, 22, 12);
40259                 if ((instr & 1) != 0) {
40260                   UnallocatedA32(instr);
40261                   return;
40262                 }
40263                 unsigned rm = ExtractQRegister(instr, 5, 0);
40264                 if (((instr >> 16) & 1) != 0) {
40265                   UnallocatedA32(instr);
40266                   return;
40267                 }
40268                 unsigned rn = ExtractQRegister(instr, 7, 16);
40269                 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
40270                 vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
40271                 break;
40272               }
40273               case 0x00000500: {
40274                 // 0xf2000510
40275                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40276                                                  ((instr >> 22) & 0x4));
40277                 if (dt.Is(kDataTypeValueInvalid)) {
40278                   UnallocatedA32(instr);
40279                   return;
40280                 }
40281                 unsigned rd = ExtractDRegister(instr, 22, 12);
40282                 unsigned rm = ExtractDRegister(instr, 5, 0);
40283                 unsigned rn = ExtractDRegister(instr, 7, 16);
40284                 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
40285                 vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
40286                 break;
40287               }
40288               case 0x00000540: {
40289                 // 0xf2000550
40290                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
40291                                                  ((instr >> 22) & 0x4));
40292                 if (dt.Is(kDataTypeValueInvalid)) {
40293                   UnallocatedA32(instr);
40294                   return;
40295                 }
40296                 if (((instr >> 12) & 1) != 0) {
40297                   UnallocatedA32(instr);
40298                   return;
40299                 }
40300                 unsigned rd = ExtractQRegister(instr, 22, 12);
40301                 if ((instr & 1) != 0) {
40302                   UnallocatedA32(instr);
40303                   return;
40304                 }
40305                 unsigned rm = ExtractQRegister(instr, 5, 0);
40306                 if (((instr >> 16) & 1) != 0) {
40307                   UnallocatedA32(instr);
40308                   return;
40309                 }
40310                 unsigned rn = ExtractQRegister(instr, 7, 16);
40311                 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
40312                 vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
40313                 break;
40314               }
40315               case 0x00000600: {
40316                 // 0xf2000610
40317                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40318                                                  ((instr >> 22) & 0x4));
40319                 if (dt.Is(kDataTypeValueInvalid)) {
40320                   UnallocatedA32(instr);
40321                   return;
40322                 }
40323                 unsigned rd = ExtractDRegister(instr, 22, 12);
40324                 unsigned rn = ExtractDRegister(instr, 7, 16);
40325                 unsigned rm = ExtractDRegister(instr, 5, 0);
40326                 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40327                 vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40328                 break;
40329               }
40330               case 0x00000640: {
40331                 // 0xf2000650
40332                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40333                                                  ((instr >> 22) & 0x4));
40334                 if (dt.Is(kDataTypeValueInvalid)) {
40335                   UnallocatedA32(instr);
40336                   return;
40337                 }
40338                 if (((instr >> 12) & 1) != 0) {
40339                   UnallocatedA32(instr);
40340                   return;
40341                 }
40342                 unsigned rd = ExtractQRegister(instr, 22, 12);
40343                 if (((instr >> 16) & 1) != 0) {
40344                   UnallocatedA32(instr);
40345                   return;
40346                 }
40347                 unsigned rn = ExtractQRegister(instr, 7, 16);
40348                 if ((instr & 1) != 0) {
40349                   UnallocatedA32(instr);
40350                   return;
40351                 }
40352                 unsigned rm = ExtractQRegister(instr, 5, 0);
40353                 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40354                 vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40355                 break;
40356               }
40357               case 0x00000700: {
40358                 // 0xf2000710
40359                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40360                                                  ((instr >> 22) & 0x4));
40361                 if (dt.Is(kDataTypeValueInvalid)) {
40362                   UnallocatedA32(instr);
40363                   return;
40364                 }
40365                 unsigned rd = ExtractDRegister(instr, 22, 12);
40366                 unsigned rn = ExtractDRegister(instr, 7, 16);
40367                 unsigned rm = ExtractDRegister(instr, 5, 0);
40368                 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
40369                 vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40370                 break;
40371               }
40372               case 0x00000740: {
40373                 // 0xf2000750
40374                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40375                                                  ((instr >> 22) & 0x4));
40376                 if (dt.Is(kDataTypeValueInvalid)) {
40377                   UnallocatedA32(instr);
40378                   return;
40379                 }
40380                 if (((instr >> 12) & 1) != 0) {
40381                   UnallocatedA32(instr);
40382                   return;
40383                 }
40384                 unsigned rd = ExtractQRegister(instr, 22, 12);
40385                 if (((instr >> 16) & 1) != 0) {
40386                   UnallocatedA32(instr);
40387                   return;
40388                 }
40389                 unsigned rn = ExtractQRegister(instr, 7, 16);
40390                 if ((instr & 1) != 0) {
40391                   UnallocatedA32(instr);
40392                   return;
40393                 }
40394                 unsigned rm = ExtractQRegister(instr, 5, 0);
40395                 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
40396                 vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40397                 break;
40398               }
40399               case 0x00000800: {
40400                 // 0xf2000810
40401                 switch (instr & 0x01000000) {
40402                   case 0x00000000: {
40403                     // 0xf2000810
40404                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40405                     if (dt.Is(kDataTypeValueInvalid)) {
40406                       UnallocatedA32(instr);
40407                       return;
40408                     }
40409                     unsigned rd = ExtractDRegister(instr, 22, 12);
40410                     unsigned rn = ExtractDRegister(instr, 7, 16);
40411                     unsigned rm = ExtractDRegister(instr, 5, 0);
40412                     // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40413                     vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40414                     break;
40415                   }
40416                   case 0x01000000: {
40417                     // 0xf3000810
40418                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40419                     if (dt.Is(kDataTypeValueInvalid)) {
40420                       UnallocatedA32(instr);
40421                       return;
40422                     }
40423                     unsigned rd = ExtractDRegister(instr, 22, 12);
40424                     unsigned rn = ExtractDRegister(instr, 7, 16);
40425                     unsigned rm = ExtractDRegister(instr, 5, 0);
40426                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40427                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40428                     break;
40429                   }
40430                 }
40431                 break;
40432               }
40433               case 0x00000840: {
40434                 // 0xf2000850
40435                 switch (instr & 0x01000000) {
40436                   case 0x00000000: {
40437                     // 0xf2000850
40438                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
40439                     if (dt.Is(kDataTypeValueInvalid)) {
40440                       UnallocatedA32(instr);
40441                       return;
40442                     }
40443                     if (((instr >> 12) & 1) != 0) {
40444                       UnallocatedA32(instr);
40445                       return;
40446                     }
40447                     unsigned rd = ExtractQRegister(instr, 22, 12);
40448                     if (((instr >> 16) & 1) != 0) {
40449                       UnallocatedA32(instr);
40450                       return;
40451                     }
40452                     unsigned rn = ExtractQRegister(instr, 7, 16);
40453                     if ((instr & 1) != 0) {
40454                       UnallocatedA32(instr);
40455                       return;
40456                     }
40457                     unsigned rm = ExtractQRegister(instr, 5, 0);
40458                     // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40459                     vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40460                     break;
40461                   }
40462                   case 0x01000000: {
40463                     // 0xf3000850
40464                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40465                     if (dt.Is(kDataTypeValueInvalid)) {
40466                       UnallocatedA32(instr);
40467                       return;
40468                     }
40469                     if (((instr >> 12) & 1) != 0) {
40470                       UnallocatedA32(instr);
40471                       return;
40472                     }
40473                     unsigned rd = ExtractQRegister(instr, 22, 12);
40474                     if (((instr >> 16) & 1) != 0) {
40475                       UnallocatedA32(instr);
40476                       return;
40477                     }
40478                     unsigned rn = ExtractQRegister(instr, 7, 16);
40479                     if ((instr & 1) != 0) {
40480                       UnallocatedA32(instr);
40481                       return;
40482                     }
40483                     unsigned rm = ExtractQRegister(instr, 5, 0);
40484                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40485                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40486                     break;
40487                   }
40488                 }
40489                 break;
40490               }
40491               case 0x00000900: {
40492                 // 0xf2000910
40493                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40494                                                   ((instr >> 22) & 0x4));
40495                 if (dt.Is(kDataTypeValueInvalid)) {
40496                   UnallocatedA32(instr);
40497                   return;
40498                 }
40499                 unsigned rd = ExtractDRegister(instr, 22, 12);
40500                 unsigned rn = ExtractDRegister(instr, 7, 16);
40501                 unsigned rm = ExtractDRegister(instr, 5, 0);
40502                 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40503                 vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40504                 break;
40505               }
40506               case 0x00000940: {
40507                 // 0xf2000950
40508                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
40509                                                   ((instr >> 22) & 0x4));
40510                 if (dt.Is(kDataTypeValueInvalid)) {
40511                   UnallocatedA32(instr);
40512                   return;
40513                 }
40514                 if (((instr >> 12) & 1) != 0) {
40515                   UnallocatedA32(instr);
40516                   return;
40517                 }
40518                 unsigned rd = ExtractQRegister(instr, 22, 12);
40519                 if (((instr >> 16) & 1) != 0) {
40520                   UnallocatedA32(instr);
40521                   return;
40522                 }
40523                 unsigned rn = ExtractQRegister(instr, 7, 16);
40524                 if ((instr & 1) != 0) {
40525                   UnallocatedA32(instr);
40526                   return;
40527                 }
40528                 unsigned rm = ExtractQRegister(instr, 5, 0);
40529                 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
40530                 vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
40531                 break;
40532               }
40533               case 0x00000a00: {
40534                 // 0xf2000a10
40535                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
40536                                                  ((instr >> 22) & 0x4));
40537                 if (dt.Is(kDataTypeValueInvalid)) {
40538                   UnallocatedA32(instr);
40539                   return;
40540                 }
40541                 unsigned rd = ExtractDRegister(instr, 22, 12);
40542                 unsigned rn = ExtractDRegister(instr, 7, 16);
40543                 unsigned rm = ExtractDRegister(instr, 5, 0);
40544                 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40545                 vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40546                 break;
40547               }
40548               case 0x00000b00: {
40549                 // 0xf2000b10
40550                 if ((instr & 0x01000000) == 0x00000000) {
40551                   DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
40552                   if (dt.Is(kDataTypeValueInvalid)) {
40553                     UnallocatedA32(instr);
40554                     return;
40555                   }
40556                   unsigned rd = ExtractDRegister(instr, 22, 12);
40557                   unsigned rn = ExtractDRegister(instr, 7, 16);
40558                   unsigned rm = ExtractDRegister(instr, 5, 0);
40559                   // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
40560                   vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
40561                 } else {
40562                   UnallocatedA32(instr);
40563                 }
40564                 break;
40565               }
40566               case 0x00000c00: {
40567                 // 0xf2000c10
40568                 switch (instr & 0x01300000) {
40569                   case 0x00000000: {
40570                     // 0xf2000c10
40571                     unsigned rd = ExtractDRegister(instr, 22, 12);
40572                     unsigned rn = ExtractDRegister(instr, 7, 16);
40573                     unsigned rm = ExtractDRegister(instr, 5, 0);
40574                     // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40575                     vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40576                     break;
40577                   }
40578                   case 0x00200000: {
40579                     // 0xf2200c10
40580                     unsigned rd = ExtractDRegister(instr, 22, 12);
40581                     unsigned rn = ExtractDRegister(instr, 7, 16);
40582                     unsigned rm = ExtractDRegister(instr, 5, 0);
40583                     // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40584                     vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40585                     break;
40586                   }
40587                   default:
40588                     UnallocatedA32(instr);
40589                     break;
40590                 }
40591                 break;
40592               }
40593               case 0x00000c40: {
40594                 // 0xf2000c50
40595                 switch (instr & 0x01300000) {
40596                   case 0x00000000: {
40597                     // 0xf2000c50
40598                     if (((instr >> 12) & 1) != 0) {
40599                       UnallocatedA32(instr);
40600                       return;
40601                     }
40602                     unsigned rd = ExtractQRegister(instr, 22, 12);
40603                     if (((instr >> 16) & 1) != 0) {
40604                       UnallocatedA32(instr);
40605                       return;
40606                     }
40607                     unsigned rn = ExtractQRegister(instr, 7, 16);
40608                     if ((instr & 1) != 0) {
40609                       UnallocatedA32(instr);
40610                       return;
40611                     }
40612                     unsigned rm = ExtractQRegister(instr, 5, 0);
40613                     // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40614                     vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40615                     break;
40616                   }
40617                   case 0x00200000: {
40618                     // 0xf2200c50
40619                     if (((instr >> 12) & 1) != 0) {
40620                       UnallocatedA32(instr);
40621                       return;
40622                     }
40623                     unsigned rd = ExtractQRegister(instr, 22, 12);
40624                     if (((instr >> 16) & 1) != 0) {
40625                       UnallocatedA32(instr);
40626                       return;
40627                     }
40628                     unsigned rn = ExtractQRegister(instr, 7, 16);
40629                     if ((instr & 1) != 0) {
40630                       UnallocatedA32(instr);
40631                       return;
40632                     }
40633                     unsigned rm = ExtractQRegister(instr, 5, 0);
40634                     // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40635                     vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40636                     break;
40637                   }
40638                   default:
40639                     UnallocatedA32(instr);
40640                     break;
40641                 }
40642                 break;
40643               }
40644               case 0x00000d00: {
40645                 // 0xf2000d10
40646                 switch (instr & 0x01300000) {
40647                   case 0x00000000: {
40648                     // 0xf2000d10
40649                     unsigned rd = ExtractDRegister(instr, 22, 12);
40650                     unsigned rn = ExtractDRegister(instr, 7, 16);
40651                     unsigned rm = ExtractDRegister(instr, 5, 0);
40652                     // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40653                     vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40654                     break;
40655                   }
40656                   case 0x00200000: {
40657                     // 0xf2200d10
40658                     unsigned rd = ExtractDRegister(instr, 22, 12);
40659                     unsigned rn = ExtractDRegister(instr, 7, 16);
40660                     unsigned rm = ExtractDRegister(instr, 5, 0);
40661                     // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40662                     vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40663                     break;
40664                   }
40665                   case 0x01000000: {
40666                     // 0xf3000d10
40667                     unsigned rd = ExtractDRegister(instr, 22, 12);
40668                     unsigned rn = ExtractDRegister(instr, 7, 16);
40669                     unsigned rm = ExtractDRegister(instr, 5, 0);
40670                     // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40671                     vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40672                     break;
40673                   }
40674                   default:
40675                     UnallocatedA32(instr);
40676                     break;
40677                 }
40678                 break;
40679               }
40680               case 0x00000d40: {
40681                 // 0xf2000d50
40682                 switch (instr & 0x01300000) {
40683                   case 0x00000000: {
40684                     // 0xf2000d50
40685                     if (((instr >> 12) & 1) != 0) {
40686                       UnallocatedA32(instr);
40687                       return;
40688                     }
40689                     unsigned rd = ExtractQRegister(instr, 22, 12);
40690                     if (((instr >> 16) & 1) != 0) {
40691                       UnallocatedA32(instr);
40692                       return;
40693                     }
40694                     unsigned rn = ExtractQRegister(instr, 7, 16);
40695                     if ((instr & 1) != 0) {
40696                       UnallocatedA32(instr);
40697                       return;
40698                     }
40699                     unsigned rm = ExtractQRegister(instr, 5, 0);
40700                     // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40701                     vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40702                     break;
40703                   }
40704                   case 0x00200000: {
40705                     // 0xf2200d50
40706                     if (((instr >> 12) & 1) != 0) {
40707                       UnallocatedA32(instr);
40708                       return;
40709                     }
40710                     unsigned rd = ExtractQRegister(instr, 22, 12);
40711                     if (((instr >> 16) & 1) != 0) {
40712                       UnallocatedA32(instr);
40713                       return;
40714                     }
40715                     unsigned rn = ExtractQRegister(instr, 7, 16);
40716                     if ((instr & 1) != 0) {
40717                       UnallocatedA32(instr);
40718                       return;
40719                     }
40720                     unsigned rm = ExtractQRegister(instr, 5, 0);
40721                     // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40722                     vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40723                     break;
40724                   }
40725                   case 0x01000000: {
40726                     // 0xf3000d50
40727                     if (((instr >> 12) & 1) != 0) {
40728                       UnallocatedA32(instr);
40729                       return;
40730                     }
40731                     unsigned rd = ExtractQRegister(instr, 22, 12);
40732                     if (((instr >> 16) & 1) != 0) {
40733                       UnallocatedA32(instr);
40734                       return;
40735                     }
40736                     unsigned rn = ExtractQRegister(instr, 7, 16);
40737                     if ((instr & 1) != 0) {
40738                       UnallocatedA32(instr);
40739                       return;
40740                     }
40741                     unsigned rm = ExtractQRegister(instr, 5, 0);
40742                     // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40743                     vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40744                     break;
40745                   }
40746                   default:
40747                     UnallocatedA32(instr);
40748                     break;
40749                 }
40750                 break;
40751               }
40752               case 0x00000e00: {
40753                 // 0xf2000e10
40754                 switch (instr & 0x01300000) {
40755                   case 0x01000000: {
40756                     // 0xf3000e10
40757                     unsigned rd = ExtractDRegister(instr, 22, 12);
40758                     unsigned rn = ExtractDRegister(instr, 7, 16);
40759                     unsigned rm = ExtractDRegister(instr, 5, 0);
40760                     // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40761                     vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40762                     break;
40763                   }
40764                   case 0x01200000: {
40765                     // 0xf3200e10
40766                     unsigned rd = ExtractDRegister(instr, 22, 12);
40767                     unsigned rn = ExtractDRegister(instr, 7, 16);
40768                     unsigned rm = ExtractDRegister(instr, 5, 0);
40769                     // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40770                     vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
40771                     break;
40772                   }
40773                   default:
40774                     UnallocatedA32(instr);
40775                     break;
40776                 }
40777                 break;
40778               }
40779               case 0x00000e40: {
40780                 // 0xf2000e50
40781                 switch (instr & 0x01300000) {
40782                   case 0x01000000: {
40783                     // 0xf3000e50
40784                     if (((instr >> 12) & 1) != 0) {
40785                       UnallocatedA32(instr);
40786                       return;
40787                     }
40788                     unsigned rd = ExtractQRegister(instr, 22, 12);
40789                     if (((instr >> 16) & 1) != 0) {
40790                       UnallocatedA32(instr);
40791                       return;
40792                     }
40793                     unsigned rn = ExtractQRegister(instr, 7, 16);
40794                     if ((instr & 1) != 0) {
40795                       UnallocatedA32(instr);
40796                       return;
40797                     }
40798                     unsigned rm = ExtractQRegister(instr, 5, 0);
40799                     // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40800                     vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40801                     break;
40802                   }
40803                   case 0x01200000: {
40804                     // 0xf3200e50
40805                     if (((instr >> 12) & 1) != 0) {
40806                       UnallocatedA32(instr);
40807                       return;
40808                     }
40809                     unsigned rd = ExtractQRegister(instr, 22, 12);
40810                     if (((instr >> 16) & 1) != 0) {
40811                       UnallocatedA32(instr);
40812                       return;
40813                     }
40814                     unsigned rn = ExtractQRegister(instr, 7, 16);
40815                     if ((instr & 1) != 0) {
40816                       UnallocatedA32(instr);
40817                       return;
40818                     }
40819                     unsigned rm = ExtractQRegister(instr, 5, 0);
40820                     // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40821                     vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
40822                     break;
40823                   }
40824                   default:
40825                     UnallocatedA32(instr);
40826                     break;
40827                 }
40828                 break;
40829               }
40830               case 0x00000f00: {
40831                 // 0xf2000f10
40832                 switch (instr & 0x01300000) {
40833                   case 0x00000000: {
40834                     // 0xf2000f10
40835                     unsigned rd = ExtractDRegister(instr, 22, 12);
40836                     unsigned rn = ExtractDRegister(instr, 7, 16);
40837                     unsigned rm = ExtractDRegister(instr, 5, 0);
40838                     // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40839                     vrecps(al,
40840                            F32,
40841                            DRegister(rd),
40842                            DRegister(rn),
40843                            DRegister(rm));
40844                     break;
40845                   }
40846                   case 0x00200000: {
40847                     // 0xf2200f10
40848                     unsigned rd = ExtractDRegister(instr, 22, 12);
40849                     unsigned rn = ExtractDRegister(instr, 7, 16);
40850                     unsigned rm = ExtractDRegister(instr, 5, 0);
40851                     // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
40852                     vrsqrts(al,
40853                             F32,
40854                             DRegister(rd),
40855                             DRegister(rn),
40856                             DRegister(rm));
40857                     break;
40858                   }
40859                   case 0x01000000: {
40860                     // 0xf3000f10
40861                     unsigned rd = ExtractDRegister(instr, 22, 12);
40862                     unsigned rn = ExtractDRegister(instr, 7, 16);
40863                     unsigned rm = ExtractDRegister(instr, 5, 0);
40864                     // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40865                     vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
40866                     break;
40867                   }
40868                   case 0x01200000: {
40869                     // 0xf3200f10
40870                     unsigned rd = ExtractDRegister(instr, 22, 12);
40871                     unsigned rn = ExtractDRegister(instr, 7, 16);
40872                     unsigned rm = ExtractDRegister(instr, 5, 0);
40873                     // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
40874                     vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
40875                     break;
40876                   }
40877                   default:
40878                     UnallocatedA32(instr);
40879                     break;
40880                 }
40881                 break;
40882               }
40883               case 0x00000f40: {
40884                 // 0xf2000f50
40885                 switch (instr & 0x01300000) {
40886                   case 0x00000000: {
40887                     // 0xf2000f50
40888                     if (((instr >> 12) & 1) != 0) {
40889                       UnallocatedA32(instr);
40890                       return;
40891                     }
40892                     unsigned rd = ExtractQRegister(instr, 22, 12);
40893                     if (((instr >> 16) & 1) != 0) {
40894                       UnallocatedA32(instr);
40895                       return;
40896                     }
40897                     unsigned rn = ExtractQRegister(instr, 7, 16);
40898                     if ((instr & 1) != 0) {
40899                       UnallocatedA32(instr);
40900                       return;
40901                     }
40902                     unsigned rm = ExtractQRegister(instr, 5, 0);
40903                     // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40904                     vrecps(al,
40905                            F32,
40906                            QRegister(rd),
40907                            QRegister(rn),
40908                            QRegister(rm));
40909                     break;
40910                   }
40911                   case 0x00200000: {
40912                     // 0xf2200f50
40913                     if (((instr >> 12) & 1) != 0) {
40914                       UnallocatedA32(instr);
40915                       return;
40916                     }
40917                     unsigned rd = ExtractQRegister(instr, 22, 12);
40918                     if (((instr >> 16) & 1) != 0) {
40919                       UnallocatedA32(instr);
40920                       return;
40921                     }
40922                     unsigned rn = ExtractQRegister(instr, 7, 16);
40923                     if ((instr & 1) != 0) {
40924                       UnallocatedA32(instr);
40925                       return;
40926                     }
40927                     unsigned rm = ExtractQRegister(instr, 5, 0);
40928                     // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
40929                     vrsqrts(al,
40930                             F32,
40931                             QRegister(rd),
40932                             QRegister(rn),
40933                             QRegister(rm));
40934                     break;
40935                   }
40936                   case 0x01000000: {
40937                     // 0xf3000f50
40938                     if (((instr >> 12) & 1) != 0) {
40939                       UnallocatedA32(instr);
40940                       return;
40941                     }
40942                     unsigned rd = ExtractQRegister(instr, 22, 12);
40943                     if (((instr >> 16) & 1) != 0) {
40944                       UnallocatedA32(instr);
40945                       return;
40946                     }
40947                     unsigned rn = ExtractQRegister(instr, 7, 16);
40948                     if ((instr & 1) != 0) {
40949                       UnallocatedA32(instr);
40950                       return;
40951                     }
40952                     unsigned rm = ExtractQRegister(instr, 5, 0);
40953                     // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40954                     vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
40955                     break;
40956                   }
40957                   case 0x01200000: {
40958                     // 0xf3200f50
40959                     if (((instr >> 12) & 1) != 0) {
40960                       UnallocatedA32(instr);
40961                       return;
40962                     }
40963                     unsigned rd = ExtractQRegister(instr, 22, 12);
40964                     if (((instr >> 16) & 1) != 0) {
40965                       UnallocatedA32(instr);
40966                       return;
40967                     }
40968                     unsigned rn = ExtractQRegister(instr, 7, 16);
40969                     if ((instr & 1) != 0) {
40970                       UnallocatedA32(instr);
40971                       return;
40972                     }
40973                     unsigned rm = ExtractQRegister(instr, 5, 0);
40974                     // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
40975                     vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
40976                     break;
40977                   }
40978                   default:
40979                     UnallocatedA32(instr);
40980                     break;
40981                 }
40982                 break;
40983               }
40984               default:
40985                 UnallocatedA32(instr);
40986                 break;
40987             }
40988             break;
40989           }
40990           case 0x00800000: {
40991             // 0xf2800000
40992             switch (instr & 0x00300000) {
40993               case 0x00300000: {
40994                 // 0xf2b00000
40995                 switch (instr & 0x01000000) {
40996                   case 0x00000000: {
40997                     // 0xf2b00000
40998                     switch (instr & 0x00000040) {
40999                       case 0x00000000: {
41000                         // 0xf2b00000
41001                         if (((instr & 0x800) == 0x800)) {
41002                           UnallocatedA32(instr);
41003                           return;
41004                         }
41005                         unsigned rd = ExtractDRegister(instr, 22, 12);
41006                         unsigned rn = ExtractDRegister(instr, 7, 16);
41007                         unsigned rm = ExtractDRegister(instr, 5, 0);
41008                         uint32_t imm = (instr >> 8) & 0xf;
41009                         // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
41010                         vext(al,
41011                              Untyped8,
41012                              DRegister(rd),
41013                              DRegister(rn),
41014                              DRegister(rm),
41015                              imm);
41016                         break;
41017                       }
41018                       case 0x00000040: {
41019                         // 0xf2b00040
41020                         if (((instr >> 12) & 1) != 0) {
41021                           UnallocatedA32(instr);
41022                           return;
41023                         }
41024                         unsigned rd = ExtractQRegister(instr, 22, 12);
41025                         if (((instr >> 16) & 1) != 0) {
41026                           UnallocatedA32(instr);
41027                           return;
41028                         }
41029                         unsigned rn = ExtractQRegister(instr, 7, 16);
41030                         if ((instr & 1) != 0) {
41031                           UnallocatedA32(instr);
41032                           return;
41033                         }
41034                         unsigned rm = ExtractQRegister(instr, 5, 0);
41035                         uint32_t imm = (instr >> 8) & 0xf;
41036                         // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
41037                         vext(al,
41038                              Untyped8,
41039                              QRegister(rd),
41040                              QRegister(rn),
41041                              QRegister(rm),
41042                              imm);
41043                         break;
41044                       }
41045                     }
41046                     break;
41047                   }
41048                   case 0x01000000: {
41049                     // 0xf3b00000
41050                     switch (instr & 0x00000800) {
41051                       case 0x00000000: {
41052                         // 0xf3b00000
41053                         switch (instr & 0x00030200) {
41054                           case 0x00000000: {
41055                             // 0xf3b00000
41056                             switch (instr & 0x000005c0) {
41057                               case 0x00000000: {
41058                                 // 0xf3b00000
41059                                 DataType dt =
41060                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41061                                 if (dt.Is(kDataTypeValueInvalid)) {
41062                                   UnallocatedA32(instr);
41063                                   return;
41064                                 }
41065                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41066                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41067                                 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41068                                 vrev64(al, dt, DRegister(rd), DRegister(rm));
41069                                 break;
41070                               }
41071                               case 0x00000040: {
41072                                 // 0xf3b00040
41073                                 DataType dt =
41074                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41075                                 if (dt.Is(kDataTypeValueInvalid)) {
41076                                   UnallocatedA32(instr);
41077                                   return;
41078                                 }
41079                                 if (((instr >> 12) & 1) != 0) {
41080                                   UnallocatedA32(instr);
41081                                   return;
41082                                 }
41083                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41084                                 if ((instr & 1) != 0) {
41085                                   UnallocatedA32(instr);
41086                                   return;
41087                                 }
41088                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41089                                 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41090                                 vrev64(al, dt, QRegister(rd), QRegister(rm));
41091                                 break;
41092                               }
41093                               case 0x00000080: {
41094                                 // 0xf3b00080
41095                                 DataType dt =
41096                                     Dt_size_15_Decode((instr >> 18) & 0x3);
41097                                 if (dt.Is(kDataTypeValueInvalid)) {
41098                                   UnallocatedA32(instr);
41099                                   return;
41100                                 }
41101                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41102                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41103                                 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41104                                 vrev32(al, dt, DRegister(rd), DRegister(rm));
41105                                 break;
41106                               }
41107                               case 0x000000c0: {
41108                                 // 0xf3b000c0
41109                                 DataType dt =
41110                                     Dt_size_15_Decode((instr >> 18) & 0x3);
41111                                 if (dt.Is(kDataTypeValueInvalid)) {
41112                                   UnallocatedA32(instr);
41113                                   return;
41114                                 }
41115                                 if (((instr >> 12) & 1) != 0) {
41116                                   UnallocatedA32(instr);
41117                                   return;
41118                                 }
41119                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41120                                 if ((instr & 1) != 0) {
41121                                   UnallocatedA32(instr);
41122                                   return;
41123                                 }
41124                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41125                                 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41126                                 vrev32(al, dt, QRegister(rd), QRegister(rm));
41127                                 break;
41128                               }
41129                               case 0x00000100: {
41130                                 // 0xf3b00100
41131                                 DataType dt =
41132                                     Dt_size_1_Decode((instr >> 18) & 0x3);
41133                                 if (dt.Is(kDataTypeValueInvalid)) {
41134                                   UnallocatedA32(instr);
41135                                   return;
41136                                 }
41137                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41138                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41139                                 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41140                                 vrev16(al, dt, DRegister(rd), DRegister(rm));
41141                                 break;
41142                               }
41143                               case 0x00000140: {
41144                                 // 0xf3b00140
41145                                 DataType dt =
41146                                     Dt_size_1_Decode((instr >> 18) & 0x3);
41147                                 if (dt.Is(kDataTypeValueInvalid)) {
41148                                   UnallocatedA32(instr);
41149                                   return;
41150                                 }
41151                                 if (((instr >> 12) & 1) != 0) {
41152                                   UnallocatedA32(instr);
41153                                   return;
41154                                 }
41155                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41156                                 if ((instr & 1) != 0) {
41157                                   UnallocatedA32(instr);
41158                                   return;
41159                                 }
41160                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41161                                 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41162                                 vrev16(al, dt, QRegister(rd), QRegister(rm));
41163                                 break;
41164                               }
41165                               case 0x00000400: {
41166                                 // 0xf3b00400
41167                                 DataType dt =
41168                                     Dt_size_5_Decode((instr >> 18) & 0x3);
41169                                 if (dt.Is(kDataTypeValueInvalid)) {
41170                                   UnallocatedA32(instr);
41171                                   return;
41172                                 }
41173                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41174                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41175                                 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41176                                 vcls(al, dt, DRegister(rd), DRegister(rm));
41177                                 break;
41178                               }
41179                               case 0x00000440: {
41180                                 // 0xf3b00440
41181                                 DataType dt =
41182                                     Dt_size_5_Decode((instr >> 18) & 0x3);
41183                                 if (dt.Is(kDataTypeValueInvalid)) {
41184                                   UnallocatedA32(instr);
41185                                   return;
41186                                 }
41187                                 if (((instr >> 12) & 1) != 0) {
41188                                   UnallocatedA32(instr);
41189                                   return;
41190                                 }
41191                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41192                                 if ((instr & 1) != 0) {
41193                                   UnallocatedA32(instr);
41194                                   return;
41195                                 }
41196                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41197                                 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41198                                 vcls(al, dt, QRegister(rd), QRegister(rm));
41199                                 break;
41200                               }
41201                               case 0x00000480: {
41202                                 // 0xf3b00480
41203                                 DataType dt =
41204                                     Dt_size_4_Decode((instr >> 18) & 0x3);
41205                                 if (dt.Is(kDataTypeValueInvalid)) {
41206                                   UnallocatedA32(instr);
41207                                   return;
41208                                 }
41209                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41210                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41211                                 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41212                                 vclz(al, dt, DRegister(rd), DRegister(rm));
41213                                 break;
41214                               }
41215                               case 0x000004c0: {
41216                                 // 0xf3b004c0
41217                                 DataType dt =
41218                                     Dt_size_4_Decode((instr >> 18) & 0x3);
41219                                 if (dt.Is(kDataTypeValueInvalid)) {
41220                                   UnallocatedA32(instr);
41221                                   return;
41222                                 }
41223                                 if (((instr >> 12) & 1) != 0) {
41224                                   UnallocatedA32(instr);
41225                                   return;
41226                                 }
41227                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41228                                 if ((instr & 1) != 0) {
41229                                   UnallocatedA32(instr);
41230                                   return;
41231                                 }
41232                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41233                                 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41234                                 vclz(al, dt, QRegister(rd), QRegister(rm));
41235                                 break;
41236                               }
41237                               case 0x00000500: {
41238                                 // 0xf3b00500
41239                                 if ((instr & 0x000c0000) == 0x00000000) {
41240                                   unsigned rd = ExtractDRegister(instr, 22, 12);
41241                                   unsigned rm = ExtractDRegister(instr, 5, 0);
41242                                   // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
41243                                   vcnt(al,
41244                                        Untyped8,
41245                                        DRegister(rd),
41246                                        DRegister(rm));
41247                                 } else {
41248                                   UnallocatedA32(instr);
41249                                 }
41250                                 break;
41251                               }
41252                               case 0x00000540: {
41253                                 // 0xf3b00540
41254                                 if ((instr & 0x000c0000) == 0x00000000) {
41255                                   if (((instr >> 12) & 1) != 0) {
41256                                     UnallocatedA32(instr);
41257                                     return;
41258                                   }
41259                                   unsigned rd = ExtractQRegister(instr, 22, 12);
41260                                   if ((instr & 1) != 0) {
41261                                     UnallocatedA32(instr);
41262                                     return;
41263                                   }
41264                                   unsigned rm = ExtractQRegister(instr, 5, 0);
41265                                   // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
41266                                   vcnt(al,
41267                                        Untyped8,
41268                                        QRegister(rd),
41269                                        QRegister(rm));
41270                                 } else {
41271                                   UnallocatedA32(instr);
41272                                 }
41273                                 break;
41274                               }
41275                               case 0x00000580: {
41276                                 // 0xf3b00580
41277                                 if ((instr & 0x000c0000) == 0x00000000) {
41278                                   unsigned rd = ExtractDRegister(instr, 22, 12);
41279                                   unsigned rm = ExtractDRegister(instr, 5, 0);
41280                                   // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
41281                                   vmvn(al,
41282                                        kDataTypeValueNone,
41283                                        DRegister(rd),
41284                                        DRegister(rm));
41285                                 } else {
41286                                   UnallocatedA32(instr);
41287                                 }
41288                                 break;
41289                               }
41290                               case 0x000005c0: {
41291                                 // 0xf3b005c0
41292                                 if ((instr & 0x000c0000) == 0x00000000) {
41293                                   if (((instr >> 12) & 1) != 0) {
41294                                     UnallocatedA32(instr);
41295                                     return;
41296                                   }
41297                                   unsigned rd = ExtractQRegister(instr, 22, 12);
41298                                   if ((instr & 1) != 0) {
41299                                     UnallocatedA32(instr);
41300                                     return;
41301                                   }
41302                                   unsigned rm = ExtractQRegister(instr, 5, 0);
41303                                   // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
41304                                   vmvn(al,
41305                                        kDataTypeValueNone,
41306                                        QRegister(rd),
41307                                        QRegister(rm));
41308                                 } else {
41309                                   UnallocatedA32(instr);
41310                                 }
41311                                 break;
41312                               }
41313                               default:
41314                                 UnallocatedA32(instr);
41315                                 break;
41316                             }
41317                             break;
41318                           }
41319                           case 0x00000200: {
41320                             // 0xf3b00200
41321                             switch (instr & 0x00000540) {
41322                               case 0x00000000: {
41323                                 // 0xf3b00200
41324                                 DataType dt =
41325                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41326                                                         ((instr >> 5) & 0x4));
41327                                 if (dt.Is(kDataTypeValueInvalid)) {
41328                                   UnallocatedA32(instr);
41329                                   return;
41330                                 }
41331                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41332                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41333                                 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41334                                 vpaddl(al, dt, DRegister(rd), DRegister(rm));
41335                                 break;
41336                               }
41337                               case 0x00000040: {
41338                                 // 0xf3b00240
41339                                 DataType dt =
41340                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41341                                                         ((instr >> 5) & 0x4));
41342                                 if (dt.Is(kDataTypeValueInvalid)) {
41343                                   UnallocatedA32(instr);
41344                                   return;
41345                                 }
41346                                 if (((instr >> 12) & 1) != 0) {
41347                                   UnallocatedA32(instr);
41348                                   return;
41349                                 }
41350                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41351                                 if ((instr & 1) != 0) {
41352                                   UnallocatedA32(instr);
41353                                   return;
41354                                 }
41355                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41356                                 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41357                                 vpaddl(al, dt, QRegister(rd), QRegister(rm));
41358                                 break;
41359                               }
41360                               case 0x00000100: {
41361                                 // 0xf3b00300
41362                                 switch (instr & 0x00000080) {
41363                                   case 0x00000000: {
41364                                     // 0xf3b00300
41365                                     UnimplementedA32("AESE", instr);
41366                                     break;
41367                                   }
41368                                   case 0x00000080: {
41369                                     // 0xf3b00380
41370                                     UnimplementedA32("AESMC", instr);
41371                                     break;
41372                                   }
41373                                 }
41374                                 break;
41375                               }
41376                               case 0x00000140: {
41377                                 // 0xf3b00340
41378                                 switch (instr & 0x00000080) {
41379                                   case 0x00000000: {
41380                                     // 0xf3b00340
41381                                     UnimplementedA32("AESD", instr);
41382                                     break;
41383                                   }
41384                                   case 0x00000080: {
41385                                     // 0xf3b003c0
41386                                     UnimplementedA32("AESIMC", instr);
41387                                     break;
41388                                   }
41389                                 }
41390                                 break;
41391                               }
41392                               case 0x00000400: {
41393                                 // 0xf3b00600
41394                                 DataType dt =
41395                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41396                                                         ((instr >> 5) & 0x4));
41397                                 if (dt.Is(kDataTypeValueInvalid)) {
41398                                   UnallocatedA32(instr);
41399                                   return;
41400                                 }
41401                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41402                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41403                                 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41404                                 vpadal(al, dt, DRegister(rd), DRegister(rm));
41405                                 break;
41406                               }
41407                               case 0x00000440: {
41408                                 // 0xf3b00640
41409                                 DataType dt =
41410                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
41411                                                         ((instr >> 5) & 0x4));
41412                                 if (dt.Is(kDataTypeValueInvalid)) {
41413                                   UnallocatedA32(instr);
41414                                   return;
41415                                 }
41416                                 if (((instr >> 12) & 1) != 0) {
41417                                   UnallocatedA32(instr);
41418                                   return;
41419                                 }
41420                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41421                                 if ((instr & 1) != 0) {
41422                                   UnallocatedA32(instr);
41423                                   return;
41424                                 }
41425                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41426                                 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41427                                 vpadal(al, dt, QRegister(rd), QRegister(rm));
41428                                 break;
41429                               }
41430                               case 0x00000500: {
41431                                 // 0xf3b00700
41432                                 switch (instr & 0x00000080) {
41433                                   case 0x00000000: {
41434                                     // 0xf3b00700
41435                                     DataType dt =
41436                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41437                                     if (dt.Is(kDataTypeValueInvalid)) {
41438                                       UnallocatedA32(instr);
41439                                       return;
41440                                     }
41441                                     unsigned rd =
41442                                         ExtractDRegister(instr, 22, 12);
41443                                     unsigned rm = ExtractDRegister(instr, 5, 0);
41444                                     // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41445                                     vqabs(al, dt, DRegister(rd), DRegister(rm));
41446                                     break;
41447                                   }
41448                                   case 0x00000080: {
41449                                     // 0xf3b00780
41450                                     DataType dt =
41451                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41452                                     if (dt.Is(kDataTypeValueInvalid)) {
41453                                       UnallocatedA32(instr);
41454                                       return;
41455                                     }
41456                                     unsigned rd =
41457                                         ExtractDRegister(instr, 22, 12);
41458                                     unsigned rm = ExtractDRegister(instr, 5, 0);
41459                                     // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41460                                     vqneg(al, dt, DRegister(rd), DRegister(rm));
41461                                     break;
41462                                   }
41463                                 }
41464                                 break;
41465                               }
41466                               case 0x00000540: {
41467                                 // 0xf3b00740
41468                                 switch (instr & 0x00000080) {
41469                                   case 0x00000000: {
41470                                     // 0xf3b00740
41471                                     DataType dt =
41472                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41473                                     if (dt.Is(kDataTypeValueInvalid)) {
41474                                       UnallocatedA32(instr);
41475                                       return;
41476                                     }
41477                                     if (((instr >> 12) & 1) != 0) {
41478                                       UnallocatedA32(instr);
41479                                       return;
41480                                     }
41481                                     unsigned rd =
41482                                         ExtractQRegister(instr, 22, 12);
41483                                     if ((instr & 1) != 0) {
41484                                       UnallocatedA32(instr);
41485                                       return;
41486                                     }
41487                                     unsigned rm = ExtractQRegister(instr, 5, 0);
41488                                     // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41489                                     vqabs(al, dt, QRegister(rd), QRegister(rm));
41490                                     break;
41491                                   }
41492                                   case 0x00000080: {
41493                                     // 0xf3b007c0
41494                                     DataType dt =
41495                                         Dt_size_5_Decode((instr >> 18) & 0x3);
41496                                     if (dt.Is(kDataTypeValueInvalid)) {
41497                                       UnallocatedA32(instr);
41498                                       return;
41499                                     }
41500                                     if (((instr >> 12) & 1) != 0) {
41501                                       UnallocatedA32(instr);
41502                                       return;
41503                                     }
41504                                     unsigned rd =
41505                                         ExtractQRegister(instr, 22, 12);
41506                                     if ((instr & 1) != 0) {
41507                                       UnallocatedA32(instr);
41508                                       return;
41509                                     }
41510                                     unsigned rm = ExtractQRegister(instr, 5, 0);
41511                                     // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41512                                     vqneg(al, dt, QRegister(rd), QRegister(rm));
41513                                     break;
41514                                   }
41515                                 }
41516                                 break;
41517                               }
41518                             }
41519                             break;
41520                           }
41521                           case 0x00010000: {
41522                             // 0xf3b10000
41523                             switch (instr & 0x000001c0) {
41524                               case 0x00000000: {
41525                                 // 0xf3b10000
41526                                 DataType dt =
41527                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41528                                                        ((instr >> 8) & 0x4));
41529                                 if (dt.Is(kDataTypeValueInvalid)) {
41530                                   UnallocatedA32(instr);
41531                                   return;
41532                                 }
41533                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41534                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41535                                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41536                                 vcgt(al,
41537                                      dt,
41538                                      DRegister(rd),
41539                                      DRegister(rm),
41540                                      UINT32_C(0));
41541                                 break;
41542                               }
41543                               case 0x00000040: {
41544                                 // 0xf3b10040
41545                                 DataType dt =
41546                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41547                                                        ((instr >> 8) & 0x4));
41548                                 if (dt.Is(kDataTypeValueInvalid)) {
41549                                   UnallocatedA32(instr);
41550                                   return;
41551                                 }
41552                                 if (((instr >> 12) & 1) != 0) {
41553                                   UnallocatedA32(instr);
41554                                   return;
41555                                 }
41556                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41557                                 if ((instr & 1) != 0) {
41558                                   UnallocatedA32(instr);
41559                                   return;
41560                                 }
41561                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41562                                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41563                                 vcgt(al,
41564                                      dt,
41565                                      QRegister(rd),
41566                                      QRegister(rm),
41567                                      UINT32_C(0));
41568                                 break;
41569                               }
41570                               case 0x00000080: {
41571                                 // 0xf3b10080
41572                                 DataType dt =
41573                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41574                                                        ((instr >> 8) & 0x4));
41575                                 if (dt.Is(kDataTypeValueInvalid)) {
41576                                   UnallocatedA32(instr);
41577                                   return;
41578                                 }
41579                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41580                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41581                                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41582                                 vcge(al,
41583                                      dt,
41584                                      DRegister(rd),
41585                                      DRegister(rm),
41586                                      UINT32_C(0));
41587                                 break;
41588                               }
41589                               case 0x000000c0: {
41590                                 // 0xf3b100c0
41591                                 DataType dt =
41592                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41593                                                        ((instr >> 8) & 0x4));
41594                                 if (dt.Is(kDataTypeValueInvalid)) {
41595                                   UnallocatedA32(instr);
41596                                   return;
41597                                 }
41598                                 if (((instr >> 12) & 1) != 0) {
41599                                   UnallocatedA32(instr);
41600                                   return;
41601                                 }
41602                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41603                                 if ((instr & 1) != 0) {
41604                                   UnallocatedA32(instr);
41605                                   return;
41606                                 }
41607                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41608                                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41609                                 vcge(al,
41610                                      dt,
41611                                      QRegister(rd),
41612                                      QRegister(rm),
41613                                      UINT32_C(0));
41614                                 break;
41615                               }
41616                               case 0x00000100: {
41617                                 // 0xf3b10100
41618                                 DataType dt =
41619                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41620                                                        ((instr >> 8) & 0x4));
41621                                 if (dt.Is(kDataTypeValueInvalid)) {
41622                                   UnallocatedA32(instr);
41623                                   return;
41624                                 }
41625                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41626                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41627                                 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41628                                 vceq(al,
41629                                      dt,
41630                                      DRegister(rd),
41631                                      DRegister(rm),
41632                                      UINT32_C(0));
41633                                 break;
41634                               }
41635                               case 0x00000140: {
41636                                 // 0xf3b10140
41637                                 DataType dt =
41638                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
41639                                                        ((instr >> 8) & 0x4));
41640                                 if (dt.Is(kDataTypeValueInvalid)) {
41641                                   UnallocatedA32(instr);
41642                                   return;
41643                                 }
41644                                 if (((instr >> 12) & 1) != 0) {
41645                                   UnallocatedA32(instr);
41646                                   return;
41647                                 }
41648                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41649                                 if ((instr & 1) != 0) {
41650                                   UnallocatedA32(instr);
41651                                   return;
41652                                 }
41653                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41654                                 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41655                                 vceq(al,
41656                                      dt,
41657                                      QRegister(rd),
41658                                      QRegister(rm),
41659                                      UINT32_C(0));
41660                                 break;
41661                               }
41662                               case 0x00000180: {
41663                                 // 0xf3b10180
41664                                 DataType dt =
41665                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41666                                                        ((instr >> 8) & 0x4));
41667                                 if (dt.Is(kDataTypeValueInvalid)) {
41668                                   UnallocatedA32(instr);
41669                                   return;
41670                                 }
41671                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41672                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41673                                 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41674                                 vcle(al,
41675                                      dt,
41676                                      DRegister(rd),
41677                                      DRegister(rm),
41678                                      UINT32_C(0));
41679                                 break;
41680                               }
41681                               case 0x000001c0: {
41682                                 // 0xf3b101c0
41683                                 DataType dt =
41684                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41685                                                        ((instr >> 8) & 0x4));
41686                                 if (dt.Is(kDataTypeValueInvalid)) {
41687                                   UnallocatedA32(instr);
41688                                   return;
41689                                 }
41690                                 if (((instr >> 12) & 1) != 0) {
41691                                   UnallocatedA32(instr);
41692                                   return;
41693                                 }
41694                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41695                                 if ((instr & 1) != 0) {
41696                                   UnallocatedA32(instr);
41697                                   return;
41698                                 }
41699                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41700                                 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41701                                 vcle(al,
41702                                      dt,
41703                                      QRegister(rd),
41704                                      QRegister(rm),
41705                                      UINT32_C(0));
41706                                 break;
41707                               }
41708                             }
41709                             break;
41710                           }
41711                           case 0x00010200: {
41712                             // 0xf3b10200
41713                             switch (instr & 0x000001c0) {
41714                               case 0x00000000: {
41715                                 // 0xf3b10200
41716                                 DataType dt =
41717                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41718                                                        ((instr >> 8) & 0x4));
41719                                 if (dt.Is(kDataTypeValueInvalid)) {
41720                                   UnallocatedA32(instr);
41721                                   return;
41722                                 }
41723                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41724                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41725                                 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
41726                                 vclt(al,
41727                                      dt,
41728                                      DRegister(rd),
41729                                      DRegister(rm),
41730                                      UINT32_C(0));
41731                                 break;
41732                               }
41733                               case 0x00000040: {
41734                                 // 0xf3b10240
41735                                 DataType dt =
41736                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41737                                                        ((instr >> 8) & 0x4));
41738                                 if (dt.Is(kDataTypeValueInvalid)) {
41739                                   UnallocatedA32(instr);
41740                                   return;
41741                                 }
41742                                 if (((instr >> 12) & 1) != 0) {
41743                                   UnallocatedA32(instr);
41744                                   return;
41745                                 }
41746                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41747                                 if ((instr & 1) != 0) {
41748                                   UnallocatedA32(instr);
41749                                   return;
41750                                 }
41751                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41752                                 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
41753                                 vclt(al,
41754                                      dt,
41755                                      QRegister(rd),
41756                                      QRegister(rm),
41757                                      UINT32_C(0));
41758                                 break;
41759                               }
41760                               case 0x000000c0: {
41761                                 // 0xf3b102c0
41762                                 if ((instr & 0x000c0400) == 0x00080000) {
41763                                   UnimplementedA32("SHA1H", instr);
41764                                 } else {
41765                                   UnallocatedA32(instr);
41766                                 }
41767                                 break;
41768                               }
41769                               case 0x00000100: {
41770                                 // 0xf3b10300
41771                                 DataType dt =
41772                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41773                                                        ((instr >> 8) & 0x4));
41774                                 if (dt.Is(kDataTypeValueInvalid)) {
41775                                   UnallocatedA32(instr);
41776                                   return;
41777                                 }
41778                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41779                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41780                                 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41781                                 vabs(al, dt, DRegister(rd), DRegister(rm));
41782                                 break;
41783                               }
41784                               case 0x00000140: {
41785                                 // 0xf3b10340
41786                                 DataType dt =
41787                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41788                                                        ((instr >> 8) & 0x4));
41789                                 if (dt.Is(kDataTypeValueInvalid)) {
41790                                   UnallocatedA32(instr);
41791                                   return;
41792                                 }
41793                                 if (((instr >> 12) & 1) != 0) {
41794                                   UnallocatedA32(instr);
41795                                   return;
41796                                 }
41797                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41798                                 if ((instr & 1) != 0) {
41799                                   UnallocatedA32(instr);
41800                                   return;
41801                                 }
41802                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41803                                 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41804                                 vabs(al, dt, QRegister(rd), QRegister(rm));
41805                                 break;
41806                               }
41807                               case 0x00000180: {
41808                                 // 0xf3b10380
41809                                 DataType dt =
41810                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41811                                                        ((instr >> 8) & 0x4));
41812                                 if (dt.Is(kDataTypeValueInvalid)) {
41813                                   UnallocatedA32(instr);
41814                                   return;
41815                                 }
41816                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41817                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41818                                 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41819                                 vneg(al, dt, DRegister(rd), DRegister(rm));
41820                                 break;
41821                               }
41822                               case 0x000001c0: {
41823                                 // 0xf3b103c0
41824                                 DataType dt =
41825                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
41826                                                        ((instr >> 8) & 0x4));
41827                                 if (dt.Is(kDataTypeValueInvalid)) {
41828                                   UnallocatedA32(instr);
41829                                   return;
41830                                 }
41831                                 if (((instr >> 12) & 1) != 0) {
41832                                   UnallocatedA32(instr);
41833                                   return;
41834                                 }
41835                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41836                                 if ((instr & 1) != 0) {
41837                                   UnallocatedA32(instr);
41838                                   return;
41839                                 }
41840                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41841                                 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41842                                 vneg(al, dt, QRegister(rd), QRegister(rm));
41843                                 break;
41844                               }
41845                               default:
41846                                 UnallocatedA32(instr);
41847                                 break;
41848                             }
41849                             break;
41850                           }
41851                           case 0x00020000: {
41852                             // 0xf3b20000
41853                             switch (instr & 0x000005c0) {
41854                               case 0x00000000: {
41855                                 // 0xf3b20000
41856                                 if ((instr & 0x000c0000) == 0x00000000) {
41857                                   unsigned rd = ExtractDRegister(instr, 22, 12);
41858                                   unsigned rm = ExtractDRegister(instr, 5, 0);
41859                                   // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
41860                                   vswp(al,
41861                                        kDataTypeValueNone,
41862                                        DRegister(rd),
41863                                        DRegister(rm));
41864                                 } else {
41865                                   UnallocatedA32(instr);
41866                                 }
41867                                 break;
41868                               }
41869                               case 0x00000040: {
41870                                 // 0xf3b20040
41871                                 if ((instr & 0x000c0000) == 0x00000000) {
41872                                   if (((instr >> 12) & 1) != 0) {
41873                                     UnallocatedA32(instr);
41874                                     return;
41875                                   }
41876                                   unsigned rd = ExtractQRegister(instr, 22, 12);
41877                                   if ((instr & 1) != 0) {
41878                                     UnallocatedA32(instr);
41879                                     return;
41880                                   }
41881                                   unsigned rm = ExtractQRegister(instr, 5, 0);
41882                                   // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
41883                                   vswp(al,
41884                                        kDataTypeValueNone,
41885                                        QRegister(rd),
41886                                        QRegister(rm));
41887                                 } else {
41888                                   UnallocatedA32(instr);
41889                                 }
41890                                 break;
41891                               }
41892                               case 0x00000080: {
41893                                 // 0xf3b20080
41894                                 DataType dt =
41895                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41896                                 if (dt.Is(kDataTypeValueInvalid)) {
41897                                   UnallocatedA32(instr);
41898                                   return;
41899                                 }
41900                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41901                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41902                                 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41903                                 vtrn(al, dt, DRegister(rd), DRegister(rm));
41904                                 break;
41905                               }
41906                               case 0x000000c0: {
41907                                 // 0xf3b200c0
41908                                 DataType dt =
41909                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41910                                 if (dt.Is(kDataTypeValueInvalid)) {
41911                                   UnallocatedA32(instr);
41912                                   return;
41913                                 }
41914                                 if (((instr >> 12) & 1) != 0) {
41915                                   UnallocatedA32(instr);
41916                                   return;
41917                                 }
41918                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41919                                 if ((instr & 1) != 0) {
41920                                   UnallocatedA32(instr);
41921                                   return;
41922                                 }
41923                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41924                                 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41925                                 vtrn(al, dt, QRegister(rd), QRegister(rm));
41926                                 break;
41927                               }
41928                               case 0x00000100: {
41929                                 // 0xf3b20100
41930                                 DataType dt =
41931                                     Dt_size_15_Decode((instr >> 18) & 0x3);
41932                                 if (dt.Is(kDataTypeValueInvalid)) {
41933                                   UnallocatedA32(instr);
41934                                   return;
41935                                 }
41936                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41937                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41938                                 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41939                                 vuzp(al, dt, DRegister(rd), DRegister(rm));
41940                                 break;
41941                               }
41942                               case 0x00000140: {
41943                                 // 0xf3b20140
41944                                 DataType dt =
41945                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41946                                 if (dt.Is(kDataTypeValueInvalid)) {
41947                                   UnallocatedA32(instr);
41948                                   return;
41949                                 }
41950                                 if (((instr >> 12) & 1) != 0) {
41951                                   UnallocatedA32(instr);
41952                                   return;
41953                                 }
41954                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41955                                 if ((instr & 1) != 0) {
41956                                   UnallocatedA32(instr);
41957                                   return;
41958                                 }
41959                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41960                                 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41961                                 vuzp(al, dt, QRegister(rd), QRegister(rm));
41962                                 break;
41963                               }
41964                               case 0x00000180: {
41965                                 // 0xf3b20180
41966                                 DataType dt =
41967                                     Dt_size_15_Decode((instr >> 18) & 0x3);
41968                                 if (dt.Is(kDataTypeValueInvalid)) {
41969                                   UnallocatedA32(instr);
41970                                   return;
41971                                 }
41972                                 unsigned rd = ExtractDRegister(instr, 22, 12);
41973                                 unsigned rm = ExtractDRegister(instr, 5, 0);
41974                                 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
41975                                 vzip(al, dt, DRegister(rd), DRegister(rm));
41976                                 break;
41977                               }
41978                               case 0x000001c0: {
41979                                 // 0xf3b201c0
41980                                 DataType dt =
41981                                     Dt_size_7_Decode((instr >> 18) & 0x3);
41982                                 if (dt.Is(kDataTypeValueInvalid)) {
41983                                   UnallocatedA32(instr);
41984                                   return;
41985                                 }
41986                                 if (((instr >> 12) & 1) != 0) {
41987                                   UnallocatedA32(instr);
41988                                   return;
41989                                 }
41990                                 unsigned rd = ExtractQRegister(instr, 22, 12);
41991                                 if ((instr & 1) != 0) {
41992                                   UnallocatedA32(instr);
41993                                   return;
41994                                 }
41995                                 unsigned rm = ExtractQRegister(instr, 5, 0);
41996                                 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
41997                                 vzip(al, dt, QRegister(rd), QRegister(rm));
41998                                 break;
41999                               }
42000                               case 0x00000400: {
42001                                 // 0xf3b20400
42002                                 if ((instr & 0x000c0000) == 0x00080000) {
42003                                   unsigned rd = ExtractDRegister(instr, 22, 12);
42004                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42005                                   // VRINTN{<q>}.F32.F32 <Dd>, <Dm> ; A1
42006                                   vrintn(F32,
42007                                          F32,
42008                                          DRegister(rd),
42009                                          DRegister(rm));
42010                                 } else {
42011                                   UnallocatedA32(instr);
42012                                 }
42013                                 break;
42014                               }
42015                               case 0x00000440: {
42016                                 // 0xf3b20440
42017                                 if ((instr & 0x000c0000) == 0x00080000) {
42018                                   if (((instr >> 12) & 1) != 0) {
42019                                     UnallocatedA32(instr);
42020                                     return;
42021                                   }
42022                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42023                                   if ((instr & 1) != 0) {
42024                                     UnallocatedA32(instr);
42025                                     return;
42026                                   }
42027                                   unsigned rm = ExtractQRegister(instr, 5, 0);
42028                                   // VRINTN{<q>}.F32.F32 <Qd>, <Qm> ; A1
42029                                   vrintn(F32,
42030                                          F32,
42031                                          QRegister(rd),
42032                                          QRegister(rm));
42033                                 } else {
42034                                   UnallocatedA32(instr);
42035                                 }
42036                                 break;
42037                               }
42038                               case 0x00000480: {
42039                                 // 0xf3b20480
42040                                 if ((instr & 0x000c0000) == 0x00080000) {
42041                                   unsigned rd = ExtractDRegister(instr, 22, 12);
42042                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42043                                   // VRINTX{<q>}.F32.F32 <Dd>, <Dm> ; A1
42044                                   vrintx(al,
42045                                          F32,
42046                                          F32,
42047                                          DRegister(rd),
42048                                          DRegister(rm));
42049                                 } else {
42050                                   UnallocatedA32(instr);
42051                                 }
42052                                 break;
42053                               }
42054                               case 0x000004c0: {
42055                                 // 0xf3b204c0
42056                                 if ((instr & 0x000c0000) == 0x00080000) {
42057                                   if (((instr >> 12) & 1) != 0) {
42058                                     UnallocatedA32(instr);
42059                                     return;
42060                                   }
42061                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42062                                   if ((instr & 1) != 0) {
42063                                     UnallocatedA32(instr);
42064                                     return;
42065                                   }
42066                                   unsigned rm = ExtractQRegister(instr, 5, 0);
42067                                   // VRINTX{<q>}.F32.F32 <Qd>, <Qm> ; A1
42068                                   vrintx(F32,
42069                                          F32,
42070                                          QRegister(rd),
42071                                          QRegister(rm));
42072                                 } else {
42073                                   UnallocatedA32(instr);
42074                                 }
42075                                 break;
42076                               }
42077                               case 0x00000500: {
42078                                 // 0xf3b20500
42079                                 if ((instr & 0x000c0000) == 0x00080000) {
42080                                   unsigned rd = ExtractDRegister(instr, 22, 12);
42081                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42082                                   // VRINTA{<q>}.F32.F32 <Dd>, <Dm> ; A1
42083                                   vrinta(F32,
42084                                          F32,
42085                                          DRegister(rd),
42086                                          DRegister(rm));
42087                                 } else {
42088                                   UnallocatedA32(instr);
42089                                 }
42090                                 break;
42091                               }
42092                               case 0x00000540: {
42093                                 // 0xf3b20540
42094                                 if ((instr & 0x000c0000) == 0x00080000) {
42095                                   if (((instr >> 12) & 1) != 0) {
42096                                     UnallocatedA32(instr);
42097                                     return;
42098                                   }
42099                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42100                                   if ((instr & 1) != 0) {
42101                                     UnallocatedA32(instr);
42102                                     return;
42103                                   }
42104                                   unsigned rm = ExtractQRegister(instr, 5, 0);
42105                                   // VRINTA{<q>}.F32.F32 <Qd>, <Qm> ; A1
42106                                   vrinta(F32,
42107                                          F32,
42108                                          QRegister(rd),
42109                                          QRegister(rm));
42110                                 } else {
42111                                   UnallocatedA32(instr);
42112                                 }
42113                                 break;
42114                               }
42115                               case 0x00000580: {
42116                                 // 0xf3b20580
42117                                 if ((instr & 0x000c0000) == 0x00080000) {
42118                                   unsigned rd = ExtractDRegister(instr, 22, 12);
42119                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42120                                   // VRINTZ{<q>}.F32.F32 <Dd>, <Dm> ; A1
42121                                   vrintz(al,
42122                                          F32,
42123                                          F32,
42124                                          DRegister(rd),
42125                                          DRegister(rm));
42126                                 } else {
42127                                   UnallocatedA32(instr);
42128                                 }
42129                                 break;
42130                               }
42131                               case 0x000005c0: {
42132                                 // 0xf3b205c0
42133                                 if ((instr & 0x000c0000) == 0x00080000) {
42134                                   if (((instr >> 12) & 1) != 0) {
42135                                     UnallocatedA32(instr);
42136                                     return;
42137                                   }
42138                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42139                                   if ((instr & 1) != 0) {
42140                                     UnallocatedA32(instr);
42141                                     return;
42142                                   }
42143                                   unsigned rm = ExtractQRegister(instr, 5, 0);
42144                                   // VRINTZ{<q>}.F32.F32 <Qd>, <Qm> ; A1
42145                                   vrintz(F32,
42146                                          F32,
42147                                          QRegister(rd),
42148                                          QRegister(rm));
42149                                 } else {
42150                                   UnallocatedA32(instr);
42151                                 }
42152                                 break;
42153                               }
42154                             }
42155                             break;
42156                           }
42157                           case 0x00020200: {
42158                             // 0xf3b20200
42159                             switch (instr & 0x00000580) {
42160                               case 0x00000000: {
42161                                 // 0xf3b20200
42162                                 switch (instr & 0x00000040) {
42163                                   case 0x00000000: {
42164                                     // 0xf3b20200
42165                                     DataType dt =
42166                                         Dt_size_3_Decode((instr >> 18) & 0x3);
42167                                     if (dt.Is(kDataTypeValueInvalid)) {
42168                                       UnallocatedA32(instr);
42169                                       return;
42170                                     }
42171                                     unsigned rd =
42172                                         ExtractDRegister(instr, 22, 12);
42173                                     if ((instr & 1) != 0) {
42174                                       UnallocatedA32(instr);
42175                                       return;
42176                                     }
42177                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42178                                     // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
42179                                     vmovn(al, dt, DRegister(rd), QRegister(rm));
42180                                     break;
42181                                   }
42182                                   case 0x00000040: {
42183                                     // 0xf3b20240
42184                                     DataType dt =
42185                                         Dt_size_14_Decode((instr >> 18) & 0x3);
42186                                     if (dt.Is(kDataTypeValueInvalid)) {
42187                                       UnallocatedA32(instr);
42188                                       return;
42189                                     }
42190                                     unsigned rd =
42191                                         ExtractDRegister(instr, 22, 12);
42192                                     if ((instr & 1) != 0) {
42193                                       UnallocatedA32(instr);
42194                                       return;
42195                                     }
42196                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42197                                     // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
42198                                     vqmovun(al,
42199                                             dt,
42200                                             DRegister(rd),
42201                                             QRegister(rm));
42202                                     break;
42203                                   }
42204                                 }
42205                                 break;
42206                               }
42207                               case 0x00000080: {
42208                                 // 0xf3b20280
42209                                 DataType dt =
42210                                     Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
42211                                                         ((instr >> 4) & 0x4));
42212                                 if (dt.Is(kDataTypeValueInvalid)) {
42213                                   UnallocatedA32(instr);
42214                                   return;
42215                                 }
42216                                 unsigned rd = ExtractDRegister(instr, 22, 12);
42217                                 if ((instr & 1) != 0) {
42218                                   UnallocatedA32(instr);
42219                                   return;
42220                                 }
42221                                 unsigned rm = ExtractQRegister(instr, 5, 0);
42222                                 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
42223                                 vqmovn(al, dt, DRegister(rd), QRegister(rm));
42224                                 break;
42225                               }
42226                               case 0x00000100: {
42227                                 // 0xf3b20300
42228                                 if ((instr & 0x00000040) == 0x00000000) {
42229                                   DataType dt =
42230                                       Dt_size_16_Decode((instr >> 18) & 0x3);
42231                                   if (dt.Is(kDataTypeValueInvalid)) {
42232                                     UnallocatedA32(instr);
42233                                     return;
42234                                   }
42235                                   if (((instr >> 12) & 1) != 0) {
42236                                     UnallocatedA32(instr);
42237                                     return;
42238                                   }
42239                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42240                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42241                                   uint32_t imm = dt.GetSize();
42242                                   // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
42243                                   vshll(al,
42244                                         dt,
42245                                         QRegister(rd),
42246                                         DRegister(rm),
42247                                         imm);
42248                                 } else {
42249                                   UnallocatedA32(instr);
42250                                 }
42251                                 break;
42252                               }
42253                               case 0x00000180: {
42254                                 // 0xf3b20380
42255                                 switch (instr & 0x000c0040) {
42256                                   case 0x00080000: {
42257                                     // 0xf3ba0380
42258                                     UnimplementedA32("SHA1SU1", instr);
42259                                     break;
42260                                   }
42261                                   case 0x00080040: {
42262                                     // 0xf3ba03c0
42263                                     UnimplementedA32("SHA256SU0", instr);
42264                                     break;
42265                                   }
42266                                   default:
42267                                     UnallocatedA32(instr);
42268                                     break;
42269                                 }
42270                                 break;
42271                               }
42272                               case 0x00000400: {
42273                                 // 0xf3b20600
42274                                 if ((instr & 0x000c0040) == 0x00040000) {
42275                                   unsigned rd = ExtractDRegister(instr, 22, 12);
42276                                   if ((instr & 1) != 0) {
42277                                     UnallocatedA32(instr);
42278                                     return;
42279                                   }
42280                                   unsigned rm = ExtractQRegister(instr, 5, 0);
42281                                   // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
42282                                   vcvt(al,
42283                                        F16,
42284                                        F32,
42285                                        DRegister(rd),
42286                                        QRegister(rm));
42287                                 } else {
42288                                   UnallocatedA32(instr);
42289                                 }
42290                                 break;
42291                               }
42292                               case 0x00000480: {
42293                                 // 0xf3b20680
42294                                 switch (instr & 0x000c0040) {
42295                                   case 0x00080000: {
42296                                     // 0xf3ba0680
42297                                     unsigned rd =
42298                                         ExtractDRegister(instr, 22, 12);
42299                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42300                                     // VRINTM{<q>}.F32.F32 <Dd>, <Dm> ; A1
42301                                     vrintm(F32,
42302                                            F32,
42303                                            DRegister(rd),
42304                                            DRegister(rm));
42305                                     break;
42306                                   }
42307                                   case 0x00080040: {
42308                                     // 0xf3ba06c0
42309                                     if (((instr >> 12) & 1) != 0) {
42310                                       UnallocatedA32(instr);
42311                                       return;
42312                                     }
42313                                     unsigned rd =
42314                                         ExtractQRegister(instr, 22, 12);
42315                                     if ((instr & 1) != 0) {
42316                                       UnallocatedA32(instr);
42317                                       return;
42318                                     }
42319                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42320                                     // VRINTM{<q>}.F32.F32 <Qd>, <Qm> ; A1
42321                                     vrintm(F32,
42322                                            F32,
42323                                            QRegister(rd),
42324                                            QRegister(rm));
42325                                     break;
42326                                   }
42327                                   default:
42328                                     UnallocatedA32(instr);
42329                                     break;
42330                                 }
42331                                 break;
42332                               }
42333                               case 0x00000500: {
42334                                 // 0xf3b20700
42335                                 if ((instr & 0x000c0040) == 0x00040000) {
42336                                   if (((instr >> 12) & 1) != 0) {
42337                                     UnallocatedA32(instr);
42338                                     return;
42339                                   }
42340                                   unsigned rd = ExtractQRegister(instr, 22, 12);
42341                                   unsigned rm = ExtractDRegister(instr, 5, 0);
42342                                   // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
42343                                   vcvt(al,
42344                                        F32,
42345                                        F16,
42346                                        QRegister(rd),
42347                                        DRegister(rm));
42348                                 } else {
42349                                   UnallocatedA32(instr);
42350                                 }
42351                                 break;
42352                               }
42353                               case 0x00000580: {
42354                                 // 0xf3b20780
42355                                 switch (instr & 0x000c0040) {
42356                                   case 0x00080000: {
42357                                     // 0xf3ba0780
42358                                     unsigned rd =
42359                                         ExtractDRegister(instr, 22, 12);
42360                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42361                                     // VRINTP{<q>}.F32.F32 <Dd>, <Dm> ; A1
42362                                     vrintp(F32,
42363                                            F32,
42364                                            DRegister(rd),
42365                                            DRegister(rm));
42366                                     break;
42367                                   }
42368                                   case 0x00080040: {
42369                                     // 0xf3ba07c0
42370                                     if (((instr >> 12) & 1) != 0) {
42371                                       UnallocatedA32(instr);
42372                                       return;
42373                                     }
42374                                     unsigned rd =
42375                                         ExtractQRegister(instr, 22, 12);
42376                                     if ((instr & 1) != 0) {
42377                                       UnallocatedA32(instr);
42378                                       return;
42379                                     }
42380                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42381                                     // VRINTP{<q>}.F32.F32 <Qd>, <Qm> ; A1
42382                                     vrintp(F32,
42383                                            F32,
42384                                            QRegister(rd),
42385                                            QRegister(rm));
42386                                     break;
42387                                   }
42388                                   default:
42389                                     UnallocatedA32(instr);
42390                                     break;
42391                                 }
42392                                 break;
42393                               }
42394                             }
42395                             break;
42396                           }
42397                           case 0x00030000: {
42398                             // 0xf3b30000
42399                             switch (instr & 0x00000440) {
42400                               case 0x00000000: {
42401                                 // 0xf3b30000
42402                                 switch (instr & 0x000c0100) {
42403                                   case 0x00080000: {
42404                                     // 0xf3bb0000
42405                                     DataType dt =
42406                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42407                                     if (dt.Is(kDataTypeValueInvalid)) {
42408                                       UnallocatedA32(instr);
42409                                       return;
42410                                     }
42411                                     unsigned rd =
42412                                         ExtractDRegister(instr, 22, 12);
42413                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42414                                     // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42415                                     vcvta(dt,
42416                                           F32,
42417                                           DRegister(rd),
42418                                           DRegister(rm));
42419                                     break;
42420                                   }
42421                                   case 0x00080100: {
42422                                     // 0xf3bb0100
42423                                     DataType dt =
42424                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42425                                     if (dt.Is(kDataTypeValueInvalid)) {
42426                                       UnallocatedA32(instr);
42427                                       return;
42428                                     }
42429                                     unsigned rd =
42430                                         ExtractDRegister(instr, 22, 12);
42431                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42432                                     // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42433                                     vcvtn(dt,
42434                                           F32,
42435                                           DRegister(rd),
42436                                           DRegister(rm));
42437                                     break;
42438                                   }
42439                                   default:
42440                                     UnallocatedA32(instr);
42441                                     break;
42442                                 }
42443                                 break;
42444                               }
42445                               case 0x00000040: {
42446                                 // 0xf3b30040
42447                                 switch (instr & 0x000c0100) {
42448                                   case 0x00080000: {
42449                                     // 0xf3bb0040
42450                                     DataType dt =
42451                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42452                                     if (dt.Is(kDataTypeValueInvalid)) {
42453                                       UnallocatedA32(instr);
42454                                       return;
42455                                     }
42456                                     if (((instr >> 12) & 1) != 0) {
42457                                       UnallocatedA32(instr);
42458                                       return;
42459                                     }
42460                                     unsigned rd =
42461                                         ExtractQRegister(instr, 22, 12);
42462                                     if ((instr & 1) != 0) {
42463                                       UnallocatedA32(instr);
42464                                       return;
42465                                     }
42466                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42467                                     // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42468                                     vcvta(dt,
42469                                           F32,
42470                                           QRegister(rd),
42471                                           QRegister(rm));
42472                                     break;
42473                                   }
42474                                   case 0x00080100: {
42475                                     // 0xf3bb0140
42476                                     DataType dt =
42477                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42478                                     if (dt.Is(kDataTypeValueInvalid)) {
42479                                       UnallocatedA32(instr);
42480                                       return;
42481                                     }
42482                                     if (((instr >> 12) & 1) != 0) {
42483                                       UnallocatedA32(instr);
42484                                       return;
42485                                     }
42486                                     unsigned rd =
42487                                         ExtractQRegister(instr, 22, 12);
42488                                     if ((instr & 1) != 0) {
42489                                       UnallocatedA32(instr);
42490                                       return;
42491                                     }
42492                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42493                                     // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42494                                     vcvtn(dt,
42495                                           F32,
42496                                           QRegister(rd),
42497                                           QRegister(rm));
42498                                     break;
42499                                   }
42500                                   default:
42501                                     UnallocatedA32(instr);
42502                                     break;
42503                                 }
42504                                 break;
42505                               }
42506                               case 0x00000400: {
42507                                 // 0xf3b30400
42508                                 switch (instr & 0x00000080) {
42509                                   case 0x00000000: {
42510                                     // 0xf3b30400
42511                                     DataType dt = Dt_F_size_4_Decode(
42512                                         ((instr >> 18) & 0x3) |
42513                                         ((instr >> 6) & 0x4));
42514                                     if (dt.Is(kDataTypeValueInvalid)) {
42515                                       UnallocatedA32(instr);
42516                                       return;
42517                                     }
42518                                     unsigned rd =
42519                                         ExtractDRegister(instr, 22, 12);
42520                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42521                                     // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42522                                     vrecpe(al,
42523                                            dt,
42524                                            DRegister(rd),
42525                                            DRegister(rm));
42526                                     break;
42527                                   }
42528                                   case 0x00000080: {
42529                                     // 0xf3b30480
42530                                     DataType dt = Dt_F_size_4_Decode(
42531                                         ((instr >> 18) & 0x3) |
42532                                         ((instr >> 6) & 0x4));
42533                                     if (dt.Is(kDataTypeValueInvalid)) {
42534                                       UnallocatedA32(instr);
42535                                       return;
42536                                     }
42537                                     unsigned rd =
42538                                         ExtractDRegister(instr, 22, 12);
42539                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42540                                     // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
42541                                     vrsqrte(al,
42542                                             dt,
42543                                             DRegister(rd),
42544                                             DRegister(rm));
42545                                     break;
42546                                   }
42547                                 }
42548                                 break;
42549                               }
42550                               case 0x00000440: {
42551                                 // 0xf3b30440
42552                                 switch (instr & 0x00000080) {
42553                                   case 0x00000000: {
42554                                     // 0xf3b30440
42555                                     DataType dt = Dt_F_size_4_Decode(
42556                                         ((instr >> 18) & 0x3) |
42557                                         ((instr >> 6) & 0x4));
42558                                     if (dt.Is(kDataTypeValueInvalid)) {
42559                                       UnallocatedA32(instr);
42560                                       return;
42561                                     }
42562                                     if (((instr >> 12) & 1) != 0) {
42563                                       UnallocatedA32(instr);
42564                                       return;
42565                                     }
42566                                     unsigned rd =
42567                                         ExtractQRegister(instr, 22, 12);
42568                                     if ((instr & 1) != 0) {
42569                                       UnallocatedA32(instr);
42570                                       return;
42571                                     }
42572                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42573                                     // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42574                                     vrecpe(al,
42575                                            dt,
42576                                            QRegister(rd),
42577                                            QRegister(rm));
42578                                     break;
42579                                   }
42580                                   case 0x00000080: {
42581                                     // 0xf3b304c0
42582                                     DataType dt = Dt_F_size_4_Decode(
42583                                         ((instr >> 18) & 0x3) |
42584                                         ((instr >> 6) & 0x4));
42585                                     if (dt.Is(kDataTypeValueInvalid)) {
42586                                       UnallocatedA32(instr);
42587                                       return;
42588                                     }
42589                                     if (((instr >> 12) & 1) != 0) {
42590                                       UnallocatedA32(instr);
42591                                       return;
42592                                     }
42593                                     unsigned rd =
42594                                         ExtractQRegister(instr, 22, 12);
42595                                     if ((instr & 1) != 0) {
42596                                       UnallocatedA32(instr);
42597                                       return;
42598                                     }
42599                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42600                                     // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
42601                                     vrsqrte(al,
42602                                             dt,
42603                                             QRegister(rd),
42604                                             QRegister(rm));
42605                                     break;
42606                                   }
42607                                 }
42608                                 break;
42609                               }
42610                             }
42611                             break;
42612                           }
42613                           case 0x00030200: {
42614                             // 0xf3b30200
42615                             switch (instr & 0x000c0440) {
42616                               case 0x00080000: {
42617                                 // 0xf3bb0200
42618                                 switch (instr & 0x00000100) {
42619                                   case 0x00000000: {
42620                                     // 0xf3bb0200
42621                                     DataType dt =
42622                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42623                                     if (dt.Is(kDataTypeValueInvalid)) {
42624                                       UnallocatedA32(instr);
42625                                       return;
42626                                     }
42627                                     unsigned rd =
42628                                         ExtractDRegister(instr, 22, 12);
42629                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42630                                     // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42631                                     vcvtp(dt,
42632                                           F32,
42633                                           DRegister(rd),
42634                                           DRegister(rm));
42635                                     break;
42636                                   }
42637                                   case 0x00000100: {
42638                                     // 0xf3bb0300
42639                                     DataType dt =
42640                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42641                                     if (dt.Is(kDataTypeValueInvalid)) {
42642                                       UnallocatedA32(instr);
42643                                       return;
42644                                     }
42645                                     unsigned rd =
42646                                         ExtractDRegister(instr, 22, 12);
42647                                     unsigned rm = ExtractDRegister(instr, 5, 0);
42648                                     // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
42649                                     vcvtm(dt,
42650                                           F32,
42651                                           DRegister(rd),
42652                                           DRegister(rm));
42653                                     break;
42654                                   }
42655                                 }
42656                                 break;
42657                               }
42658                               case 0x00080040: {
42659                                 // 0xf3bb0240
42660                                 switch (instr & 0x00000100) {
42661                                   case 0x00000000: {
42662                                     // 0xf3bb0240
42663                                     DataType dt =
42664                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42665                                     if (dt.Is(kDataTypeValueInvalid)) {
42666                                       UnallocatedA32(instr);
42667                                       return;
42668                                     }
42669                                     if (((instr >> 12) & 1) != 0) {
42670                                       UnallocatedA32(instr);
42671                                       return;
42672                                     }
42673                                     unsigned rd =
42674                                         ExtractQRegister(instr, 22, 12);
42675                                     if ((instr & 1) != 0) {
42676                                       UnallocatedA32(instr);
42677                                       return;
42678                                     }
42679                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42680                                     // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42681                                     vcvtp(dt,
42682                                           F32,
42683                                           QRegister(rd),
42684                                           QRegister(rm));
42685                                     break;
42686                                   }
42687                                   case 0x00000100: {
42688                                     // 0xf3bb0340
42689                                     DataType dt =
42690                                         Dt_op_3_Decode((instr >> 7) & 0x1);
42691                                     if (dt.Is(kDataTypeValueInvalid)) {
42692                                       UnallocatedA32(instr);
42693                                       return;
42694                                     }
42695                                     if (((instr >> 12) & 1) != 0) {
42696                                       UnallocatedA32(instr);
42697                                       return;
42698                                     }
42699                                     unsigned rd =
42700                                         ExtractQRegister(instr, 22, 12);
42701                                     if ((instr & 1) != 0) {
42702                                       UnallocatedA32(instr);
42703                                       return;
42704                                     }
42705                                     unsigned rm = ExtractQRegister(instr, 5, 0);
42706                                     // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
42707                                     vcvtm(dt,
42708                                           F32,
42709                                           QRegister(rd),
42710                                           QRegister(rm));
42711                                     break;
42712                                   }
42713                                 }
42714                                 break;
42715                               }
42716                               case 0x00080400: {
42717                                 // 0xf3bb0600
42718                                 DataType dt1 =
42719                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
42720                                 if (dt1.Is(kDataTypeValueInvalid)) {
42721                                   UnallocatedA32(instr);
42722                                   return;
42723                                 }
42724                                 DataType dt2 =
42725                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
42726                                 if (dt2.Is(kDataTypeValueInvalid)) {
42727                                   UnallocatedA32(instr);
42728                                   return;
42729                                 }
42730                                 unsigned rd = ExtractDRegister(instr, 22, 12);
42731                                 unsigned rm = ExtractDRegister(instr, 5, 0);
42732                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
42733                                 vcvt(al,
42734                                      dt1,
42735                                      dt2,
42736                                      DRegister(rd),
42737                                      DRegister(rm));
42738                                 break;
42739                               }
42740                               case 0x00080440: {
42741                                 // 0xf3bb0640
42742                                 DataType dt1 =
42743                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
42744                                 if (dt1.Is(kDataTypeValueInvalid)) {
42745                                   UnallocatedA32(instr);
42746                                   return;
42747                                 }
42748                                 DataType dt2 =
42749                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
42750                                 if (dt2.Is(kDataTypeValueInvalid)) {
42751                                   UnallocatedA32(instr);
42752                                   return;
42753                                 }
42754                                 if (((instr >> 12) & 1) != 0) {
42755                                   UnallocatedA32(instr);
42756                                   return;
42757                                 }
42758                                 unsigned rd = ExtractQRegister(instr, 22, 12);
42759                                 if ((instr & 1) != 0) {
42760                                   UnallocatedA32(instr);
42761                                   return;
42762                                 }
42763                                 unsigned rm = ExtractQRegister(instr, 5, 0);
42764                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
42765                                 vcvt(al,
42766                                      dt1,
42767                                      dt2,
42768                                      QRegister(rd),
42769                                      QRegister(rm));
42770                                 break;
42771                               }
42772                               default:
42773                                 UnallocatedA32(instr);
42774                                 break;
42775                             }
42776                             break;
42777                           }
42778                         }
42779                         break;
42780                       }
42781                       case 0x00000800: {
42782                         // 0xf3b00800
42783                         switch (instr & 0x00000440) {
42784                           case 0x00000000: {
42785                             // 0xf3b00800
42786                             unsigned rd = ExtractDRegister(instr, 22, 12);
42787                             unsigned first = ExtractDRegister(instr, 7, 16);
42788                             unsigned length;
42789                             SpacingType spacing = kSingle;
42790                             switch ((instr >> 8) & 0x3) {
42791                               default:
42792                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
42793                               case 0x0:
42794                                 length = 1;
42795                                 break;
42796                               case 0x1:
42797                                 length = 2;
42798                                 break;
42799                               case 0x2:
42800                                 length = 3;
42801                                 break;
42802                               case 0x3:
42803                                 length = 4;
42804                                 break;
42805                             }
42806                             unsigned last = first + length - 1;
42807                             TransferType transfer = kMultipleLanes;
42808                             unsigned rm = ExtractDRegister(instr, 5, 0);
42809                             // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42810                             vtbl(al,
42811                                  Untyped8,
42812                                  DRegister(rd),
42813                                  NeonRegisterList(DRegister(first),
42814                                                   DRegister(last),
42815                                                   spacing,
42816                                                   transfer),
42817                                  DRegister(rm));
42818                             break;
42819                           }
42820                           case 0x00000040: {
42821                             // 0xf3b00840
42822                             unsigned rd = ExtractDRegister(instr, 22, 12);
42823                             unsigned first = ExtractDRegister(instr, 7, 16);
42824                             unsigned length;
42825                             SpacingType spacing = kSingle;
42826                             switch ((instr >> 8) & 0x3) {
42827                               default:
42828                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
42829                               case 0x0:
42830                                 length = 1;
42831                                 break;
42832                               case 0x1:
42833                                 length = 2;
42834                                 break;
42835                               case 0x2:
42836                                 length = 3;
42837                                 break;
42838                               case 0x3:
42839                                 length = 4;
42840                                 break;
42841                             }
42842                             unsigned last = first + length - 1;
42843                             TransferType transfer = kMultipleLanes;
42844                             unsigned rm = ExtractDRegister(instr, 5, 0);
42845                             // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
42846                             vtbx(al,
42847                                  Untyped8,
42848                                  DRegister(rd),
42849                                  NeonRegisterList(DRegister(first),
42850                                                   DRegister(last),
42851                                                   spacing,
42852                                                   transfer),
42853                                  DRegister(rm));
42854                             break;
42855                           }
42856                           case 0x00000400: {
42857                             // 0xf3b00c00
42858                             if ((instr & 0x00000380) == 0x00000000) {
42859                               unsigned lane;
42860                               DataType dt =
42861                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
42862                               if (dt.Is(kDataTypeValueInvalid)) {
42863                                 UnallocatedA32(instr);
42864                                 return;
42865                               }
42866                               unsigned rd = ExtractDRegister(instr, 22, 12);
42867                               unsigned rm = ExtractDRegister(instr, 5, 0);
42868                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
42869                               vdup(al,
42870                                    dt,
42871                                    DRegister(rd),
42872                                    DRegisterLane(rm, lane));
42873                             } else {
42874                               UnallocatedA32(instr);
42875                             }
42876                             break;
42877                           }
42878                           case 0x00000440: {
42879                             // 0xf3b00c40
42880                             if ((instr & 0x00000380) == 0x00000000) {
42881                               unsigned lane;
42882                               DataType dt =
42883                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
42884                               if (dt.Is(kDataTypeValueInvalid)) {
42885                                 UnallocatedA32(instr);
42886                                 return;
42887                               }
42888                               if (((instr >> 12) & 1) != 0) {
42889                                 UnallocatedA32(instr);
42890                                 return;
42891                               }
42892                               unsigned rd = ExtractQRegister(instr, 22, 12);
42893                               unsigned rm = ExtractDRegister(instr, 5, 0);
42894                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
42895                               vdup(al,
42896                                    dt,
42897                                    QRegister(rd),
42898                                    DRegisterLane(rm, lane));
42899                             } else {
42900                               UnallocatedA32(instr);
42901                             }
42902                             break;
42903                           }
42904                         }
42905                         break;
42906                       }
42907                     }
42908                     break;
42909                   }
42910                 }
42911                 break;
42912               }
42913               default: {
42914                 switch (instr & 0x00000c40) {
42915                   case 0x00000000: {
42916                     // 0xf2800000
42917                     switch (instr & 0x00000300) {
42918                       case 0x00000000: {
42919                         // 0xf2800000
42920                         if (((instr & 0x300000) == 0x300000)) {
42921                           UnallocatedA32(instr);
42922                           return;
42923                         }
42924                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42925                                                          ((instr >> 22) & 0x4));
42926                         if (dt.Is(kDataTypeValueInvalid)) {
42927                           UnallocatedA32(instr);
42928                           return;
42929                         }
42930                         if (((instr >> 12) & 1) != 0) {
42931                           UnallocatedA32(instr);
42932                           return;
42933                         }
42934                         unsigned rd = ExtractQRegister(instr, 22, 12);
42935                         unsigned rn = ExtractDRegister(instr, 7, 16);
42936                         unsigned rm = ExtractDRegister(instr, 5, 0);
42937                         // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42938                         vaddl(al,
42939                               dt,
42940                               QRegister(rd),
42941                               DRegister(rn),
42942                               DRegister(rm));
42943                         break;
42944                       }
42945                       case 0x00000100: {
42946                         // 0xf2800100
42947                         if (((instr & 0x300000) == 0x300000)) {
42948                           UnallocatedA32(instr);
42949                           return;
42950                         }
42951                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42952                                                          ((instr >> 22) & 0x4));
42953                         if (dt.Is(kDataTypeValueInvalid)) {
42954                           UnallocatedA32(instr);
42955                           return;
42956                         }
42957                         if (((instr >> 12) & 1) != 0) {
42958                           UnallocatedA32(instr);
42959                           return;
42960                         }
42961                         unsigned rd = ExtractQRegister(instr, 22, 12);
42962                         if (((instr >> 16) & 1) != 0) {
42963                           UnallocatedA32(instr);
42964                           return;
42965                         }
42966                         unsigned rn = ExtractQRegister(instr, 7, 16);
42967                         unsigned rm = ExtractDRegister(instr, 5, 0);
42968                         // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
42969                         vaddw(al,
42970                               dt,
42971                               QRegister(rd),
42972                               QRegister(rn),
42973                               DRegister(rm));
42974                         break;
42975                       }
42976                       case 0x00000200: {
42977                         // 0xf2800200
42978                         if (((instr & 0x300000) == 0x300000)) {
42979                           UnallocatedA32(instr);
42980                           return;
42981                         }
42982                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
42983                                                          ((instr >> 22) & 0x4));
42984                         if (dt.Is(kDataTypeValueInvalid)) {
42985                           UnallocatedA32(instr);
42986                           return;
42987                         }
42988                         if (((instr >> 12) & 1) != 0) {
42989                           UnallocatedA32(instr);
42990                           return;
42991                         }
42992                         unsigned rd = ExtractQRegister(instr, 22, 12);
42993                         unsigned rn = ExtractDRegister(instr, 7, 16);
42994                         unsigned rm = ExtractDRegister(instr, 5, 0);
42995                         // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
42996                         vsubl(al,
42997                               dt,
42998                               QRegister(rd),
42999                               DRegister(rn),
43000                               DRegister(rm));
43001                         break;
43002                       }
43003                       case 0x00000300: {
43004                         // 0xf2800300
43005                         if (((instr & 0x300000) == 0x300000)) {
43006                           UnallocatedA32(instr);
43007                           return;
43008                         }
43009                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43010                                                          ((instr >> 22) & 0x4));
43011                         if (dt.Is(kDataTypeValueInvalid)) {
43012                           UnallocatedA32(instr);
43013                           return;
43014                         }
43015                         if (((instr >> 12) & 1) != 0) {
43016                           UnallocatedA32(instr);
43017                           return;
43018                         }
43019                         unsigned rd = ExtractQRegister(instr, 22, 12);
43020                         if (((instr >> 16) & 1) != 0) {
43021                           UnallocatedA32(instr);
43022                           return;
43023                         }
43024                         unsigned rn = ExtractQRegister(instr, 7, 16);
43025                         unsigned rm = ExtractDRegister(instr, 5, 0);
43026                         // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
43027                         vsubw(al,
43028                               dt,
43029                               QRegister(rd),
43030                               QRegister(rn),
43031                               DRegister(rm));
43032                         break;
43033                       }
43034                     }
43035                     break;
43036                   }
43037                   case 0x00000040: {
43038                     // 0xf2800040
43039                     switch (instr & 0x00000200) {
43040                       case 0x00000000: {
43041                         // 0xf2800040
43042                         switch (instr & 0x01000000) {
43043                           case 0x00000000: {
43044                             // 0xf2800040
43045                             if (((instr & 0x300000) == 0x300000)) {
43046                               UnallocatedA32(instr);
43047                               return;
43048                             }
43049                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43050                                                            (instr >> 8) & 0x1);
43051                             if (dt.Is(kDataTypeValueInvalid)) {
43052                               UnallocatedA32(instr);
43053                               return;
43054                             }
43055                             unsigned rd = ExtractDRegister(instr, 22, 12);
43056                             unsigned rn = ExtractDRegister(instr, 7, 16);
43057                             int lane;
43058                             unsigned rm =
43059                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43060                             // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43061                             vmla(al,
43062                                  dt,
43063                                  DRegister(rd),
43064                                  DRegister(rn),
43065                                  DRegisterLane(rm, lane));
43066                             break;
43067                           }
43068                           case 0x01000000: {
43069                             // 0xf3800040
43070                             if (((instr & 0x300000) == 0x300000)) {
43071                               UnallocatedA32(instr);
43072                               return;
43073                             }
43074                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43075                                                            (instr >> 8) & 0x1);
43076                             if (dt.Is(kDataTypeValueInvalid)) {
43077                               UnallocatedA32(instr);
43078                               return;
43079                             }
43080                             if (((instr >> 12) & 1) != 0) {
43081                               UnallocatedA32(instr);
43082                               return;
43083                             }
43084                             unsigned rd = ExtractQRegister(instr, 22, 12);
43085                             if (((instr >> 16) & 1) != 0) {
43086                               UnallocatedA32(instr);
43087                               return;
43088                             }
43089                             unsigned rn = ExtractQRegister(instr, 7, 16);
43090                             int lane;
43091                             unsigned rm =
43092                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43093                             // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43094                             vmla(al,
43095                                  dt,
43096                                  QRegister(rd),
43097                                  QRegister(rn),
43098                                  DRegisterLane(rm, lane));
43099                             break;
43100                           }
43101                         }
43102                         break;
43103                       }
43104                       case 0x00000200: {
43105                         // 0xf2800240
43106                         switch (instr & 0x00000100) {
43107                           case 0x00000000: {
43108                             // 0xf2800240
43109                             if (((instr & 0x300000) == 0x300000)) {
43110                               UnallocatedA32(instr);
43111                               return;
43112                             }
43113                             DataType dt =
43114                                 Dt_size_11_Decode((instr >> 20) & 0x3,
43115                                                   (instr >> 24) & 0x1);
43116                             if (dt.Is(kDataTypeValueInvalid)) {
43117                               UnallocatedA32(instr);
43118                               return;
43119                             }
43120                             if (((instr >> 12) & 1) != 0) {
43121                               UnallocatedA32(instr);
43122                               return;
43123                             }
43124                             unsigned rd = ExtractQRegister(instr, 22, 12);
43125                             unsigned rn = ExtractDRegister(instr, 7, 16);
43126                             int lane;
43127                             unsigned rm =
43128                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43129                             // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43130                             vmlal(al,
43131                                   dt,
43132                                   QRegister(rd),
43133                                   DRegister(rn),
43134                                   DRegisterLane(rm, lane));
43135                             break;
43136                           }
43137                           case 0x00000100: {
43138                             // 0xf2800340
43139                             if ((instr & 0x01000000) == 0x00000000) {
43140                               if (((instr & 0x300000) == 0x300000)) {
43141                                 UnallocatedA32(instr);
43142                                 return;
43143                               }
43144                               DataType dt =
43145                                   Dt_size_13_Decode((instr >> 20) & 0x3);
43146                               if (dt.Is(kDataTypeValueInvalid)) {
43147                                 UnallocatedA32(instr);
43148                                 return;
43149                               }
43150                               if (((instr >> 12) & 1) != 0) {
43151                                 UnallocatedA32(instr);
43152                                 return;
43153                               }
43154                               unsigned rd = ExtractQRegister(instr, 22, 12);
43155                               unsigned rn = ExtractDRegister(instr, 7, 16);
43156                               uint32_t mvm =
43157                                   (instr & 0xf) | ((instr >> 1) & 0x10);
43158                               uint32_t shift = 4;
43159                               if (dt.Is(S16)) {
43160                                 shift = 3;
43161                               }
43162                               uint32_t vm = mvm & ((1 << shift) - 1);
43163                               uint32_t index = mvm >> shift;
43164                               // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
43165                               vqdmlal(al,
43166                                       dt,
43167                                       QRegister(rd),
43168                                       DRegister(rn),
43169                                       DRegister(vm),
43170                                       index);
43171                             } else {
43172                               UnallocatedA32(instr);
43173                             }
43174                             break;
43175                           }
43176                         }
43177                         break;
43178                       }
43179                     }
43180                     break;
43181                   }
43182                   case 0x00000400: {
43183                     // 0xf2800400
43184                     switch (instr & 0x00000300) {
43185                       case 0x00000000: {
43186                         // 0xf2800400
43187                         switch (instr & 0x01000000) {
43188                           case 0x00000000: {
43189                             // 0xf2800400
43190                             if (((instr & 0x300000) == 0x300000)) {
43191                               UnallocatedA32(instr);
43192                               return;
43193                             }
43194                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43195                             if (dt.Is(kDataTypeValueInvalid)) {
43196                               UnallocatedA32(instr);
43197                               return;
43198                             }
43199                             unsigned rd = ExtractDRegister(instr, 22, 12);
43200                             if (((instr >> 16) & 1) != 0) {
43201                               UnallocatedA32(instr);
43202                               return;
43203                             }
43204                             unsigned rn = ExtractQRegister(instr, 7, 16);
43205                             if ((instr & 1) != 0) {
43206                               UnallocatedA32(instr);
43207                               return;
43208                             }
43209                             unsigned rm = ExtractQRegister(instr, 5, 0);
43210                             // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43211                             vaddhn(al,
43212                                    dt,
43213                                    DRegister(rd),
43214                                    QRegister(rn),
43215                                    QRegister(rm));
43216                             break;
43217                           }
43218                           case 0x01000000: {
43219                             // 0xf3800400
43220                             if (((instr & 0x300000) == 0x300000)) {
43221                               UnallocatedA32(instr);
43222                               return;
43223                             }
43224                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43225                             if (dt.Is(kDataTypeValueInvalid)) {
43226                               UnallocatedA32(instr);
43227                               return;
43228                             }
43229                             unsigned rd = ExtractDRegister(instr, 22, 12);
43230                             if (((instr >> 16) & 1) != 0) {
43231                               UnallocatedA32(instr);
43232                               return;
43233                             }
43234                             unsigned rn = ExtractQRegister(instr, 7, 16);
43235                             if ((instr & 1) != 0) {
43236                               UnallocatedA32(instr);
43237                               return;
43238                             }
43239                             unsigned rm = ExtractQRegister(instr, 5, 0);
43240                             // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43241                             vraddhn(al,
43242                                     dt,
43243                                     DRegister(rd),
43244                                     QRegister(rn),
43245                                     QRegister(rm));
43246                             break;
43247                           }
43248                         }
43249                         break;
43250                       }
43251                       case 0x00000100: {
43252                         // 0xf2800500
43253                         if (((instr & 0x300000) == 0x300000)) {
43254                           UnallocatedA32(instr);
43255                           return;
43256                         }
43257                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43258                                                          ((instr >> 22) & 0x4));
43259                         if (dt.Is(kDataTypeValueInvalid)) {
43260                           UnallocatedA32(instr);
43261                           return;
43262                         }
43263                         if (((instr >> 12) & 1) != 0) {
43264                           UnallocatedA32(instr);
43265                           return;
43266                         }
43267                         unsigned rd = ExtractQRegister(instr, 22, 12);
43268                         unsigned rn = ExtractDRegister(instr, 7, 16);
43269                         unsigned rm = ExtractDRegister(instr, 5, 0);
43270                         // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43271                         vabal(al,
43272                               dt,
43273                               QRegister(rd),
43274                               DRegister(rn),
43275                               DRegister(rm));
43276                         break;
43277                       }
43278                       case 0x00000200: {
43279                         // 0xf2800600
43280                         switch (instr & 0x01000000) {
43281                           case 0x00000000: {
43282                             // 0xf2800600
43283                             if (((instr & 0x300000) == 0x300000)) {
43284                               UnallocatedA32(instr);
43285                               return;
43286                             }
43287                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43288                             if (dt.Is(kDataTypeValueInvalid)) {
43289                               UnallocatedA32(instr);
43290                               return;
43291                             }
43292                             unsigned rd = ExtractDRegister(instr, 22, 12);
43293                             if (((instr >> 16) & 1) != 0) {
43294                               UnallocatedA32(instr);
43295                               return;
43296                             }
43297                             unsigned rn = ExtractQRegister(instr, 7, 16);
43298                             if ((instr & 1) != 0) {
43299                               UnallocatedA32(instr);
43300                               return;
43301                             }
43302                             unsigned rm = ExtractQRegister(instr, 5, 0);
43303                             // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43304                             vsubhn(al,
43305                                    dt,
43306                                    DRegister(rd),
43307                                    QRegister(rn),
43308                                    QRegister(rm));
43309                             break;
43310                           }
43311                           case 0x01000000: {
43312                             // 0xf3800600
43313                             if (((instr & 0x300000) == 0x300000)) {
43314                               UnallocatedA32(instr);
43315                               return;
43316                             }
43317                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
43318                             if (dt.Is(kDataTypeValueInvalid)) {
43319                               UnallocatedA32(instr);
43320                               return;
43321                             }
43322                             unsigned rd = ExtractDRegister(instr, 22, 12);
43323                             if (((instr >> 16) & 1) != 0) {
43324                               UnallocatedA32(instr);
43325                               return;
43326                             }
43327                             unsigned rn = ExtractQRegister(instr, 7, 16);
43328                             if ((instr & 1) != 0) {
43329                               UnallocatedA32(instr);
43330                               return;
43331                             }
43332                             unsigned rm = ExtractQRegister(instr, 5, 0);
43333                             // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
43334                             vrsubhn(al,
43335                                     dt,
43336                                     DRegister(rd),
43337                                     QRegister(rn),
43338                                     QRegister(rm));
43339                             break;
43340                           }
43341                         }
43342                         break;
43343                       }
43344                       case 0x00000300: {
43345                         // 0xf2800700
43346                         if (((instr & 0x300000) == 0x300000)) {
43347                           UnallocatedA32(instr);
43348                           return;
43349                         }
43350                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
43351                                                          ((instr >> 22) & 0x4));
43352                         if (dt.Is(kDataTypeValueInvalid)) {
43353                           UnallocatedA32(instr);
43354                           return;
43355                         }
43356                         if (((instr >> 12) & 1) != 0) {
43357                           UnallocatedA32(instr);
43358                           return;
43359                         }
43360                         unsigned rd = ExtractQRegister(instr, 22, 12);
43361                         unsigned rn = ExtractDRegister(instr, 7, 16);
43362                         unsigned rm = ExtractDRegister(instr, 5, 0);
43363                         // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43364                         vabdl(al,
43365                               dt,
43366                               QRegister(rd),
43367                               DRegister(rn),
43368                               DRegister(rm));
43369                         break;
43370                       }
43371                     }
43372                     break;
43373                   }
43374                   case 0x00000440: {
43375                     // 0xf2800440
43376                     switch (instr & 0x00000200) {
43377                       case 0x00000000: {
43378                         // 0xf2800440
43379                         switch (instr & 0x01000000) {
43380                           case 0x00000000: {
43381                             // 0xf2800440
43382                             if (((instr & 0x300000) == 0x300000)) {
43383                               UnallocatedA32(instr);
43384                               return;
43385                             }
43386                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43387                                                            (instr >> 8) & 0x1);
43388                             if (dt.Is(kDataTypeValueInvalid)) {
43389                               UnallocatedA32(instr);
43390                               return;
43391                             }
43392                             unsigned rd = ExtractDRegister(instr, 22, 12);
43393                             unsigned rn = ExtractDRegister(instr, 7, 16);
43394                             int lane;
43395                             unsigned rm =
43396                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43397                             // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43398                             vmls(al,
43399                                  dt,
43400                                  DRegister(rd),
43401                                  DRegister(rn),
43402                                  DRegisterLane(rm, lane));
43403                             break;
43404                           }
43405                           case 0x01000000: {
43406                             // 0xf3800440
43407                             if (((instr & 0x300000) == 0x300000)) {
43408                               UnallocatedA32(instr);
43409                               return;
43410                             }
43411                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
43412                                                            (instr >> 8) & 0x1);
43413                             if (dt.Is(kDataTypeValueInvalid)) {
43414                               UnallocatedA32(instr);
43415                               return;
43416                             }
43417                             if (((instr >> 12) & 1) != 0) {
43418                               UnallocatedA32(instr);
43419                               return;
43420                             }
43421                             unsigned rd = ExtractQRegister(instr, 22, 12);
43422                             if (((instr >> 16) & 1) != 0) {
43423                               UnallocatedA32(instr);
43424                               return;
43425                             }
43426                             unsigned rn = ExtractQRegister(instr, 7, 16);
43427                             int lane;
43428                             unsigned rm =
43429                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43430                             // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43431                             vmls(al,
43432                                  dt,
43433                                  QRegister(rd),
43434                                  QRegister(rn),
43435                                  DRegisterLane(rm, lane));
43436                             break;
43437                           }
43438                         }
43439                         break;
43440                       }
43441                       case 0x00000200: {
43442                         // 0xf2800640
43443                         switch (instr & 0x00000100) {
43444                           case 0x00000000: {
43445                             // 0xf2800640
43446                             if (((instr & 0x300000) == 0x300000)) {
43447                               UnallocatedA32(instr);
43448                               return;
43449                             }
43450                             DataType dt =
43451                                 Dt_size_11_Decode((instr >> 20) & 0x3,
43452                                                   (instr >> 24) & 0x1);
43453                             if (dt.Is(kDataTypeValueInvalid)) {
43454                               UnallocatedA32(instr);
43455                               return;
43456                             }
43457                             if (((instr >> 12) & 1) != 0) {
43458                               UnallocatedA32(instr);
43459                               return;
43460                             }
43461                             unsigned rd = ExtractQRegister(instr, 22, 12);
43462                             unsigned rn = ExtractDRegister(instr, 7, 16);
43463                             int lane;
43464                             unsigned rm =
43465                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43466                             // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
43467                             vmlsl(al,
43468                                   dt,
43469                                   QRegister(rd),
43470                                   DRegister(rn),
43471                                   DRegisterLane(rm, lane));
43472                             break;
43473                           }
43474                           case 0x00000100: {
43475                             // 0xf2800740
43476                             if ((instr & 0x01000000) == 0x00000000) {
43477                               if (((instr & 0x300000) == 0x300000)) {
43478                                 UnallocatedA32(instr);
43479                                 return;
43480                               }
43481                               DataType dt =
43482                                   Dt_size_13_Decode((instr >> 20) & 0x3);
43483                               if (dt.Is(kDataTypeValueInvalid)) {
43484                                 UnallocatedA32(instr);
43485                                 return;
43486                               }
43487                               if (((instr >> 12) & 1) != 0) {
43488                                 UnallocatedA32(instr);
43489                                 return;
43490                               }
43491                               unsigned rd = ExtractQRegister(instr, 22, 12);
43492                               unsigned rn = ExtractDRegister(instr, 7, 16);
43493                               uint32_t mvm =
43494                                   (instr & 0xf) | ((instr >> 1) & 0x10);
43495                               uint32_t shift = 4;
43496                               if (dt.Is(S16)) {
43497                                 shift = 3;
43498                               }
43499                               uint32_t vm = mvm & ((1 << shift) - 1);
43500                               uint32_t index = mvm >> shift;
43501                               // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
43502                               vqdmlsl(al,
43503                                       dt,
43504                                       QRegister(rd),
43505                                       DRegister(rn),
43506                                       DRegister(vm),
43507                                       index);
43508                             } else {
43509                               UnallocatedA32(instr);
43510                             }
43511                             break;
43512                           }
43513                         }
43514                         break;
43515                       }
43516                     }
43517                     break;
43518                   }
43519                   case 0x00000800: {
43520                     // 0xf2800800
43521                     switch (instr & 0x00000300) {
43522                       case 0x00000000: {
43523                         // 0xf2800800
43524                         if (((instr & 0x300000) == 0x300000)) {
43525                           UnallocatedA32(instr);
43526                           return;
43527                         }
43528                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43529                                                         (instr >> 24) & 0x1);
43530                         if (dt.Is(kDataTypeValueInvalid)) {
43531                           UnallocatedA32(instr);
43532                           return;
43533                         }
43534                         if (((instr >> 12) & 1) != 0) {
43535                           UnallocatedA32(instr);
43536                           return;
43537                         }
43538                         unsigned rd = ExtractQRegister(instr, 22, 12);
43539                         unsigned rn = ExtractDRegister(instr, 7, 16);
43540                         unsigned rm = ExtractDRegister(instr, 5, 0);
43541                         // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43542                         vmlal(al,
43543                               dt,
43544                               QRegister(rd),
43545                               DRegister(rn),
43546                               DRegister(rm));
43547                         break;
43548                       }
43549                       case 0x00000100: {
43550                         // 0xf2800900
43551                         if ((instr & 0x01000000) == 0x00000000) {
43552                           if (((instr & 0x300000) == 0x300000)) {
43553                             UnallocatedA32(instr);
43554                             return;
43555                           }
43556                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43557                           if (dt.Is(kDataTypeValueInvalid)) {
43558                             UnallocatedA32(instr);
43559                             return;
43560                           }
43561                           if (((instr >> 12) & 1) != 0) {
43562                             UnallocatedA32(instr);
43563                             return;
43564                           }
43565                           unsigned rd = ExtractQRegister(instr, 22, 12);
43566                           unsigned rn = ExtractDRegister(instr, 7, 16);
43567                           unsigned rm = ExtractDRegister(instr, 5, 0);
43568                           // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43569                           vqdmlal(al,
43570                                   dt,
43571                                   QRegister(rd),
43572                                   DRegister(rn),
43573                                   DRegister(rm));
43574                         } else {
43575                           UnallocatedA32(instr);
43576                         }
43577                         break;
43578                       }
43579                       case 0x00000200: {
43580                         // 0xf2800a00
43581                         if (((instr & 0x300000) == 0x300000)) {
43582                           UnallocatedA32(instr);
43583                           return;
43584                         }
43585                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
43586                                                         (instr >> 24) & 0x1);
43587                         if (dt.Is(kDataTypeValueInvalid)) {
43588                           UnallocatedA32(instr);
43589                           return;
43590                         }
43591                         if (((instr >> 12) & 1) != 0) {
43592                           UnallocatedA32(instr);
43593                           return;
43594                         }
43595                         unsigned rd = ExtractQRegister(instr, 22, 12);
43596                         unsigned rn = ExtractDRegister(instr, 7, 16);
43597                         unsigned rm = ExtractDRegister(instr, 5, 0);
43598                         // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
43599                         vmlsl(al,
43600                               dt,
43601                               QRegister(rd),
43602                               DRegister(rn),
43603                               DRegister(rm));
43604                         break;
43605                       }
43606                       case 0x00000300: {
43607                         // 0xf2800b00
43608                         if ((instr & 0x01000000) == 0x00000000) {
43609                           if (((instr & 0x300000) == 0x300000)) {
43610                             UnallocatedA32(instr);
43611                             return;
43612                           }
43613                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43614                           if (dt.Is(kDataTypeValueInvalid)) {
43615                             UnallocatedA32(instr);
43616                             return;
43617                           }
43618                           if (((instr >> 12) & 1) != 0) {
43619                             UnallocatedA32(instr);
43620                             return;
43621                           }
43622                           unsigned rd = ExtractQRegister(instr, 22, 12);
43623                           unsigned rn = ExtractDRegister(instr, 7, 16);
43624                           unsigned rm = ExtractDRegister(instr, 5, 0);
43625                           // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43626                           vqdmlsl(al,
43627                                   dt,
43628                                   QRegister(rd),
43629                                   DRegister(rn),
43630                                   DRegister(rm));
43631                         } else {
43632                           UnallocatedA32(instr);
43633                         }
43634                         break;
43635                       }
43636                     }
43637                     break;
43638                   }
43639                   case 0x00000840: {
43640                     // 0xf2800840
43641                     switch (instr & 0x00000200) {
43642                       case 0x00000000: {
43643                         // 0xf2800840
43644                         switch (instr & 0x01000000) {
43645                           case 0x00000000: {
43646                             // 0xf2800840
43647                             if (((instr & 0x300000) == 0x300000)) {
43648                               UnallocatedA32(instr);
43649                               return;
43650                             }
43651                             DataType dt = Dt_F_size_3_Decode(
43652                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43653                             if (dt.Is(kDataTypeValueInvalid)) {
43654                               UnallocatedA32(instr);
43655                               return;
43656                             }
43657                             unsigned rd = ExtractDRegister(instr, 22, 12);
43658                             unsigned rn = ExtractDRegister(instr, 7, 16);
43659                             uint32_t mvm =
43660                                 (instr & 0xf) | ((instr >> 1) & 0x10);
43661                             uint32_t shift = 4;
43662                             if (dt.Is(I16)) {
43663                               shift = 3;
43664                             }
43665                             uint32_t vm = mvm & ((1 << shift) - 1);
43666                             uint32_t index = mvm >> shift;
43667                             // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43668                             vmul(al,
43669                                  dt,
43670                                  DRegister(rd),
43671                                  DRegister(rn),
43672                                  DRegister(vm),
43673                                  index);
43674                             break;
43675                           }
43676                           case 0x01000000: {
43677                             // 0xf3800840
43678                             if (((instr & 0x300000) == 0x300000)) {
43679                               UnallocatedA32(instr);
43680                               return;
43681                             }
43682                             DataType dt = Dt_F_size_3_Decode(
43683                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
43684                             if (dt.Is(kDataTypeValueInvalid)) {
43685                               UnallocatedA32(instr);
43686                               return;
43687                             }
43688                             if (((instr >> 12) & 1) != 0) {
43689                               UnallocatedA32(instr);
43690                               return;
43691                             }
43692                             unsigned rd = ExtractQRegister(instr, 22, 12);
43693                             if (((instr >> 16) & 1) != 0) {
43694                               UnallocatedA32(instr);
43695                               return;
43696                             }
43697                             unsigned rn = ExtractQRegister(instr, 7, 16);
43698                             uint32_t mvm =
43699                                 (instr & 0xf) | ((instr >> 1) & 0x10);
43700                             uint32_t shift = 4;
43701                             if (dt.Is(I16)) {
43702                               shift = 3;
43703                             }
43704                             uint32_t vm = mvm & ((1 << shift) - 1);
43705                             uint32_t index = mvm >> shift;
43706                             // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43707                             vmul(al,
43708                                  dt,
43709                                  QRegister(rd),
43710                                  QRegister(rn),
43711                                  DRegister(vm),
43712                                  index);
43713                             break;
43714                           }
43715                         }
43716                         break;
43717                       }
43718                       case 0x00000200: {
43719                         // 0xf2800a40
43720                         switch (instr & 0x00000100) {
43721                           case 0x00000000: {
43722                             // 0xf2800a40
43723                             if (((instr & 0x300000) == 0x300000)) {
43724                               UnallocatedA32(instr);
43725                               return;
43726                             }
43727                             DataType dt = Dt_U_size_2_Decode(
43728                                 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
43729                             if (dt.Is(kDataTypeValueInvalid)) {
43730                               UnallocatedA32(instr);
43731                               return;
43732                             }
43733                             if (((instr >> 12) & 1) != 0) {
43734                               UnallocatedA32(instr);
43735                               return;
43736                             }
43737                             unsigned rd = ExtractQRegister(instr, 22, 12);
43738                             unsigned rn = ExtractDRegister(instr, 7, 16);
43739                             uint32_t mvm =
43740                                 (instr & 0xf) | ((instr >> 1) & 0x10);
43741                             uint32_t shift = 4;
43742                             if (dt.Is(S16) || dt.Is(U16)) {
43743                               shift = 3;
43744                             }
43745                             uint32_t vm = mvm & ((1 << shift) - 1);
43746                             uint32_t index = mvm >> shift;
43747                             // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
43748                             vmull(al,
43749                                   dt,
43750                                   QRegister(rd),
43751                                   DRegister(rn),
43752                                   DRegister(vm),
43753                                   index);
43754                             break;
43755                           }
43756                           case 0x00000100: {
43757                             // 0xf2800b40
43758                             if ((instr & 0x01000000) == 0x00000000) {
43759                               if (((instr & 0x300000) == 0x300000)) {
43760                                 UnallocatedA32(instr);
43761                                 return;
43762                               }
43763                               DataType dt =
43764                                   Dt_size_13_Decode((instr >> 20) & 0x3);
43765                               if (dt.Is(kDataTypeValueInvalid)) {
43766                                 UnallocatedA32(instr);
43767                                 return;
43768                               }
43769                               if (((instr >> 12) & 1) != 0) {
43770                                 UnallocatedA32(instr);
43771                                 return;
43772                               }
43773                               unsigned rd = ExtractQRegister(instr, 22, 12);
43774                               unsigned rn = ExtractDRegister(instr, 7, 16);
43775                               int lane;
43776                               unsigned rm = ExtractDRegisterAndLane(instr,
43777                                                                     dt,
43778                                                                     5,
43779                                                                     0,
43780                                                                     &lane);
43781                               // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
43782                               vqdmull(al,
43783                                       dt,
43784                                       QRegister(rd),
43785                                       DRegister(rn),
43786                                       DRegisterLane(rm, lane));
43787                             } else {
43788                               UnallocatedA32(instr);
43789                             }
43790                             break;
43791                           }
43792                         }
43793                         break;
43794                       }
43795                     }
43796                     break;
43797                   }
43798                   case 0x00000c00: {
43799                     // 0xf2800c00
43800                     switch (instr & 0x00000100) {
43801                       case 0x00000000: {
43802                         // 0xf2800c00
43803                         if (((instr & 0x300000) == 0x300000)) {
43804                           UnallocatedA32(instr);
43805                           return;
43806                         }
43807                         DataType dt = Dt_op_U_size_1_Decode(
43808                             ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
43809                             ((instr >> 6) & 0x8));
43810                         if (dt.Is(kDataTypeValueInvalid)) {
43811                           UnallocatedA32(instr);
43812                           return;
43813                         }
43814                         if (((instr >> 12) & 1) != 0) {
43815                           UnallocatedA32(instr);
43816                           return;
43817                         }
43818                         unsigned rd = ExtractQRegister(instr, 22, 12);
43819                         unsigned rn = ExtractDRegister(instr, 7, 16);
43820                         unsigned rm = ExtractDRegister(instr, 5, 0);
43821                         // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43822                         vmull(al,
43823                               dt,
43824                               QRegister(rd),
43825                               DRegister(rn),
43826                               DRegister(rm));
43827                         break;
43828                       }
43829                       case 0x00000100: {
43830                         // 0xf2800d00
43831                         if ((instr & 0x01000200) == 0x00000000) {
43832                           if (((instr & 0x300000) == 0x300000)) {
43833                             UnallocatedA32(instr);
43834                             return;
43835                           }
43836                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43837                           if (dt.Is(kDataTypeValueInvalid)) {
43838                             UnallocatedA32(instr);
43839                             return;
43840                           }
43841                           if (((instr >> 12) & 1) != 0) {
43842                             UnallocatedA32(instr);
43843                             return;
43844                           }
43845                           unsigned rd = ExtractQRegister(instr, 22, 12);
43846                           unsigned rn = ExtractDRegister(instr, 7, 16);
43847                           unsigned rm = ExtractDRegister(instr, 5, 0);
43848                           // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
43849                           vqdmull(al,
43850                                   dt,
43851                                   QRegister(rd),
43852                                   DRegister(rn),
43853                                   DRegister(rm));
43854                         } else {
43855                           UnallocatedA32(instr);
43856                         }
43857                         break;
43858                       }
43859                     }
43860                     break;
43861                   }
43862                   case 0x00000c40: {
43863                     // 0xf2800c40
43864                     switch (instr & 0x01000300) {
43865                       case 0x00000000: {
43866                         // 0xf2800c40
43867                         if (((instr & 0x300000) == 0x300000)) {
43868                           UnallocatedA32(instr);
43869                           return;
43870                         }
43871                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43872                         if (dt.Is(kDataTypeValueInvalid)) {
43873                           UnallocatedA32(instr);
43874                           return;
43875                         }
43876                         unsigned rd = ExtractDRegister(instr, 22, 12);
43877                         unsigned rn = ExtractDRegister(instr, 7, 16);
43878                         int lane;
43879                         unsigned rm =
43880                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43881                         // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
43882                         vqdmulh(al,
43883                                 dt,
43884                                 DRegister(rd),
43885                                 DRegister(rn),
43886                                 DRegisterLane(rm, lane));
43887                         break;
43888                       }
43889                       case 0x00000100: {
43890                         // 0xf2800d40
43891                         if (((instr & 0x300000) == 0x300000)) {
43892                           UnallocatedA32(instr);
43893                           return;
43894                         }
43895                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43896                         if (dt.Is(kDataTypeValueInvalid)) {
43897                           UnallocatedA32(instr);
43898                           return;
43899                         }
43900                         unsigned rd = ExtractDRegister(instr, 22, 12);
43901                         unsigned rn = ExtractDRegister(instr, 7, 16);
43902                         int lane;
43903                         unsigned rm =
43904                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43905                         // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
43906                         vqrdmulh(al,
43907                                  dt,
43908                                  DRegister(rd),
43909                                  DRegister(rn),
43910                                  DRegisterLane(rm, lane));
43911                         break;
43912                       }
43913                       case 0x01000000: {
43914                         // 0xf3800c40
43915                         if (((instr & 0x300000) == 0x300000)) {
43916                           UnallocatedA32(instr);
43917                           return;
43918                         }
43919                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43920                         if (dt.Is(kDataTypeValueInvalid)) {
43921                           UnallocatedA32(instr);
43922                           return;
43923                         }
43924                         if (((instr >> 12) & 1) != 0) {
43925                           UnallocatedA32(instr);
43926                           return;
43927                         }
43928                         unsigned rd = ExtractQRegister(instr, 22, 12);
43929                         if (((instr >> 16) & 1) != 0) {
43930                           UnallocatedA32(instr);
43931                           return;
43932                         }
43933                         unsigned rn = ExtractQRegister(instr, 7, 16);
43934                         int lane;
43935                         unsigned rm =
43936                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43937                         // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
43938                         vqdmulh(al,
43939                                 dt,
43940                                 QRegister(rd),
43941                                 QRegister(rn),
43942                                 DRegisterLane(rm, lane));
43943                         break;
43944                       }
43945                       case 0x01000100: {
43946                         // 0xf3800d40
43947                         if (((instr & 0x300000) == 0x300000)) {
43948                           UnallocatedA32(instr);
43949                           return;
43950                         }
43951                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
43952                         if (dt.Is(kDataTypeValueInvalid)) {
43953                           UnallocatedA32(instr);
43954                           return;
43955                         }
43956                         if (((instr >> 12) & 1) != 0) {
43957                           UnallocatedA32(instr);
43958                           return;
43959                         }
43960                         unsigned rd = ExtractQRegister(instr, 22, 12);
43961                         if (((instr >> 16) & 1) != 0) {
43962                           UnallocatedA32(instr);
43963                           return;
43964                         }
43965                         unsigned rn = ExtractQRegister(instr, 7, 16);
43966                         int lane;
43967                         unsigned rm =
43968                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
43969                         // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
43970                         vqrdmulh(al,
43971                                  dt,
43972                                  QRegister(rd),
43973                                  QRegister(rn),
43974                                  DRegisterLane(rm, lane));
43975                         break;
43976                       }
43977                       default:
43978                         UnallocatedA32(instr);
43979                         break;
43980                     }
43981                     break;
43982                   }
43983                 }
43984                 break;
43985               }
43986             }
43987             break;
43988           }
43989           case 0x00800010: {
43990             // 0xf2800010
43991             switch (instr & 0x00000040) {
43992               case 0x00000000: {
43993                 // 0xf2800010
43994                 switch (instr & 0x00000c00) {
43995                   case 0x00000000: {
43996                     // 0xf2800010
43997                     switch (instr & 0x00380080) {
43998                       case 0x00000000: {
43999                         // 0xf2800010
44000                         switch (instr & 0x00000100) {
44001                           case 0x00000000: {
44002                             // 0xf2800010
44003                             switch (instr & 0x00000200) {
44004                               default: {
44005                                 switch (instr & 0x00000020) {
44006                                   case 0x00000020: {
44007                                     // 0xf2800030
44008                                     if (((instr & 0xd00) == 0x100) ||
44009                                         ((instr & 0xd00) == 0x500) ||
44010                                         ((instr & 0xd00) == 0x900) ||
44011                                         ((instr & 0xe00) == 0xe00)) {
44012                                       UnallocatedA32(instr);
44013                                       return;
44014                                     }
44015                                     unsigned cmode = (instr >> 8) & 0xf;
44016                                     DataType dt =
44017                                         ImmediateVmvn::DecodeDt(cmode);
44018                                     if (dt.Is(kDataTypeValueInvalid)) {
44019                                       UnallocatedA32(instr);
44020                                       return;
44021                                     }
44022                                     unsigned rd =
44023                                         ExtractDRegister(instr, 22, 12);
44024                                     DOperand imm =
44025                                         ImmediateVmvn::DecodeImmediate(
44026                                             cmode,
44027                                             (instr & 0xf) |
44028                                                 ((instr >> 12) & 0x70) |
44029                                                 ((instr >> 17) & 0x80));
44030                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44031                                     vmvn(al, dt, DRegister(rd), imm);
44032                                     break;
44033                                   }
44034                                   default: {
44035                                     if (((instr & 0x920) == 0x100) ||
44036                                         ((instr & 0x520) == 0x100) ||
44037                                         ((instr & 0x820) == 0x20) ||
44038                                         ((instr & 0x420) == 0x20) ||
44039                                         ((instr & 0x220) == 0x20) ||
44040                                         ((instr & 0x120) == 0x120)) {
44041                                       UnallocatedA32(instr);
44042                                       return;
44043                                     }
44044                                     unsigned cmode = ((instr >> 8) & 0xf) |
44045                                                      ((instr >> 1) & 0x10);
44046                                     DataType dt =
44047                                         ImmediateVmov::DecodeDt(cmode);
44048                                     if (dt.Is(kDataTypeValueInvalid)) {
44049                                       UnallocatedA32(instr);
44050                                       return;
44051                                     }
44052                                     unsigned rd =
44053                                         ExtractDRegister(instr, 22, 12);
44054                                     DOperand imm =
44055                                         ImmediateVmov::DecodeImmediate(
44056                                             cmode,
44057                                             (instr & 0xf) |
44058                                                 ((instr >> 12) & 0x70) |
44059                                                 ((instr >> 17) & 0x80));
44060                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44061                                     vmov(al, dt, DRegister(rd), imm);
44062                                     break;
44063                                   }
44064                                 }
44065                                 break;
44066                               }
44067                             }
44068                             break;
44069                           }
44070                           case 0x00000100: {
44071                             // 0xf2800110
44072                             switch (instr & 0x00000020) {
44073                               case 0x00000000: {
44074                                 // 0xf2800110
44075                                 if (((instr & 0x100) == 0x0) ||
44076                                     ((instr & 0xc00) == 0xc00)) {
44077                                   UnallocatedA32(instr);
44078                                   return;
44079                                 }
44080                                 unsigned cmode = (instr >> 8) & 0xf;
44081                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
44082                                 if (dt.Is(kDataTypeValueInvalid)) {
44083                                   UnallocatedA32(instr);
44084                                   return;
44085                                 }
44086                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44087                                 DOperand imm = ImmediateVorr::DecodeImmediate(
44088                                     cmode,
44089                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
44090                                         ((instr >> 17) & 0x80));
44091                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44092                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
44093                                 break;
44094                               }
44095                               case 0x00000020: {
44096                                 // 0xf2800130
44097                                 if (((instr & 0x100) == 0x0) ||
44098                                     ((instr & 0xc00) == 0xc00)) {
44099                                   UnallocatedA32(instr);
44100                                   return;
44101                                 }
44102                                 unsigned cmode = (instr >> 8) & 0xf;
44103                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
44104                                 if (dt.Is(kDataTypeValueInvalid)) {
44105                                   UnallocatedA32(instr);
44106                                   return;
44107                                 }
44108                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44109                                 DOperand imm = ImmediateVbic::DecodeImmediate(
44110                                     cmode,
44111                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
44112                                         ((instr >> 17) & 0x80));
44113                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44114                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
44115                                 break;
44116                               }
44117                             }
44118                             break;
44119                           }
44120                         }
44121                         break;
44122                       }
44123                       default: {
44124                         switch (instr & 0x00000300) {
44125                           case 0x00000000: {
44126                             // 0xf2800010
44127                             if (((instr & 0x380080) == 0x0)) {
44128                               UnallocatedA32(instr);
44129                               return;
44130                             }
44131                             DataType dt =
44132                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44133                                                        ((instr >> 4) & 0x8),
44134                                                    (instr >> 24) & 0x1);
44135                             if (dt.Is(kDataTypeValueInvalid)) {
44136                               UnallocatedA32(instr);
44137                               return;
44138                             }
44139                             unsigned rd = ExtractDRegister(instr, 22, 12);
44140                             unsigned rm = ExtractDRegister(instr, 5, 0);
44141                             uint32_t imm6 = (instr >> 16) & 0x3f;
44142                             uint32_t imm =
44143                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44144                                 imm6;
44145                             // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44146                             vshr(al, dt, DRegister(rd), DRegister(rm), imm);
44147                             break;
44148                           }
44149                           case 0x00000100: {
44150                             // 0xf2800110
44151                             if (((instr & 0x380080) == 0x0)) {
44152                               UnallocatedA32(instr);
44153                               return;
44154                             }
44155                             DataType dt =
44156                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44157                                                        ((instr >> 4) & 0x8),
44158                                                    (instr >> 24) & 0x1);
44159                             if (dt.Is(kDataTypeValueInvalid)) {
44160                               UnallocatedA32(instr);
44161                               return;
44162                             }
44163                             unsigned rd = ExtractDRegister(instr, 22, 12);
44164                             unsigned rm = ExtractDRegister(instr, 5, 0);
44165                             uint32_t imm6 = (instr >> 16) & 0x3f;
44166                             uint32_t imm =
44167                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44168                                 imm6;
44169                             // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44170                             vsra(al, dt, DRegister(rd), DRegister(rm), imm);
44171                             break;
44172                           }
44173                           case 0x00000200: {
44174                             // 0xf2800210
44175                             if (((instr & 0x380080) == 0x0)) {
44176                               UnallocatedA32(instr);
44177                               return;
44178                             }
44179                             DataType dt =
44180                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44181                                                        ((instr >> 4) & 0x8),
44182                                                    (instr >> 24) & 0x1);
44183                             if (dt.Is(kDataTypeValueInvalid)) {
44184                               UnallocatedA32(instr);
44185                               return;
44186                             }
44187                             unsigned rd = ExtractDRegister(instr, 22, 12);
44188                             unsigned rm = ExtractDRegister(instr, 5, 0);
44189                             uint32_t imm6 = (instr >> 16) & 0x3f;
44190                             uint32_t imm =
44191                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44192                                 imm6;
44193                             // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44194                             vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
44195                             break;
44196                           }
44197                           case 0x00000300: {
44198                             // 0xf2800310
44199                             if (((instr & 0x380080) == 0x0)) {
44200                               UnallocatedA32(instr);
44201                               return;
44202                             }
44203                             DataType dt =
44204                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44205                                                        ((instr >> 4) & 0x8),
44206                                                    (instr >> 24) & 0x1);
44207                             if (dt.Is(kDataTypeValueInvalid)) {
44208                               UnallocatedA32(instr);
44209                               return;
44210                             }
44211                             unsigned rd = ExtractDRegister(instr, 22, 12);
44212                             unsigned rm = ExtractDRegister(instr, 5, 0);
44213                             uint32_t imm6 = (instr >> 16) & 0x3f;
44214                             uint32_t imm =
44215                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44216                                 imm6;
44217                             // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44218                             vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
44219                             break;
44220                           }
44221                         }
44222                         break;
44223                       }
44224                     }
44225                     break;
44226                   }
44227                   case 0x00000400: {
44228                     // 0xf2800410
44229                     switch (instr & 0x00380080) {
44230                       case 0x00000000: {
44231                         // 0xf2800410
44232                         switch (instr & 0x00000100) {
44233                           case 0x00000000: {
44234                             // 0xf2800410
44235                             switch (instr & 0x00000200) {
44236                               default: {
44237                                 switch (instr & 0x00000020) {
44238                                   case 0x00000020: {
44239                                     // 0xf2800430
44240                                     if (((instr & 0xd00) == 0x100) ||
44241                                         ((instr & 0xd00) == 0x500) ||
44242                                         ((instr & 0xd00) == 0x900) ||
44243                                         ((instr & 0xe00) == 0xe00)) {
44244                                       UnallocatedA32(instr);
44245                                       return;
44246                                     }
44247                                     unsigned cmode = (instr >> 8) & 0xf;
44248                                     DataType dt =
44249                                         ImmediateVmvn::DecodeDt(cmode);
44250                                     if (dt.Is(kDataTypeValueInvalid)) {
44251                                       UnallocatedA32(instr);
44252                                       return;
44253                                     }
44254                                     unsigned rd =
44255                                         ExtractDRegister(instr, 22, 12);
44256                                     DOperand imm =
44257                                         ImmediateVmvn::DecodeImmediate(
44258                                             cmode,
44259                                             (instr & 0xf) |
44260                                                 ((instr >> 12) & 0x70) |
44261                                                 ((instr >> 17) & 0x80));
44262                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44263                                     vmvn(al, dt, DRegister(rd), imm);
44264                                     break;
44265                                   }
44266                                   default: {
44267                                     if (((instr & 0x920) == 0x100) ||
44268                                         ((instr & 0x520) == 0x100) ||
44269                                         ((instr & 0x820) == 0x20) ||
44270                                         ((instr & 0x420) == 0x20) ||
44271                                         ((instr & 0x220) == 0x20) ||
44272                                         ((instr & 0x120) == 0x120)) {
44273                                       UnallocatedA32(instr);
44274                                       return;
44275                                     }
44276                                     unsigned cmode = ((instr >> 8) & 0xf) |
44277                                                      ((instr >> 1) & 0x10);
44278                                     DataType dt =
44279                                         ImmediateVmov::DecodeDt(cmode);
44280                                     if (dt.Is(kDataTypeValueInvalid)) {
44281                                       UnallocatedA32(instr);
44282                                       return;
44283                                     }
44284                                     unsigned rd =
44285                                         ExtractDRegister(instr, 22, 12);
44286                                     DOperand imm =
44287                                         ImmediateVmov::DecodeImmediate(
44288                                             cmode,
44289                                             (instr & 0xf) |
44290                                                 ((instr >> 12) & 0x70) |
44291                                                 ((instr >> 17) & 0x80));
44292                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44293                                     vmov(al, dt, DRegister(rd), imm);
44294                                     break;
44295                                   }
44296                                 }
44297                                 break;
44298                               }
44299                             }
44300                             break;
44301                           }
44302                           case 0x00000100: {
44303                             // 0xf2800510
44304                             switch (instr & 0x00000020) {
44305                               case 0x00000000: {
44306                                 // 0xf2800510
44307                                 if (((instr & 0x100) == 0x0) ||
44308                                     ((instr & 0xc00) == 0xc00)) {
44309                                   UnallocatedA32(instr);
44310                                   return;
44311                                 }
44312                                 unsigned cmode = (instr >> 8) & 0xf;
44313                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
44314                                 if (dt.Is(kDataTypeValueInvalid)) {
44315                                   UnallocatedA32(instr);
44316                                   return;
44317                                 }
44318                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44319                                 DOperand imm = ImmediateVorr::DecodeImmediate(
44320                                     cmode,
44321                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
44322                                         ((instr >> 17) & 0x80));
44323                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44324                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
44325                                 break;
44326                               }
44327                               case 0x00000020: {
44328                                 // 0xf2800530
44329                                 if (((instr & 0x100) == 0x0) ||
44330                                     ((instr & 0xc00) == 0xc00)) {
44331                                   UnallocatedA32(instr);
44332                                   return;
44333                                 }
44334                                 unsigned cmode = (instr >> 8) & 0xf;
44335                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
44336                                 if (dt.Is(kDataTypeValueInvalid)) {
44337                                   UnallocatedA32(instr);
44338                                   return;
44339                                 }
44340                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44341                                 DOperand imm = ImmediateVbic::DecodeImmediate(
44342                                     cmode,
44343                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
44344                                         ((instr >> 17) & 0x80));
44345                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44346                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
44347                                 break;
44348                               }
44349                             }
44350                             break;
44351                           }
44352                         }
44353                         break;
44354                       }
44355                       default: {
44356                         switch (instr & 0x00000300) {
44357                           case 0x00000000: {
44358                             // 0xf2800410
44359                             if ((instr & 0x01000000) == 0x01000000) {
44360                               if (((instr & 0x380080) == 0x0)) {
44361                                 UnallocatedA32(instr);
44362                                 return;
44363                               }
44364                               DataType dt = Dt_L_imm6_4_Decode(
44365                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
44366                               if (dt.Is(kDataTypeValueInvalid)) {
44367                                 UnallocatedA32(instr);
44368                                 return;
44369                               }
44370                               unsigned rd = ExtractDRegister(instr, 22, 12);
44371                               unsigned rm = ExtractDRegister(instr, 5, 0);
44372                               uint32_t imm6 = (instr >> 16) & 0x3f;
44373                               uint32_t imm =
44374                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
44375                                   imm6;
44376                               // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44377                               vsri(al, dt, DRegister(rd), DRegister(rm), imm);
44378                             } else {
44379                               UnallocatedA32(instr);
44380                             }
44381                             break;
44382                           }
44383                           case 0x00000100: {
44384                             // 0xf2800510
44385                             switch (instr & 0x01000000) {
44386                               case 0x00000000: {
44387                                 // 0xf2800510
44388                                 if (((instr & 0x380080) == 0x0)) {
44389                                   UnallocatedA32(instr);
44390                                   return;
44391                                 }
44392                                 DataType dt =
44393                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
44394                                                        ((instr >> 4) & 0x8));
44395                                 if (dt.Is(kDataTypeValueInvalid)) {
44396                                   UnallocatedA32(instr);
44397                                   return;
44398                                 }
44399                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44400                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44401                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44402                                 uint32_t imm =
44403                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44404                                 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44405                                 vshl(al, dt, DRegister(rd), DRegister(rm), imm);
44406                                 break;
44407                               }
44408                               case 0x01000000: {
44409                                 // 0xf3800510
44410                                 if (((instr & 0x380080) == 0x0)) {
44411                                   UnallocatedA32(instr);
44412                                   return;
44413                                 }
44414                                 DataType dt =
44415                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
44416                                                        ((instr >> 4) & 0x8));
44417                                 if (dt.Is(kDataTypeValueInvalid)) {
44418                                   UnallocatedA32(instr);
44419                                   return;
44420                                 }
44421                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44422                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44423                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44424                                 uint32_t imm =
44425                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44426                                 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
44427                                 vsli(al, dt, DRegister(rd), DRegister(rm), imm);
44428                                 break;
44429                               }
44430                             }
44431                             break;
44432                           }
44433                           case 0x00000200: {
44434                             // 0xf2800610
44435                             if (((instr & 0x380080) == 0x0)) {
44436                               UnallocatedA32(instr);
44437                               return;
44438                             }
44439                             DataType dt =
44440                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
44441                                                        ((instr >> 4) & 0x8),
44442                                                    (instr >> 24) & 0x1);
44443                             if (dt.Is(kDataTypeValueInvalid)) {
44444                               UnallocatedA32(instr);
44445                               return;
44446                             }
44447                             unsigned rd = ExtractDRegister(instr, 22, 12);
44448                             unsigned rm = ExtractDRegister(instr, 5, 0);
44449                             uint32_t imm6 = (instr >> 16) & 0x3f;
44450                             uint32_t imm =
44451                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44452                             // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44453                             vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
44454                             break;
44455                           }
44456                           case 0x00000300: {
44457                             // 0xf2800710
44458                             if (((instr & 0x380080) == 0x0)) {
44459                               UnallocatedA32(instr);
44460                               return;
44461                             }
44462                             DataType dt =
44463                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
44464                                                        ((instr >> 4) & 0x8),
44465                                                    (instr >> 24) & 0x1);
44466                             if (dt.Is(kDataTypeValueInvalid)) {
44467                               UnallocatedA32(instr);
44468                               return;
44469                             }
44470                             unsigned rd = ExtractDRegister(instr, 22, 12);
44471                             unsigned rm = ExtractDRegister(instr, 5, 0);
44472                             uint32_t imm6 = (instr >> 16) & 0x3f;
44473                             uint32_t imm =
44474                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
44475                             // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44476                             vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
44477                             break;
44478                           }
44479                         }
44480                         break;
44481                       }
44482                     }
44483                     break;
44484                   }
44485                   case 0x00000800: {
44486                     // 0xf2800810
44487                     switch (instr & 0x00000080) {
44488                       case 0x00000000: {
44489                         // 0xf2800810
44490                         switch (instr & 0x00380000) {
44491                           case 0x00000000: {
44492                             // 0xf2800810
44493                             switch (instr & 0x00000100) {
44494                               case 0x00000000: {
44495                                 // 0xf2800810
44496                                 switch (instr & 0x00000200) {
44497                                   default: {
44498                                     switch (instr & 0x00000020) {
44499                                       case 0x00000020: {
44500                                         // 0xf2800830
44501                                         if (((instr & 0xd00) == 0x100) ||
44502                                             ((instr & 0xd00) == 0x500) ||
44503                                             ((instr & 0xd00) == 0x900) ||
44504                                             ((instr & 0xe00) == 0xe00)) {
44505                                           UnallocatedA32(instr);
44506                                           return;
44507                                         }
44508                                         unsigned cmode = (instr >> 8) & 0xf;
44509                                         DataType dt =
44510                                             ImmediateVmvn::DecodeDt(cmode);
44511                                         if (dt.Is(kDataTypeValueInvalid)) {
44512                                           UnallocatedA32(instr);
44513                                           return;
44514                                         }
44515                                         unsigned rd =
44516                                             ExtractDRegister(instr, 22, 12);
44517                                         DOperand imm =
44518                                             ImmediateVmvn::DecodeImmediate(
44519                                                 cmode,
44520                                                 (instr & 0xf) |
44521                                                     ((instr >> 12) & 0x70) |
44522                                                     ((instr >> 17) & 0x80));
44523                                         // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44524                                         vmvn(al, dt, DRegister(rd), imm);
44525                                         break;
44526                                       }
44527                                       default: {
44528                                         if (((instr & 0x920) == 0x100) ||
44529                                             ((instr & 0x520) == 0x100) ||
44530                                             ((instr & 0x820) == 0x20) ||
44531                                             ((instr & 0x420) == 0x20) ||
44532                                             ((instr & 0x220) == 0x20) ||
44533                                             ((instr & 0x120) == 0x120)) {
44534                                           UnallocatedA32(instr);
44535                                           return;
44536                                         }
44537                                         unsigned cmode = ((instr >> 8) & 0xf) |
44538                                                          ((instr >> 1) & 0x10);
44539                                         DataType dt =
44540                                             ImmediateVmov::DecodeDt(cmode);
44541                                         if (dt.Is(kDataTypeValueInvalid)) {
44542                                           UnallocatedA32(instr);
44543                                           return;
44544                                         }
44545                                         unsigned rd =
44546                                             ExtractDRegister(instr, 22, 12);
44547                                         DOperand imm =
44548                                             ImmediateVmov::DecodeImmediate(
44549                                                 cmode,
44550                                                 (instr & 0xf) |
44551                                                     ((instr >> 12) & 0x70) |
44552                                                     ((instr >> 17) & 0x80));
44553                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
44554                                         vmov(al, dt, DRegister(rd), imm);
44555                                         break;
44556                                       }
44557                                     }
44558                                     break;
44559                                   }
44560                                 }
44561                                 break;
44562                               }
44563                               case 0x00000100: {
44564                                 // 0xf2800910
44565                                 switch (instr & 0x00000020) {
44566                                   case 0x00000000: {
44567                                     // 0xf2800910
44568                                     if (((instr & 0x100) == 0x0) ||
44569                                         ((instr & 0xc00) == 0xc00)) {
44570                                       UnallocatedA32(instr);
44571                                       return;
44572                                     }
44573                                     unsigned cmode = (instr >> 8) & 0xf;
44574                                     DataType dt =
44575                                         ImmediateVorr::DecodeDt(cmode);
44576                                     if (dt.Is(kDataTypeValueInvalid)) {
44577                                       UnallocatedA32(instr);
44578                                       return;
44579                                     }
44580                                     unsigned rd =
44581                                         ExtractDRegister(instr, 22, 12);
44582                                     DOperand imm =
44583                                         ImmediateVorr::DecodeImmediate(
44584                                             cmode,
44585                                             (instr & 0xf) |
44586                                                 ((instr >> 12) & 0x70) |
44587                                                 ((instr >> 17) & 0x80));
44588                                     // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44589                                     vorr(al,
44590                                          dt,
44591                                          DRegister(rd),
44592                                          DRegister(rd),
44593                                          imm);
44594                                     break;
44595                                   }
44596                                   case 0x00000020: {
44597                                     // 0xf2800930
44598                                     if (((instr & 0x100) == 0x0) ||
44599                                         ((instr & 0xc00) == 0xc00)) {
44600                                       UnallocatedA32(instr);
44601                                       return;
44602                                     }
44603                                     unsigned cmode = (instr >> 8) & 0xf;
44604                                     DataType dt =
44605                                         ImmediateVbic::DecodeDt(cmode);
44606                                     if (dt.Is(kDataTypeValueInvalid)) {
44607                                       UnallocatedA32(instr);
44608                                       return;
44609                                     }
44610                                     unsigned rd =
44611                                         ExtractDRegister(instr, 22, 12);
44612                                     DOperand imm =
44613                                         ImmediateVbic::DecodeImmediate(
44614                                             cmode,
44615                                             (instr & 0xf) |
44616                                                 ((instr >> 12) & 0x70) |
44617                                                 ((instr >> 17) & 0x80));
44618                                     // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
44619                                     vbic(al,
44620                                          dt,
44621                                          DRegister(rd),
44622                                          DRegister(rd),
44623                                          imm);
44624                                     break;
44625                                   }
44626                                 }
44627                                 break;
44628                               }
44629                             }
44630                             break;
44631                           }
44632                           case 0x00180000: {
44633                             // 0xf2980810
44634                             switch (instr & 0x00000300) {
44635                               case 0x00000000: {
44636                                 // 0xf2980810
44637                                 switch (instr & 0x01000000) {
44638                                   case 0x00000000: {
44639                                     // 0xf2980810
44640                                     if (((instr & 0x380000) == 0x0)) {
44641                                       UnallocatedA32(instr);
44642                                       return;
44643                                     }
44644                                     DataType dt =
44645                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44646                                     if (dt.Is(kDataTypeValueInvalid)) {
44647                                       UnallocatedA32(instr);
44648                                       return;
44649                                     }
44650                                     unsigned rd =
44651                                         ExtractDRegister(instr, 22, 12);
44652                                     if ((instr & 1) != 0) {
44653                                       UnallocatedA32(instr);
44654                                       return;
44655                                     }
44656                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44657                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44658                                     uint32_t imm = dt.GetSize() - imm6;
44659                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44660                                     vshrn(al,
44661                                           dt,
44662                                           DRegister(rd),
44663                                           QRegister(rm),
44664                                           imm);
44665                                     break;
44666                                   }
44667                                   case 0x01000000: {
44668                                     // 0xf3980810
44669                                     if (((instr & 0x380000) == 0x0)) {
44670                                       UnallocatedA32(instr);
44671                                       return;
44672                                     }
44673                                     DataType dt =
44674                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44675                                                          (instr >> 24) & 0x1);
44676                                     if (dt.Is(kDataTypeValueInvalid)) {
44677                                       UnallocatedA32(instr);
44678                                       return;
44679                                     }
44680                                     unsigned rd =
44681                                         ExtractDRegister(instr, 22, 12);
44682                                     if ((instr & 1) != 0) {
44683                                       UnallocatedA32(instr);
44684                                       return;
44685                                     }
44686                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44687                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44688                                     uint32_t imm = dt.GetSize() - imm6;
44689                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44690                                     vqshrun(al,
44691                                             dt,
44692                                             DRegister(rd),
44693                                             QRegister(rm),
44694                                             imm);
44695                                     break;
44696                                   }
44697                                 }
44698                                 break;
44699                               }
44700                               case 0x00000100: {
44701                                 // 0xf2980910
44702                                 if (((instr & 0x380000) == 0x0)) {
44703                                   UnallocatedA32(instr);
44704                                   return;
44705                                 }
44706                                 DataType dt =
44707                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44708                                                      (instr >> 24) & 0x1);
44709                                 if (dt.Is(kDataTypeValueInvalid)) {
44710                                   UnallocatedA32(instr);
44711                                   return;
44712                                 }
44713                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44714                                 if ((instr & 1) != 0) {
44715                                   UnallocatedA32(instr);
44716                                   return;
44717                                 }
44718                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44719                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44720                                 uint32_t imm = dt.GetSize() - imm6;
44721                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44722                                 vqshrn(al,
44723                                        dt,
44724                                        DRegister(rd),
44725                                        QRegister(rm),
44726                                        imm);
44727                                 break;
44728                               }
44729                               case 0x00000200: {
44730                                 // 0xf2980a10
44731                                 if (((instr & 0x380000) == 0x0) ||
44732                                     ((instr & 0x3f0000) == 0x80000) ||
44733                                     ((instr & 0x3f0000) == 0x100000) ||
44734                                     ((instr & 0x3f0000) == 0x200000)) {
44735                                   UnallocatedA32(instr);
44736                                   return;
44737                                 }
44738                                 DataType dt =
44739                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
44740                                                      (instr >> 24) & 0x1);
44741                                 if (dt.Is(kDataTypeValueInvalid)) {
44742                                   UnallocatedA32(instr);
44743                                   return;
44744                                 }
44745                                 if (((instr >> 12) & 1) != 0) {
44746                                   UnallocatedA32(instr);
44747                                   return;
44748                                 }
44749                                 unsigned rd = ExtractQRegister(instr, 22, 12);
44750                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44751                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44752                                 uint32_t imm = imm6 - dt.GetSize();
44753                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44754                                 vshll(al,
44755                                       dt,
44756                                       QRegister(rd),
44757                                       DRegister(rm),
44758                                       imm);
44759                                 break;
44760                               }
44761                               default:
44762                                 UnallocatedA32(instr);
44763                                 break;
44764                             }
44765                             break;
44766                           }
44767                           case 0x00280000: {
44768                             // 0xf2a80810
44769                             switch (instr & 0x00000300) {
44770                               case 0x00000000: {
44771                                 // 0xf2a80810
44772                                 switch (instr & 0x01000000) {
44773                                   case 0x00000000: {
44774                                     // 0xf2a80810
44775                                     if (((instr & 0x380000) == 0x0)) {
44776                                       UnallocatedA32(instr);
44777                                       return;
44778                                     }
44779                                     DataType dt =
44780                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44781                                     if (dt.Is(kDataTypeValueInvalid)) {
44782                                       UnallocatedA32(instr);
44783                                       return;
44784                                     }
44785                                     unsigned rd =
44786                                         ExtractDRegister(instr, 22, 12);
44787                                     if ((instr & 1) != 0) {
44788                                       UnallocatedA32(instr);
44789                                       return;
44790                                     }
44791                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44792                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44793                                     uint32_t imm = dt.GetSize() - imm6;
44794                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44795                                     vshrn(al,
44796                                           dt,
44797                                           DRegister(rd),
44798                                           QRegister(rm),
44799                                           imm);
44800                                     break;
44801                                   }
44802                                   case 0x01000000: {
44803                                     // 0xf3a80810
44804                                     if (((instr & 0x380000) == 0x0)) {
44805                                       UnallocatedA32(instr);
44806                                       return;
44807                                     }
44808                                     DataType dt =
44809                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44810                                                          (instr >> 24) & 0x1);
44811                                     if (dt.Is(kDataTypeValueInvalid)) {
44812                                       UnallocatedA32(instr);
44813                                       return;
44814                                     }
44815                                     unsigned rd =
44816                                         ExtractDRegister(instr, 22, 12);
44817                                     if ((instr & 1) != 0) {
44818                                       UnallocatedA32(instr);
44819                                       return;
44820                                     }
44821                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44822                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44823                                     uint32_t imm = dt.GetSize() - imm6;
44824                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44825                                     vqshrun(al,
44826                                             dt,
44827                                             DRegister(rd),
44828                                             QRegister(rm),
44829                                             imm);
44830                                     break;
44831                                   }
44832                                 }
44833                                 break;
44834                               }
44835                               case 0x00000100: {
44836                                 // 0xf2a80910
44837                                 if (((instr & 0x380000) == 0x0)) {
44838                                   UnallocatedA32(instr);
44839                                   return;
44840                                 }
44841                                 DataType dt =
44842                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44843                                                      (instr >> 24) & 0x1);
44844                                 if (dt.Is(kDataTypeValueInvalid)) {
44845                                   UnallocatedA32(instr);
44846                                   return;
44847                                 }
44848                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44849                                 if ((instr & 1) != 0) {
44850                                   UnallocatedA32(instr);
44851                                   return;
44852                                 }
44853                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44854                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44855                                 uint32_t imm = dt.GetSize() - imm6;
44856                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44857                                 vqshrn(al,
44858                                        dt,
44859                                        DRegister(rd),
44860                                        QRegister(rm),
44861                                        imm);
44862                                 break;
44863                               }
44864                               case 0x00000200: {
44865                                 // 0xf2a80a10
44866                                 if (((instr & 0x380000) == 0x0) ||
44867                                     ((instr & 0x3f0000) == 0x80000) ||
44868                                     ((instr & 0x3f0000) == 0x100000) ||
44869                                     ((instr & 0x3f0000) == 0x200000)) {
44870                                   UnallocatedA32(instr);
44871                                   return;
44872                                 }
44873                                 DataType dt =
44874                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
44875                                                      (instr >> 24) & 0x1);
44876                                 if (dt.Is(kDataTypeValueInvalid)) {
44877                                   UnallocatedA32(instr);
44878                                   return;
44879                                 }
44880                                 if (((instr >> 12) & 1) != 0) {
44881                                   UnallocatedA32(instr);
44882                                   return;
44883                                 }
44884                                 unsigned rd = ExtractQRegister(instr, 22, 12);
44885                                 unsigned rm = ExtractDRegister(instr, 5, 0);
44886                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44887                                 uint32_t imm = imm6 - dt.GetSize();
44888                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44889                                 vshll(al,
44890                                       dt,
44891                                       QRegister(rd),
44892                                       DRegister(rm),
44893                                       imm);
44894                                 break;
44895                               }
44896                               default:
44897                                 UnallocatedA32(instr);
44898                                 break;
44899                             }
44900                             break;
44901                           }
44902                           case 0x00300000: {
44903                             // 0xf2b00810
44904                             switch (instr & 0x00000300) {
44905                               case 0x00000000: {
44906                                 // 0xf2b00810
44907                                 switch (instr & 0x01000000) {
44908                                   case 0x00000000: {
44909                                     // 0xf2b00810
44910                                     if (((instr & 0x380000) == 0x0)) {
44911                                       UnallocatedA32(instr);
44912                                       return;
44913                                     }
44914                                     DataType dt =
44915                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
44916                                     if (dt.Is(kDataTypeValueInvalid)) {
44917                                       UnallocatedA32(instr);
44918                                       return;
44919                                     }
44920                                     unsigned rd =
44921                                         ExtractDRegister(instr, 22, 12);
44922                                     if ((instr & 1) != 0) {
44923                                       UnallocatedA32(instr);
44924                                       return;
44925                                     }
44926                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44927                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44928                                     uint32_t imm = dt.GetSize() - imm6;
44929                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44930                                     vshrn(al,
44931                                           dt,
44932                                           DRegister(rd),
44933                                           QRegister(rm),
44934                                           imm);
44935                                     break;
44936                                   }
44937                                   case 0x01000000: {
44938                                     // 0xf3b00810
44939                                     if (((instr & 0x380000) == 0x0)) {
44940                                       UnallocatedA32(instr);
44941                                       return;
44942                                     }
44943                                     DataType dt =
44944                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
44945                                                          (instr >> 24) & 0x1);
44946                                     if (dt.Is(kDataTypeValueInvalid)) {
44947                                       UnallocatedA32(instr);
44948                                       return;
44949                                     }
44950                                     unsigned rd =
44951                                         ExtractDRegister(instr, 22, 12);
44952                                     if ((instr & 1) != 0) {
44953                                       UnallocatedA32(instr);
44954                                       return;
44955                                     }
44956                                     unsigned rm = ExtractQRegister(instr, 5, 0);
44957                                     uint32_t imm6 = (instr >> 16) & 0x3f;
44958                                     uint32_t imm = dt.GetSize() - imm6;
44959                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44960                                     vqshrun(al,
44961                                             dt,
44962                                             DRegister(rd),
44963                                             QRegister(rm),
44964                                             imm);
44965                                     break;
44966                                   }
44967                                 }
44968                                 break;
44969                               }
44970                               case 0x00000100: {
44971                                 // 0xf2b00910
44972                                 if (((instr & 0x380000) == 0x0)) {
44973                                   UnallocatedA32(instr);
44974                                   return;
44975                                 }
44976                                 DataType dt =
44977                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
44978                                                      (instr >> 24) & 0x1);
44979                                 if (dt.Is(kDataTypeValueInvalid)) {
44980                                   UnallocatedA32(instr);
44981                                   return;
44982                                 }
44983                                 unsigned rd = ExtractDRegister(instr, 22, 12);
44984                                 if ((instr & 1) != 0) {
44985                                   UnallocatedA32(instr);
44986                                   return;
44987                                 }
44988                                 unsigned rm = ExtractQRegister(instr, 5, 0);
44989                                 uint32_t imm6 = (instr >> 16) & 0x3f;
44990                                 uint32_t imm = dt.GetSize() - imm6;
44991                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
44992                                 vqshrn(al,
44993                                        dt,
44994                                        DRegister(rd),
44995                                        QRegister(rm),
44996                                        imm);
44997                                 break;
44998                               }
44999                               case 0x00000200: {
45000                                 // 0xf2b00a10
45001                                 if (((instr & 0x380000) == 0x0) ||
45002                                     ((instr & 0x3f0000) == 0x80000) ||
45003                                     ((instr & 0x3f0000) == 0x100000) ||
45004                                     ((instr & 0x3f0000) == 0x200000)) {
45005                                   UnallocatedA32(instr);
45006                                   return;
45007                                 }
45008                                 DataType dt =
45009                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
45010                                                      (instr >> 24) & 0x1);
45011                                 if (dt.Is(kDataTypeValueInvalid)) {
45012                                   UnallocatedA32(instr);
45013                                   return;
45014                                 }
45015                                 if (((instr >> 12) & 1) != 0) {
45016                                   UnallocatedA32(instr);
45017                                   return;
45018                                 }
45019                                 unsigned rd = ExtractQRegister(instr, 22, 12);
45020                                 unsigned rm = ExtractDRegister(instr, 5, 0);
45021                                 uint32_t imm6 = (instr >> 16) & 0x3f;
45022                                 uint32_t imm = imm6 - dt.GetSize();
45023                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45024                                 vshll(al,
45025                                       dt,
45026                                       QRegister(rd),
45027                                       DRegister(rm),
45028                                       imm);
45029                                 break;
45030                               }
45031                               default:
45032                                 UnallocatedA32(instr);
45033                                 break;
45034                             }
45035                             break;
45036                           }
45037                           case 0x00380000: {
45038                             // 0xf2b80810
45039                             switch (instr & 0x00000300) {
45040                               case 0x00000000: {
45041                                 // 0xf2b80810
45042                                 switch (instr & 0x01000000) {
45043                                   case 0x00000000: {
45044                                     // 0xf2b80810
45045                                     if (((instr & 0x380000) == 0x0)) {
45046                                       UnallocatedA32(instr);
45047                                       return;
45048                                     }
45049                                     DataType dt =
45050                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
45051                                     if (dt.Is(kDataTypeValueInvalid)) {
45052                                       UnallocatedA32(instr);
45053                                       return;
45054                                     }
45055                                     unsigned rd =
45056                                         ExtractDRegister(instr, 22, 12);
45057                                     if ((instr & 1) != 0) {
45058                                       UnallocatedA32(instr);
45059                                       return;
45060                                     }
45061                                     unsigned rm = ExtractQRegister(instr, 5, 0);
45062                                     uint32_t imm6 = (instr >> 16) & 0x3f;
45063                                     uint32_t imm = dt.GetSize() - imm6;
45064                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45065                                     vshrn(al,
45066                                           dt,
45067                                           DRegister(rd),
45068                                           QRegister(rm),
45069                                           imm);
45070                                     break;
45071                                   }
45072                                   case 0x01000000: {
45073                                     // 0xf3b80810
45074                                     if (((instr & 0x380000) == 0x0)) {
45075                                       UnallocatedA32(instr);
45076                                       return;
45077                                     }
45078                                     DataType dt =
45079                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
45080                                                          (instr >> 24) & 0x1);
45081                                     if (dt.Is(kDataTypeValueInvalid)) {
45082                                       UnallocatedA32(instr);
45083                                       return;
45084                                     }
45085                                     unsigned rd =
45086                                         ExtractDRegister(instr, 22, 12);
45087                                     if ((instr & 1) != 0) {
45088                                       UnallocatedA32(instr);
45089                                       return;
45090                                     }
45091                                     unsigned rm = ExtractQRegister(instr, 5, 0);
45092                                     uint32_t imm6 = (instr >> 16) & 0x3f;
45093                                     uint32_t imm = dt.GetSize() - imm6;
45094                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45095                                     vqshrun(al,
45096                                             dt,
45097                                             DRegister(rd),
45098                                             QRegister(rm),
45099                                             imm);
45100                                     break;
45101                                   }
45102                                 }
45103                                 break;
45104                               }
45105                               case 0x00000100: {
45106                                 // 0xf2b80910
45107                                 if (((instr & 0x380000) == 0x0)) {
45108                                   UnallocatedA32(instr);
45109                                   return;
45110                                 }
45111                                 DataType dt =
45112                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
45113                                                      (instr >> 24) & 0x1);
45114                                 if (dt.Is(kDataTypeValueInvalid)) {
45115                                   UnallocatedA32(instr);
45116                                   return;
45117                                 }
45118                                 unsigned rd = ExtractDRegister(instr, 22, 12);
45119                                 if ((instr & 1) != 0) {
45120                                   UnallocatedA32(instr);
45121                                   return;
45122                                 }
45123                                 unsigned rm = ExtractQRegister(instr, 5, 0);
45124                                 uint32_t imm6 = (instr >> 16) & 0x3f;
45125                                 uint32_t imm = dt.GetSize() - imm6;
45126                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45127                                 vqshrn(al,
45128                                        dt,
45129                                        DRegister(rd),
45130                                        QRegister(rm),
45131                                        imm);
45132                                 break;
45133                               }
45134                               case 0x00000200: {
45135                                 // 0xf2b80a10
45136                                 if (((instr & 0x380000) == 0x0) ||
45137                                     ((instr & 0x3f0000) == 0x80000) ||
45138                                     ((instr & 0x3f0000) == 0x100000) ||
45139                                     ((instr & 0x3f0000) == 0x200000)) {
45140                                   UnallocatedA32(instr);
45141                                   return;
45142                                 }
45143                                 DataType dt =
45144                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
45145                                                      (instr >> 24) & 0x1);
45146                                 if (dt.Is(kDataTypeValueInvalid)) {
45147                                   UnallocatedA32(instr);
45148                                   return;
45149                                 }
45150                                 if (((instr >> 12) & 1) != 0) {
45151                                   UnallocatedA32(instr);
45152                                   return;
45153                                 }
45154                                 unsigned rd = ExtractQRegister(instr, 22, 12);
45155                                 unsigned rm = ExtractDRegister(instr, 5, 0);
45156                                 uint32_t imm6 = (instr >> 16) & 0x3f;
45157                                 uint32_t imm = imm6 - dt.GetSize();
45158                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45159                                 vshll(al,
45160                                       dt,
45161                                       QRegister(rd),
45162                                       DRegister(rm),
45163                                       imm);
45164                                 break;
45165                               }
45166                               default:
45167                                 UnallocatedA32(instr);
45168                                 break;
45169                             }
45170                             break;
45171                           }
45172                           default: {
45173                             switch (instr & 0x00000300) {
45174                               case 0x00000000: {
45175                                 // 0xf2800810
45176                                 switch (instr & 0x01000000) {
45177                                   case 0x00000000: {
45178                                     // 0xf2800810
45179                                     if (((instr & 0x380000) == 0x0)) {
45180                                       UnallocatedA32(instr);
45181                                       return;
45182                                     }
45183                                     DataType dt =
45184                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
45185                                     if (dt.Is(kDataTypeValueInvalid)) {
45186                                       UnallocatedA32(instr);
45187                                       return;
45188                                     }
45189                                     unsigned rd =
45190                                         ExtractDRegister(instr, 22, 12);
45191                                     if ((instr & 1) != 0) {
45192                                       UnallocatedA32(instr);
45193                                       return;
45194                                     }
45195                                     unsigned rm = ExtractQRegister(instr, 5, 0);
45196                                     uint32_t imm6 = (instr >> 16) & 0x3f;
45197                                     uint32_t imm = dt.GetSize() - imm6;
45198                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45199                                     vshrn(al,
45200                                           dt,
45201                                           DRegister(rd),
45202                                           QRegister(rm),
45203                                           imm);
45204                                     break;
45205                                   }
45206                                   case 0x01000000: {
45207                                     // 0xf3800810
45208                                     if (((instr & 0x380000) == 0x0)) {
45209                                       UnallocatedA32(instr);
45210                                       return;
45211                                     }
45212                                     DataType dt =
45213                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
45214                                                          (instr >> 24) & 0x1);
45215                                     if (dt.Is(kDataTypeValueInvalid)) {
45216                                       UnallocatedA32(instr);
45217                                       return;
45218                                     }
45219                                     unsigned rd =
45220                                         ExtractDRegister(instr, 22, 12);
45221                                     if ((instr & 1) != 0) {
45222                                       UnallocatedA32(instr);
45223                                       return;
45224                                     }
45225                                     unsigned rm = ExtractQRegister(instr, 5, 0);
45226                                     uint32_t imm6 = (instr >> 16) & 0x3f;
45227                                     uint32_t imm = dt.GetSize() - imm6;
45228                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45229                                     vqshrun(al,
45230                                             dt,
45231                                             DRegister(rd),
45232                                             QRegister(rm),
45233                                             imm);
45234                                     break;
45235                                   }
45236                                 }
45237                                 break;
45238                               }
45239                               case 0x00000100: {
45240                                 // 0xf2800910
45241                                 if (((instr & 0x380000) == 0x0)) {
45242                                   UnallocatedA32(instr);
45243                                   return;
45244                                 }
45245                                 DataType dt =
45246                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
45247                                                      (instr >> 24) & 0x1);
45248                                 if (dt.Is(kDataTypeValueInvalid)) {
45249                                   UnallocatedA32(instr);
45250                                   return;
45251                                 }
45252                                 unsigned rd = ExtractDRegister(instr, 22, 12);
45253                                 if ((instr & 1) != 0) {
45254                                   UnallocatedA32(instr);
45255                                   return;
45256                                 }
45257                                 unsigned rm = ExtractQRegister(instr, 5, 0);
45258                                 uint32_t imm6 = (instr >> 16) & 0x3f;
45259                                 uint32_t imm = dt.GetSize() - imm6;
45260                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45261                                 vqshrn(al,
45262                                        dt,
45263                                        DRegister(rd),
45264                                        QRegister(rm),
45265                                        imm);
45266                                 break;
45267                               }
45268                               case 0x00000200: {
45269                                 // 0xf2800a10
45270                                 switch (instr & 0x00070000) {
45271                                   case 0x00000000: {
45272                                     // 0xf2800a10
45273                                     switch (instr & 0x003f0000) {
45274                                       case 0x00080000: {
45275                                         // 0xf2880a10
45276                                         if (((instr & 0x380000) == 0x0) ||
45277                                             ((instr & 0x380000) == 0x180000) ||
45278                                             ((instr & 0x380000) == 0x280000) ||
45279                                             ((instr & 0x380000) == 0x300000) ||
45280                                             ((instr & 0x380000) == 0x380000)) {
45281                                           UnallocatedA32(instr);
45282                                           return;
45283                                         }
45284                                         DataType dt = Dt_U_imm3H_1_Decode(
45285                                             ((instr >> 19) & 0x7) |
45286                                             ((instr >> 21) & 0x8));
45287                                         if (dt.Is(kDataTypeValueInvalid)) {
45288                                           UnallocatedA32(instr);
45289                                           return;
45290                                         }
45291                                         if (((instr >> 12) & 1) != 0) {
45292                                           UnallocatedA32(instr);
45293                                           return;
45294                                         }
45295                                         unsigned rd =
45296                                             ExtractQRegister(instr, 22, 12);
45297                                         unsigned rm =
45298                                             ExtractDRegister(instr, 5, 0);
45299                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45300                                         vmovl(al,
45301                                               dt,
45302                                               QRegister(rd),
45303                                               DRegister(rm));
45304                                         break;
45305                                       }
45306                                       case 0x00090000: {
45307                                         // 0xf2890a10
45308                                         if (((instr & 0x380000) == 0x0) ||
45309                                             ((instr & 0x3f0000) == 0x80000) ||
45310                                             ((instr & 0x3f0000) == 0x100000) ||
45311                                             ((instr & 0x3f0000) == 0x200000)) {
45312                                           UnallocatedA32(instr);
45313                                           return;
45314                                         }
45315                                         DataType dt =
45316                                             Dt_imm6_4_Decode((instr >> 19) &
45317                                                                  0x7,
45318                                                              (instr >> 24) &
45319                                                                  0x1);
45320                                         if (dt.Is(kDataTypeValueInvalid)) {
45321                                           UnallocatedA32(instr);
45322                                           return;
45323                                         }
45324                                         if (((instr >> 12) & 1) != 0) {
45325                                           UnallocatedA32(instr);
45326                                           return;
45327                                         }
45328                                         unsigned rd =
45329                                             ExtractQRegister(instr, 22, 12);
45330                                         unsigned rm =
45331                                             ExtractDRegister(instr, 5, 0);
45332                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45333                                         uint32_t imm = imm6 - dt.GetSize();
45334                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45335                                         vshll(al,
45336                                               dt,
45337                                               QRegister(rd),
45338                                               DRegister(rm),
45339                                               imm);
45340                                         break;
45341                                       }
45342                                       case 0x000a0000: {
45343                                         // 0xf28a0a10
45344                                         if (((instr & 0x380000) == 0x0) ||
45345                                             ((instr & 0x3f0000) == 0x80000) ||
45346                                             ((instr & 0x3f0000) == 0x100000) ||
45347                                             ((instr & 0x3f0000) == 0x200000)) {
45348                                           UnallocatedA32(instr);
45349                                           return;
45350                                         }
45351                                         DataType dt =
45352                                             Dt_imm6_4_Decode((instr >> 19) &
45353                                                                  0x7,
45354                                                              (instr >> 24) &
45355                                                                  0x1);
45356                                         if (dt.Is(kDataTypeValueInvalid)) {
45357                                           UnallocatedA32(instr);
45358                                           return;
45359                                         }
45360                                         if (((instr >> 12) & 1) != 0) {
45361                                           UnallocatedA32(instr);
45362                                           return;
45363                                         }
45364                                         unsigned rd =
45365                                             ExtractQRegister(instr, 22, 12);
45366                                         unsigned rm =
45367                                             ExtractDRegister(instr, 5, 0);
45368                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45369                                         uint32_t imm = imm6 - dt.GetSize();
45370                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45371                                         vshll(al,
45372                                               dt,
45373                                               QRegister(rd),
45374                                               DRegister(rm),
45375                                               imm);
45376                                         break;
45377                                       }
45378                                       case 0x000b0000: {
45379                                         // 0xf28b0a10
45380                                         if (((instr & 0x380000) == 0x0) ||
45381                                             ((instr & 0x3f0000) == 0x80000) ||
45382                                             ((instr & 0x3f0000) == 0x100000) ||
45383                                             ((instr & 0x3f0000) == 0x200000)) {
45384                                           UnallocatedA32(instr);
45385                                           return;
45386                                         }
45387                                         DataType dt =
45388                                             Dt_imm6_4_Decode((instr >> 19) &
45389                                                                  0x7,
45390                                                              (instr >> 24) &
45391                                                                  0x1);
45392                                         if (dt.Is(kDataTypeValueInvalid)) {
45393                                           UnallocatedA32(instr);
45394                                           return;
45395                                         }
45396                                         if (((instr >> 12) & 1) != 0) {
45397                                           UnallocatedA32(instr);
45398                                           return;
45399                                         }
45400                                         unsigned rd =
45401                                             ExtractQRegister(instr, 22, 12);
45402                                         unsigned rm =
45403                                             ExtractDRegister(instr, 5, 0);
45404                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45405                                         uint32_t imm = imm6 - dt.GetSize();
45406                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45407                                         vshll(al,
45408                                               dt,
45409                                               QRegister(rd),
45410                                               DRegister(rm),
45411                                               imm);
45412                                         break;
45413                                       }
45414                                       case 0x000c0000: {
45415                                         // 0xf28c0a10
45416                                         if (((instr & 0x380000) == 0x0) ||
45417                                             ((instr & 0x3f0000) == 0x80000) ||
45418                                             ((instr & 0x3f0000) == 0x100000) ||
45419                                             ((instr & 0x3f0000) == 0x200000)) {
45420                                           UnallocatedA32(instr);
45421                                           return;
45422                                         }
45423                                         DataType dt =
45424                                             Dt_imm6_4_Decode((instr >> 19) &
45425                                                                  0x7,
45426                                                              (instr >> 24) &
45427                                                                  0x1);
45428                                         if (dt.Is(kDataTypeValueInvalid)) {
45429                                           UnallocatedA32(instr);
45430                                           return;
45431                                         }
45432                                         if (((instr >> 12) & 1) != 0) {
45433                                           UnallocatedA32(instr);
45434                                           return;
45435                                         }
45436                                         unsigned rd =
45437                                             ExtractQRegister(instr, 22, 12);
45438                                         unsigned rm =
45439                                             ExtractDRegister(instr, 5, 0);
45440                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45441                                         uint32_t imm = imm6 - dt.GetSize();
45442                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45443                                         vshll(al,
45444                                               dt,
45445                                               QRegister(rd),
45446                                               DRegister(rm),
45447                                               imm);
45448                                         break;
45449                                       }
45450                                       case 0x000d0000: {
45451                                         // 0xf28d0a10
45452                                         if (((instr & 0x380000) == 0x0) ||
45453                                             ((instr & 0x3f0000) == 0x80000) ||
45454                                             ((instr & 0x3f0000) == 0x100000) ||
45455                                             ((instr & 0x3f0000) == 0x200000)) {
45456                                           UnallocatedA32(instr);
45457                                           return;
45458                                         }
45459                                         DataType dt =
45460                                             Dt_imm6_4_Decode((instr >> 19) &
45461                                                                  0x7,
45462                                                              (instr >> 24) &
45463                                                                  0x1);
45464                                         if (dt.Is(kDataTypeValueInvalid)) {
45465                                           UnallocatedA32(instr);
45466                                           return;
45467                                         }
45468                                         if (((instr >> 12) & 1) != 0) {
45469                                           UnallocatedA32(instr);
45470                                           return;
45471                                         }
45472                                         unsigned rd =
45473                                             ExtractQRegister(instr, 22, 12);
45474                                         unsigned rm =
45475                                             ExtractDRegister(instr, 5, 0);
45476                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45477                                         uint32_t imm = imm6 - dt.GetSize();
45478                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45479                                         vshll(al,
45480                                               dt,
45481                                               QRegister(rd),
45482                                               DRegister(rm),
45483                                               imm);
45484                                         break;
45485                                       }
45486                                       case 0x000e0000: {
45487                                         // 0xf28e0a10
45488                                         if (((instr & 0x380000) == 0x0) ||
45489                                             ((instr & 0x3f0000) == 0x80000) ||
45490                                             ((instr & 0x3f0000) == 0x100000) ||
45491                                             ((instr & 0x3f0000) == 0x200000)) {
45492                                           UnallocatedA32(instr);
45493                                           return;
45494                                         }
45495                                         DataType dt =
45496                                             Dt_imm6_4_Decode((instr >> 19) &
45497                                                                  0x7,
45498                                                              (instr >> 24) &
45499                                                                  0x1);
45500                                         if (dt.Is(kDataTypeValueInvalid)) {
45501                                           UnallocatedA32(instr);
45502                                           return;
45503                                         }
45504                                         if (((instr >> 12) & 1) != 0) {
45505                                           UnallocatedA32(instr);
45506                                           return;
45507                                         }
45508                                         unsigned rd =
45509                                             ExtractQRegister(instr, 22, 12);
45510                                         unsigned rm =
45511                                             ExtractDRegister(instr, 5, 0);
45512                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45513                                         uint32_t imm = imm6 - dt.GetSize();
45514                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45515                                         vshll(al,
45516                                               dt,
45517                                               QRegister(rd),
45518                                               DRegister(rm),
45519                                               imm);
45520                                         break;
45521                                       }
45522                                       case 0x000f0000: {
45523                                         // 0xf28f0a10
45524                                         if (((instr & 0x380000) == 0x0) ||
45525                                             ((instr & 0x3f0000) == 0x80000) ||
45526                                             ((instr & 0x3f0000) == 0x100000) ||
45527                                             ((instr & 0x3f0000) == 0x200000)) {
45528                                           UnallocatedA32(instr);
45529                                           return;
45530                                         }
45531                                         DataType dt =
45532                                             Dt_imm6_4_Decode((instr >> 19) &
45533                                                                  0x7,
45534                                                              (instr >> 24) &
45535                                                                  0x1);
45536                                         if (dt.Is(kDataTypeValueInvalid)) {
45537                                           UnallocatedA32(instr);
45538                                           return;
45539                                         }
45540                                         if (((instr >> 12) & 1) != 0) {
45541                                           UnallocatedA32(instr);
45542                                           return;
45543                                         }
45544                                         unsigned rd =
45545                                             ExtractQRegister(instr, 22, 12);
45546                                         unsigned rm =
45547                                             ExtractDRegister(instr, 5, 0);
45548                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45549                                         uint32_t imm = imm6 - dt.GetSize();
45550                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45551                                         vshll(al,
45552                                               dt,
45553                                               QRegister(rd),
45554                                               DRegister(rm),
45555                                               imm);
45556                                         break;
45557                                       }
45558                                       case 0x00100000: {
45559                                         // 0xf2900a10
45560                                         if (((instr & 0x380000) == 0x0) ||
45561                                             ((instr & 0x380000) == 0x180000) ||
45562                                             ((instr & 0x380000) == 0x280000) ||
45563                                             ((instr & 0x380000) == 0x300000) ||
45564                                             ((instr & 0x380000) == 0x380000)) {
45565                                           UnallocatedA32(instr);
45566                                           return;
45567                                         }
45568                                         DataType dt = Dt_U_imm3H_1_Decode(
45569                                             ((instr >> 19) & 0x7) |
45570                                             ((instr >> 21) & 0x8));
45571                                         if (dt.Is(kDataTypeValueInvalid)) {
45572                                           UnallocatedA32(instr);
45573                                           return;
45574                                         }
45575                                         if (((instr >> 12) & 1) != 0) {
45576                                           UnallocatedA32(instr);
45577                                           return;
45578                                         }
45579                                         unsigned rd =
45580                                             ExtractQRegister(instr, 22, 12);
45581                                         unsigned rm =
45582                                             ExtractDRegister(instr, 5, 0);
45583                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
45584                                         vmovl(al,
45585                                               dt,
45586                                               QRegister(rd),
45587                                               DRegister(rm));
45588                                         break;
45589                                       }
45590                                       case 0x00110000: {
45591                                         // 0xf2910a10
45592                                         if (((instr & 0x380000) == 0x0) ||
45593                                             ((instr & 0x3f0000) == 0x80000) ||
45594                                             ((instr & 0x3f0000) == 0x100000) ||
45595                                             ((instr & 0x3f0000) == 0x200000)) {
45596                                           UnallocatedA32(instr);
45597                                           return;
45598                                         }
45599                                         DataType dt =
45600                                             Dt_imm6_4_Decode((instr >> 19) &
45601                                                                  0x7,
45602                                                              (instr >> 24) &
45603                                                                  0x1);
45604                                         if (dt.Is(kDataTypeValueInvalid)) {
45605                                           UnallocatedA32(instr);
45606                                           return;
45607                                         }
45608                                         if (((instr >> 12) & 1) != 0) {
45609                                           UnallocatedA32(instr);
45610                                           return;
45611                                         }
45612                                         unsigned rd =
45613                                             ExtractQRegister(instr, 22, 12);
45614                                         unsigned rm =
45615                                             ExtractDRegister(instr, 5, 0);
45616                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45617                                         uint32_t imm = imm6 - dt.GetSize();
45618                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45619                                         vshll(al,
45620                                               dt,
45621                                               QRegister(rd),
45622                                               DRegister(rm),
45623                                               imm);
45624                                         break;
45625                                       }
45626                                       case 0x00120000: {
45627                                         // 0xf2920a10
45628                                         if (((instr & 0x380000) == 0x0) ||
45629                                             ((instr & 0x3f0000) == 0x80000) ||
45630                                             ((instr & 0x3f0000) == 0x100000) ||
45631                                             ((instr & 0x3f0000) == 0x200000)) {
45632                                           UnallocatedA32(instr);
45633                                           return;
45634                                         }
45635                                         DataType dt =
45636                                             Dt_imm6_4_Decode((instr >> 19) &
45637                                                                  0x7,
45638                                                              (instr >> 24) &
45639                                                                  0x1);
45640                                         if (dt.Is(kDataTypeValueInvalid)) {
45641                                           UnallocatedA32(instr);
45642                                           return;
45643                                         }
45644                                         if (((instr >> 12) & 1) != 0) {
45645                                           UnallocatedA32(instr);
45646                                           return;
45647                                         }
45648                                         unsigned rd =
45649                                             ExtractQRegister(instr, 22, 12);
45650                                         unsigned rm =
45651                                             ExtractDRegister(instr, 5, 0);
45652                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45653                                         uint32_t imm = imm6 - dt.GetSize();
45654                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45655                                         vshll(al,
45656                                               dt,
45657                                               QRegister(rd),
45658                                               DRegister(rm),
45659                                               imm);
45660                                         break;
45661                                       }
45662                                       case 0x00130000: {
45663                                         // 0xf2930a10
45664                                         if (((instr & 0x380000) == 0x0) ||
45665                                             ((instr & 0x3f0000) == 0x80000) ||
45666                                             ((instr & 0x3f0000) == 0x100000) ||
45667                                             ((instr & 0x3f0000) == 0x200000)) {
45668                                           UnallocatedA32(instr);
45669                                           return;
45670                                         }
45671                                         DataType dt =
45672                                             Dt_imm6_4_Decode((instr >> 19) &
45673                                                                  0x7,
45674                                                              (instr >> 24) &
45675                                                                  0x1);
45676                                         if (dt.Is(kDataTypeValueInvalid)) {
45677                                           UnallocatedA32(instr);
45678                                           return;
45679                                         }
45680                                         if (((instr >> 12) & 1) != 0) {
45681                                           UnallocatedA32(instr);
45682                                           return;
45683                                         }
45684                                         unsigned rd =
45685                                             ExtractQRegister(instr, 22, 12);
45686                                         unsigned rm =
45687                                             ExtractDRegister(instr, 5, 0);
45688                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45689                                         uint32_t imm = imm6 - dt.GetSize();
45690                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45691                                         vshll(al,
45692                                               dt,
45693                                               QRegister(rd),
45694                                               DRegister(rm),
45695                                               imm);
45696                                         break;
45697                                       }
45698                                       case 0x00140000: {
45699                                         // 0xf2940a10
45700                                         if (((instr & 0x380000) == 0x0) ||
45701                                             ((instr & 0x3f0000) == 0x80000) ||
45702                                             ((instr & 0x3f0000) == 0x100000) ||
45703                                             ((instr & 0x3f0000) == 0x200000)) {
45704                                           UnallocatedA32(instr);
45705                                           return;
45706                                         }
45707                                         DataType dt =
45708                                             Dt_imm6_4_Decode((instr >> 19) &
45709                                                                  0x7,
45710                                                              (instr >> 24) &
45711                                                                  0x1);
45712                                         if (dt.Is(kDataTypeValueInvalid)) {
45713                                           UnallocatedA32(instr);
45714                                           return;
45715                                         }
45716                                         if (((instr >> 12) & 1) != 0) {
45717                                           UnallocatedA32(instr);
45718                                           return;
45719                                         }
45720                                         unsigned rd =
45721                                             ExtractQRegister(instr, 22, 12);
45722                                         unsigned rm =
45723                                             ExtractDRegister(instr, 5, 0);
45724                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45725                                         uint32_t imm = imm6 - dt.GetSize();
45726                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45727                                         vshll(al,
45728                                               dt,
45729                                               QRegister(rd),
45730                                               DRegister(rm),
45731                                               imm);
45732                                         break;
45733                                       }
45734                                       case 0x00150000: {
45735                                         // 0xf2950a10
45736                                         if (((instr & 0x380000) == 0x0) ||
45737                                             ((instr & 0x3f0000) == 0x80000) ||
45738                                             ((instr & 0x3f0000) == 0x100000) ||
45739                                             ((instr & 0x3f0000) == 0x200000)) {
45740                                           UnallocatedA32(instr);
45741                                           return;
45742                                         }
45743                                         DataType dt =
45744                                             Dt_imm6_4_Decode((instr >> 19) &
45745                                                                  0x7,
45746                                                              (instr >> 24) &
45747                                                                  0x1);
45748                                         if (dt.Is(kDataTypeValueInvalid)) {
45749                                           UnallocatedA32(instr);
45750                                           return;
45751                                         }
45752                                         if (((instr >> 12) & 1) != 0) {
45753                                           UnallocatedA32(instr);
45754                                           return;
45755                                         }
45756                                         unsigned rd =
45757                                             ExtractQRegister(instr, 22, 12);
45758                                         unsigned rm =
45759                                             ExtractDRegister(instr, 5, 0);
45760                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45761                                         uint32_t imm = imm6 - dt.GetSize();
45762                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45763                                         vshll(al,
45764                                               dt,
45765                                               QRegister(rd),
45766                                               DRegister(rm),
45767                                               imm);
45768                                         break;
45769                                       }
45770                                       case 0x00160000: {
45771                                         // 0xf2960a10
45772                                         if (((instr & 0x380000) == 0x0) ||
45773                                             ((instr & 0x3f0000) == 0x80000) ||
45774                                             ((instr & 0x3f0000) == 0x100000) ||
45775                                             ((instr & 0x3f0000) == 0x200000)) {
45776                                           UnallocatedA32(instr);
45777                                           return;
45778                                         }
45779                                         DataType dt =
45780                                             Dt_imm6_4_Decode((instr >> 19) &
45781                                                                  0x7,
45782                                                              (instr >> 24) &
45783                                                                  0x1);
45784                                         if (dt.Is(kDataTypeValueInvalid)) {
45785                                           UnallocatedA32(instr);
45786                                           return;
45787                                         }
45788                                         if (((instr >> 12) & 1) != 0) {
45789                                           UnallocatedA32(instr);
45790                                           return;
45791                                         }
45792                                         unsigned rd =
45793                                             ExtractQRegister(instr, 22, 12);
45794                                         unsigned rm =
45795                                             ExtractDRegister(instr, 5, 0);
45796                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45797                                         uint32_t imm = imm6 - dt.GetSize();
45798                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45799                                         vshll(al,
45800                                               dt,
45801                                               QRegister(rd),
45802                                               DRegister(rm),
45803                                               imm);
45804                                         break;
45805                                       }
45806                                       case 0x00170000: {
45807                                         // 0xf2970a10
45808                                         if (((instr & 0x380000) == 0x0) ||
45809                                             ((instr & 0x3f0000) == 0x80000) ||
45810                                             ((instr & 0x3f0000) == 0x100000) ||
45811                                             ((instr & 0x3f0000) == 0x200000)) {
45812                                           UnallocatedA32(instr);
45813                                           return;
45814                                         }
45815                                         DataType dt =
45816                                             Dt_imm6_4_Decode((instr >> 19) &
45817                                                                  0x7,
45818                                                              (instr >> 24) &
45819                                                                  0x1);
45820                                         if (dt.Is(kDataTypeValueInvalid)) {
45821                                           UnallocatedA32(instr);
45822                                           return;
45823                                         }
45824                                         if (((instr >> 12) & 1) != 0) {
45825                                           UnallocatedA32(instr);
45826                                           return;
45827                                         }
45828                                         unsigned rd =
45829                                             ExtractQRegister(instr, 22, 12);
45830                                         unsigned rm =
45831                                             ExtractDRegister(instr, 5, 0);
45832                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45833                                         uint32_t imm = imm6 - dt.GetSize();
45834                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45835                                         vshll(al,
45836                                               dt,
45837                                               QRegister(rd),
45838                                               DRegister(rm),
45839                                               imm);
45840                                         break;
45841                                       }
45842                                       case 0x00180000: {
45843                                         // 0xf2980a10
45844                                         if (((instr & 0x380000) == 0x0) ||
45845                                             ((instr & 0x3f0000) == 0x80000) ||
45846                                             ((instr & 0x3f0000) == 0x100000) ||
45847                                             ((instr & 0x3f0000) == 0x200000)) {
45848                                           UnallocatedA32(instr);
45849                                           return;
45850                                         }
45851                                         DataType dt =
45852                                             Dt_imm6_4_Decode((instr >> 19) &
45853                                                                  0x7,
45854                                                              (instr >> 24) &
45855                                                                  0x1);
45856                                         if (dt.Is(kDataTypeValueInvalid)) {
45857                                           UnallocatedA32(instr);
45858                                           return;
45859                                         }
45860                                         if (((instr >> 12) & 1) != 0) {
45861                                           UnallocatedA32(instr);
45862                                           return;
45863                                         }
45864                                         unsigned rd =
45865                                             ExtractQRegister(instr, 22, 12);
45866                                         unsigned rm =
45867                                             ExtractDRegister(instr, 5, 0);
45868                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45869                                         uint32_t imm = imm6 - dt.GetSize();
45870                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45871                                         vshll(al,
45872                                               dt,
45873                                               QRegister(rd),
45874                                               DRegister(rm),
45875                                               imm);
45876                                         break;
45877                                       }
45878                                       case 0x00190000: {
45879                                         // 0xf2990a10
45880                                         if (((instr & 0x380000) == 0x0) ||
45881                                             ((instr & 0x3f0000) == 0x80000) ||
45882                                             ((instr & 0x3f0000) == 0x100000) ||
45883                                             ((instr & 0x3f0000) == 0x200000)) {
45884                                           UnallocatedA32(instr);
45885                                           return;
45886                                         }
45887                                         DataType dt =
45888                                             Dt_imm6_4_Decode((instr >> 19) &
45889                                                                  0x7,
45890                                                              (instr >> 24) &
45891                                                                  0x1);
45892                                         if (dt.Is(kDataTypeValueInvalid)) {
45893                                           UnallocatedA32(instr);
45894                                           return;
45895                                         }
45896                                         if (((instr >> 12) & 1) != 0) {
45897                                           UnallocatedA32(instr);
45898                                           return;
45899                                         }
45900                                         unsigned rd =
45901                                             ExtractQRegister(instr, 22, 12);
45902                                         unsigned rm =
45903                                             ExtractDRegister(instr, 5, 0);
45904                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45905                                         uint32_t imm = imm6 - dt.GetSize();
45906                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45907                                         vshll(al,
45908                                               dt,
45909                                               QRegister(rd),
45910                                               DRegister(rm),
45911                                               imm);
45912                                         break;
45913                                       }
45914                                       case 0x001a0000: {
45915                                         // 0xf29a0a10
45916                                         if (((instr & 0x380000) == 0x0) ||
45917                                             ((instr & 0x3f0000) == 0x80000) ||
45918                                             ((instr & 0x3f0000) == 0x100000) ||
45919                                             ((instr & 0x3f0000) == 0x200000)) {
45920                                           UnallocatedA32(instr);
45921                                           return;
45922                                         }
45923                                         DataType dt =
45924                                             Dt_imm6_4_Decode((instr >> 19) &
45925                                                                  0x7,
45926                                                              (instr >> 24) &
45927                                                                  0x1);
45928                                         if (dt.Is(kDataTypeValueInvalid)) {
45929                                           UnallocatedA32(instr);
45930                                           return;
45931                                         }
45932                                         if (((instr >> 12) & 1) != 0) {
45933                                           UnallocatedA32(instr);
45934                                           return;
45935                                         }
45936                                         unsigned rd =
45937                                             ExtractQRegister(instr, 22, 12);
45938                                         unsigned rm =
45939                                             ExtractDRegister(instr, 5, 0);
45940                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45941                                         uint32_t imm = imm6 - dt.GetSize();
45942                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45943                                         vshll(al,
45944                                               dt,
45945                                               QRegister(rd),
45946                                               DRegister(rm),
45947                                               imm);
45948                                         break;
45949                                       }
45950                                       case 0x001b0000: {
45951                                         // 0xf29b0a10
45952                                         if (((instr & 0x380000) == 0x0) ||
45953                                             ((instr & 0x3f0000) == 0x80000) ||
45954                                             ((instr & 0x3f0000) == 0x100000) ||
45955                                             ((instr & 0x3f0000) == 0x200000)) {
45956                                           UnallocatedA32(instr);
45957                                           return;
45958                                         }
45959                                         DataType dt =
45960                                             Dt_imm6_4_Decode((instr >> 19) &
45961                                                                  0x7,
45962                                                              (instr >> 24) &
45963                                                                  0x1);
45964                                         if (dt.Is(kDataTypeValueInvalid)) {
45965                                           UnallocatedA32(instr);
45966                                           return;
45967                                         }
45968                                         if (((instr >> 12) & 1) != 0) {
45969                                           UnallocatedA32(instr);
45970                                           return;
45971                                         }
45972                                         unsigned rd =
45973                                             ExtractQRegister(instr, 22, 12);
45974                                         unsigned rm =
45975                                             ExtractDRegister(instr, 5, 0);
45976                                         uint32_t imm6 = (instr >> 16) & 0x3f;
45977                                         uint32_t imm = imm6 - dt.GetSize();
45978                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
45979                                         vshll(al,
45980                                               dt,
45981                                               QRegister(rd),
45982                                               DRegister(rm),
45983                                               imm);
45984                                         break;
45985                                       }
45986                                       case 0x001c0000: {
45987                                         // 0xf29c0a10
45988                                         if (((instr & 0x380000) == 0x0) ||
45989                                             ((instr & 0x3f0000) == 0x80000) ||
45990                                             ((instr & 0x3f0000) == 0x100000) ||
45991                                             ((instr & 0x3f0000) == 0x200000)) {
45992                                           UnallocatedA32(instr);
45993                                           return;
45994                                         }
45995                                         DataType dt =
45996                                             Dt_imm6_4_Decode((instr >> 19) &
45997                                                                  0x7,
45998                                                              (instr >> 24) &
45999                                                                  0x1);
46000                                         if (dt.Is(kDataTypeValueInvalid)) {
46001                                           UnallocatedA32(instr);
46002                                           return;
46003                                         }
46004                                         if (((instr >> 12) & 1) != 0) {
46005                                           UnallocatedA32(instr);
46006                                           return;
46007                                         }
46008                                         unsigned rd =
46009                                             ExtractQRegister(instr, 22, 12);
46010                                         unsigned rm =
46011                                             ExtractDRegister(instr, 5, 0);
46012                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46013                                         uint32_t imm = imm6 - dt.GetSize();
46014                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46015                                         vshll(al,
46016                                               dt,
46017                                               QRegister(rd),
46018                                               DRegister(rm),
46019                                               imm);
46020                                         break;
46021                                       }
46022                                       case 0x001d0000: {
46023                                         // 0xf29d0a10
46024                                         if (((instr & 0x380000) == 0x0) ||
46025                                             ((instr & 0x3f0000) == 0x80000) ||
46026                                             ((instr & 0x3f0000) == 0x100000) ||
46027                                             ((instr & 0x3f0000) == 0x200000)) {
46028                                           UnallocatedA32(instr);
46029                                           return;
46030                                         }
46031                                         DataType dt =
46032                                             Dt_imm6_4_Decode((instr >> 19) &
46033                                                                  0x7,
46034                                                              (instr >> 24) &
46035                                                                  0x1);
46036                                         if (dt.Is(kDataTypeValueInvalid)) {
46037                                           UnallocatedA32(instr);
46038                                           return;
46039                                         }
46040                                         if (((instr >> 12) & 1) != 0) {
46041                                           UnallocatedA32(instr);
46042                                           return;
46043                                         }
46044                                         unsigned rd =
46045                                             ExtractQRegister(instr, 22, 12);
46046                                         unsigned rm =
46047                                             ExtractDRegister(instr, 5, 0);
46048                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46049                                         uint32_t imm = imm6 - dt.GetSize();
46050                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46051                                         vshll(al,
46052                                               dt,
46053                                               QRegister(rd),
46054                                               DRegister(rm),
46055                                               imm);
46056                                         break;
46057                                       }
46058                                       case 0x001e0000: {
46059                                         // 0xf29e0a10
46060                                         if (((instr & 0x380000) == 0x0) ||
46061                                             ((instr & 0x3f0000) == 0x80000) ||
46062                                             ((instr & 0x3f0000) == 0x100000) ||
46063                                             ((instr & 0x3f0000) == 0x200000)) {
46064                                           UnallocatedA32(instr);
46065                                           return;
46066                                         }
46067                                         DataType dt =
46068                                             Dt_imm6_4_Decode((instr >> 19) &
46069                                                                  0x7,
46070                                                              (instr >> 24) &
46071                                                                  0x1);
46072                                         if (dt.Is(kDataTypeValueInvalid)) {
46073                                           UnallocatedA32(instr);
46074                                           return;
46075                                         }
46076                                         if (((instr >> 12) & 1) != 0) {
46077                                           UnallocatedA32(instr);
46078                                           return;
46079                                         }
46080                                         unsigned rd =
46081                                             ExtractQRegister(instr, 22, 12);
46082                                         unsigned rm =
46083                                             ExtractDRegister(instr, 5, 0);
46084                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46085                                         uint32_t imm = imm6 - dt.GetSize();
46086                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46087                                         vshll(al,
46088                                               dt,
46089                                               QRegister(rd),
46090                                               DRegister(rm),
46091                                               imm);
46092                                         break;
46093                                       }
46094                                       case 0x001f0000: {
46095                                         // 0xf29f0a10
46096                                         if (((instr & 0x380000) == 0x0) ||
46097                                             ((instr & 0x3f0000) == 0x80000) ||
46098                                             ((instr & 0x3f0000) == 0x100000) ||
46099                                             ((instr & 0x3f0000) == 0x200000)) {
46100                                           UnallocatedA32(instr);
46101                                           return;
46102                                         }
46103                                         DataType dt =
46104                                             Dt_imm6_4_Decode((instr >> 19) &
46105                                                                  0x7,
46106                                                              (instr >> 24) &
46107                                                                  0x1);
46108                                         if (dt.Is(kDataTypeValueInvalid)) {
46109                                           UnallocatedA32(instr);
46110                                           return;
46111                                         }
46112                                         if (((instr >> 12) & 1) != 0) {
46113                                           UnallocatedA32(instr);
46114                                           return;
46115                                         }
46116                                         unsigned rd =
46117                                             ExtractQRegister(instr, 22, 12);
46118                                         unsigned rm =
46119                                             ExtractDRegister(instr, 5, 0);
46120                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46121                                         uint32_t imm = imm6 - dt.GetSize();
46122                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46123                                         vshll(al,
46124                                               dt,
46125                                               QRegister(rd),
46126                                               DRegister(rm),
46127                                               imm);
46128                                         break;
46129                                       }
46130                                       case 0x00200000: {
46131                                         // 0xf2a00a10
46132                                         if (((instr & 0x380000) == 0x0) ||
46133                                             ((instr & 0x380000) == 0x180000) ||
46134                                             ((instr & 0x380000) == 0x280000) ||
46135                                             ((instr & 0x380000) == 0x300000) ||
46136                                             ((instr & 0x380000) == 0x380000)) {
46137                                           UnallocatedA32(instr);
46138                                           return;
46139                                         }
46140                                         DataType dt = Dt_U_imm3H_1_Decode(
46141                                             ((instr >> 19) & 0x7) |
46142                                             ((instr >> 21) & 0x8));
46143                                         if (dt.Is(kDataTypeValueInvalid)) {
46144                                           UnallocatedA32(instr);
46145                                           return;
46146                                         }
46147                                         if (((instr >> 12) & 1) != 0) {
46148                                           UnallocatedA32(instr);
46149                                           return;
46150                                         }
46151                                         unsigned rd =
46152                                             ExtractQRegister(instr, 22, 12);
46153                                         unsigned rm =
46154                                             ExtractDRegister(instr, 5, 0);
46155                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
46156                                         vmovl(al,
46157                                               dt,
46158                                               QRegister(rd),
46159                                               DRegister(rm));
46160                                         break;
46161                                       }
46162                                       case 0x00210000: {
46163                                         // 0xf2a10a10
46164                                         if (((instr & 0x380000) == 0x0) ||
46165                                             ((instr & 0x3f0000) == 0x80000) ||
46166                                             ((instr & 0x3f0000) == 0x100000) ||
46167                                             ((instr & 0x3f0000) == 0x200000)) {
46168                                           UnallocatedA32(instr);
46169                                           return;
46170                                         }
46171                                         DataType dt =
46172                                             Dt_imm6_4_Decode((instr >> 19) &
46173                                                                  0x7,
46174                                                              (instr >> 24) &
46175                                                                  0x1);
46176                                         if (dt.Is(kDataTypeValueInvalid)) {
46177                                           UnallocatedA32(instr);
46178                                           return;
46179                                         }
46180                                         if (((instr >> 12) & 1) != 0) {
46181                                           UnallocatedA32(instr);
46182                                           return;
46183                                         }
46184                                         unsigned rd =
46185                                             ExtractQRegister(instr, 22, 12);
46186                                         unsigned rm =
46187                                             ExtractDRegister(instr, 5, 0);
46188                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46189                                         uint32_t imm = imm6 - dt.GetSize();
46190                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46191                                         vshll(al,
46192                                               dt,
46193                                               QRegister(rd),
46194                                               DRegister(rm),
46195                                               imm);
46196                                         break;
46197                                       }
46198                                       case 0x00220000: {
46199                                         // 0xf2a20a10
46200                                         if (((instr & 0x380000) == 0x0) ||
46201                                             ((instr & 0x3f0000) == 0x80000) ||
46202                                             ((instr & 0x3f0000) == 0x100000) ||
46203                                             ((instr & 0x3f0000) == 0x200000)) {
46204                                           UnallocatedA32(instr);
46205                                           return;
46206                                         }
46207                                         DataType dt =
46208                                             Dt_imm6_4_Decode((instr >> 19) &
46209                                                                  0x7,
46210                                                              (instr >> 24) &
46211                                                                  0x1);
46212                                         if (dt.Is(kDataTypeValueInvalid)) {
46213                                           UnallocatedA32(instr);
46214                                           return;
46215                                         }
46216                                         if (((instr >> 12) & 1) != 0) {
46217                                           UnallocatedA32(instr);
46218                                           return;
46219                                         }
46220                                         unsigned rd =
46221                                             ExtractQRegister(instr, 22, 12);
46222                                         unsigned rm =
46223                                             ExtractDRegister(instr, 5, 0);
46224                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46225                                         uint32_t imm = imm6 - dt.GetSize();
46226                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46227                                         vshll(al,
46228                                               dt,
46229                                               QRegister(rd),
46230                                               DRegister(rm),
46231                                               imm);
46232                                         break;
46233                                       }
46234                                       case 0x00230000: {
46235                                         // 0xf2a30a10
46236                                         if (((instr & 0x380000) == 0x0) ||
46237                                             ((instr & 0x3f0000) == 0x80000) ||
46238                                             ((instr & 0x3f0000) == 0x100000) ||
46239                                             ((instr & 0x3f0000) == 0x200000)) {
46240                                           UnallocatedA32(instr);
46241                                           return;
46242                                         }
46243                                         DataType dt =
46244                                             Dt_imm6_4_Decode((instr >> 19) &
46245                                                                  0x7,
46246                                                              (instr >> 24) &
46247                                                                  0x1);
46248                                         if (dt.Is(kDataTypeValueInvalid)) {
46249                                           UnallocatedA32(instr);
46250                                           return;
46251                                         }
46252                                         if (((instr >> 12) & 1) != 0) {
46253                                           UnallocatedA32(instr);
46254                                           return;
46255                                         }
46256                                         unsigned rd =
46257                                             ExtractQRegister(instr, 22, 12);
46258                                         unsigned rm =
46259                                             ExtractDRegister(instr, 5, 0);
46260                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46261                                         uint32_t imm = imm6 - dt.GetSize();
46262                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46263                                         vshll(al,
46264                                               dt,
46265                                               QRegister(rd),
46266                                               DRegister(rm),
46267                                               imm);
46268                                         break;
46269                                       }
46270                                       case 0x00240000: {
46271                                         // 0xf2a40a10
46272                                         if (((instr & 0x380000) == 0x0) ||
46273                                             ((instr & 0x3f0000) == 0x80000) ||
46274                                             ((instr & 0x3f0000) == 0x100000) ||
46275                                             ((instr & 0x3f0000) == 0x200000)) {
46276                                           UnallocatedA32(instr);
46277                                           return;
46278                                         }
46279                                         DataType dt =
46280                                             Dt_imm6_4_Decode((instr >> 19) &
46281                                                                  0x7,
46282                                                              (instr >> 24) &
46283                                                                  0x1);
46284                                         if (dt.Is(kDataTypeValueInvalid)) {
46285                                           UnallocatedA32(instr);
46286                                           return;
46287                                         }
46288                                         if (((instr >> 12) & 1) != 0) {
46289                                           UnallocatedA32(instr);
46290                                           return;
46291                                         }
46292                                         unsigned rd =
46293                                             ExtractQRegister(instr, 22, 12);
46294                                         unsigned rm =
46295                                             ExtractDRegister(instr, 5, 0);
46296                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46297                                         uint32_t imm = imm6 - dt.GetSize();
46298                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46299                                         vshll(al,
46300                                               dt,
46301                                               QRegister(rd),
46302                                               DRegister(rm),
46303                                               imm);
46304                                         break;
46305                                       }
46306                                       case 0x00250000: {
46307                                         // 0xf2a50a10
46308                                         if (((instr & 0x380000) == 0x0) ||
46309                                             ((instr & 0x3f0000) == 0x80000) ||
46310                                             ((instr & 0x3f0000) == 0x100000) ||
46311                                             ((instr & 0x3f0000) == 0x200000)) {
46312                                           UnallocatedA32(instr);
46313                                           return;
46314                                         }
46315                                         DataType dt =
46316                                             Dt_imm6_4_Decode((instr >> 19) &
46317                                                                  0x7,
46318                                                              (instr >> 24) &
46319                                                                  0x1);
46320                                         if (dt.Is(kDataTypeValueInvalid)) {
46321                                           UnallocatedA32(instr);
46322                                           return;
46323                                         }
46324                                         if (((instr >> 12) & 1) != 0) {
46325                                           UnallocatedA32(instr);
46326                                           return;
46327                                         }
46328                                         unsigned rd =
46329                                             ExtractQRegister(instr, 22, 12);
46330                                         unsigned rm =
46331                                             ExtractDRegister(instr, 5, 0);
46332                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46333                                         uint32_t imm = imm6 - dt.GetSize();
46334                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46335                                         vshll(al,
46336                                               dt,
46337                                               QRegister(rd),
46338                                               DRegister(rm),
46339                                               imm);
46340                                         break;
46341                                       }
46342                                       case 0x00260000: {
46343                                         // 0xf2a60a10
46344                                         if (((instr & 0x380000) == 0x0) ||
46345                                             ((instr & 0x3f0000) == 0x80000) ||
46346                                             ((instr & 0x3f0000) == 0x100000) ||
46347                                             ((instr & 0x3f0000) == 0x200000)) {
46348                                           UnallocatedA32(instr);
46349                                           return;
46350                                         }
46351                                         DataType dt =
46352                                             Dt_imm6_4_Decode((instr >> 19) &
46353                                                                  0x7,
46354                                                              (instr >> 24) &
46355                                                                  0x1);
46356                                         if (dt.Is(kDataTypeValueInvalid)) {
46357                                           UnallocatedA32(instr);
46358                                           return;
46359                                         }
46360                                         if (((instr >> 12) & 1) != 0) {
46361                                           UnallocatedA32(instr);
46362                                           return;
46363                                         }
46364                                         unsigned rd =
46365                                             ExtractQRegister(instr, 22, 12);
46366                                         unsigned rm =
46367                                             ExtractDRegister(instr, 5, 0);
46368                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46369                                         uint32_t imm = imm6 - dt.GetSize();
46370                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46371                                         vshll(al,
46372                                               dt,
46373                                               QRegister(rd),
46374                                               DRegister(rm),
46375                                               imm);
46376                                         break;
46377                                       }
46378                                       case 0x00270000: {
46379                                         // 0xf2a70a10
46380                                         if (((instr & 0x380000) == 0x0) ||
46381                                             ((instr & 0x3f0000) == 0x80000) ||
46382                                             ((instr & 0x3f0000) == 0x100000) ||
46383                                             ((instr & 0x3f0000) == 0x200000)) {
46384                                           UnallocatedA32(instr);
46385                                           return;
46386                                         }
46387                                         DataType dt =
46388                                             Dt_imm6_4_Decode((instr >> 19) &
46389                                                                  0x7,
46390                                                              (instr >> 24) &
46391                                                                  0x1);
46392                                         if (dt.Is(kDataTypeValueInvalid)) {
46393                                           UnallocatedA32(instr);
46394                                           return;
46395                                         }
46396                                         if (((instr >> 12) & 1) != 0) {
46397                                           UnallocatedA32(instr);
46398                                           return;
46399                                         }
46400                                         unsigned rd =
46401                                             ExtractQRegister(instr, 22, 12);
46402                                         unsigned rm =
46403                                             ExtractDRegister(instr, 5, 0);
46404                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46405                                         uint32_t imm = imm6 - dt.GetSize();
46406                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46407                                         vshll(al,
46408                                               dt,
46409                                               QRegister(rd),
46410                                               DRegister(rm),
46411                                               imm);
46412                                         break;
46413                                       }
46414                                       case 0x00280000: {
46415                                         // 0xf2a80a10
46416                                         if (((instr & 0x380000) == 0x0) ||
46417                                             ((instr & 0x3f0000) == 0x80000) ||
46418                                             ((instr & 0x3f0000) == 0x100000) ||
46419                                             ((instr & 0x3f0000) == 0x200000)) {
46420                                           UnallocatedA32(instr);
46421                                           return;
46422                                         }
46423                                         DataType dt =
46424                                             Dt_imm6_4_Decode((instr >> 19) &
46425                                                                  0x7,
46426                                                              (instr >> 24) &
46427                                                                  0x1);
46428                                         if (dt.Is(kDataTypeValueInvalid)) {
46429                                           UnallocatedA32(instr);
46430                                           return;
46431                                         }
46432                                         if (((instr >> 12) & 1) != 0) {
46433                                           UnallocatedA32(instr);
46434                                           return;
46435                                         }
46436                                         unsigned rd =
46437                                             ExtractQRegister(instr, 22, 12);
46438                                         unsigned rm =
46439                                             ExtractDRegister(instr, 5, 0);
46440                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46441                                         uint32_t imm = imm6 - dt.GetSize();
46442                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46443                                         vshll(al,
46444                                               dt,
46445                                               QRegister(rd),
46446                                               DRegister(rm),
46447                                               imm);
46448                                         break;
46449                                       }
46450                                       case 0x00290000: {
46451                                         // 0xf2a90a10
46452                                         if (((instr & 0x380000) == 0x0) ||
46453                                             ((instr & 0x3f0000) == 0x80000) ||
46454                                             ((instr & 0x3f0000) == 0x100000) ||
46455                                             ((instr & 0x3f0000) == 0x200000)) {
46456                                           UnallocatedA32(instr);
46457                                           return;
46458                                         }
46459                                         DataType dt =
46460                                             Dt_imm6_4_Decode((instr >> 19) &
46461                                                                  0x7,
46462                                                              (instr >> 24) &
46463                                                                  0x1);
46464                                         if (dt.Is(kDataTypeValueInvalid)) {
46465                                           UnallocatedA32(instr);
46466                                           return;
46467                                         }
46468                                         if (((instr >> 12) & 1) != 0) {
46469                                           UnallocatedA32(instr);
46470                                           return;
46471                                         }
46472                                         unsigned rd =
46473                                             ExtractQRegister(instr, 22, 12);
46474                                         unsigned rm =
46475                                             ExtractDRegister(instr, 5, 0);
46476                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46477                                         uint32_t imm = imm6 - dt.GetSize();
46478                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46479                                         vshll(al,
46480                                               dt,
46481                                               QRegister(rd),
46482                                               DRegister(rm),
46483                                               imm);
46484                                         break;
46485                                       }
46486                                       case 0x002a0000: {
46487                                         // 0xf2aa0a10
46488                                         if (((instr & 0x380000) == 0x0) ||
46489                                             ((instr & 0x3f0000) == 0x80000) ||
46490                                             ((instr & 0x3f0000) == 0x100000) ||
46491                                             ((instr & 0x3f0000) == 0x200000)) {
46492                                           UnallocatedA32(instr);
46493                                           return;
46494                                         }
46495                                         DataType dt =
46496                                             Dt_imm6_4_Decode((instr >> 19) &
46497                                                                  0x7,
46498                                                              (instr >> 24) &
46499                                                                  0x1);
46500                                         if (dt.Is(kDataTypeValueInvalid)) {
46501                                           UnallocatedA32(instr);
46502                                           return;
46503                                         }
46504                                         if (((instr >> 12) & 1) != 0) {
46505                                           UnallocatedA32(instr);
46506                                           return;
46507                                         }
46508                                         unsigned rd =
46509                                             ExtractQRegister(instr, 22, 12);
46510                                         unsigned rm =
46511                                             ExtractDRegister(instr, 5, 0);
46512                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46513                                         uint32_t imm = imm6 - dt.GetSize();
46514                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46515                                         vshll(al,
46516                                               dt,
46517                                               QRegister(rd),
46518                                               DRegister(rm),
46519                                               imm);
46520                                         break;
46521                                       }
46522                                       case 0x002b0000: {
46523                                         // 0xf2ab0a10
46524                                         if (((instr & 0x380000) == 0x0) ||
46525                                             ((instr & 0x3f0000) == 0x80000) ||
46526                                             ((instr & 0x3f0000) == 0x100000) ||
46527                                             ((instr & 0x3f0000) == 0x200000)) {
46528                                           UnallocatedA32(instr);
46529                                           return;
46530                                         }
46531                                         DataType dt =
46532                                             Dt_imm6_4_Decode((instr >> 19) &
46533                                                                  0x7,
46534                                                              (instr >> 24) &
46535                                                                  0x1);
46536                                         if (dt.Is(kDataTypeValueInvalid)) {
46537                                           UnallocatedA32(instr);
46538                                           return;
46539                                         }
46540                                         if (((instr >> 12) & 1) != 0) {
46541                                           UnallocatedA32(instr);
46542                                           return;
46543                                         }
46544                                         unsigned rd =
46545                                             ExtractQRegister(instr, 22, 12);
46546                                         unsigned rm =
46547                                             ExtractDRegister(instr, 5, 0);
46548                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46549                                         uint32_t imm = imm6 - dt.GetSize();
46550                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46551                                         vshll(al,
46552                                               dt,
46553                                               QRegister(rd),
46554                                               DRegister(rm),
46555                                               imm);
46556                                         break;
46557                                       }
46558                                       case 0x002c0000: {
46559                                         // 0xf2ac0a10
46560                                         if (((instr & 0x380000) == 0x0) ||
46561                                             ((instr & 0x3f0000) == 0x80000) ||
46562                                             ((instr & 0x3f0000) == 0x100000) ||
46563                                             ((instr & 0x3f0000) == 0x200000)) {
46564                                           UnallocatedA32(instr);
46565                                           return;
46566                                         }
46567                                         DataType dt =
46568                                             Dt_imm6_4_Decode((instr >> 19) &
46569                                                                  0x7,
46570                                                              (instr >> 24) &
46571                                                                  0x1);
46572                                         if (dt.Is(kDataTypeValueInvalid)) {
46573                                           UnallocatedA32(instr);
46574                                           return;
46575                                         }
46576                                         if (((instr >> 12) & 1) != 0) {
46577                                           UnallocatedA32(instr);
46578                                           return;
46579                                         }
46580                                         unsigned rd =
46581                                             ExtractQRegister(instr, 22, 12);
46582                                         unsigned rm =
46583                                             ExtractDRegister(instr, 5, 0);
46584                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46585                                         uint32_t imm = imm6 - dt.GetSize();
46586                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46587                                         vshll(al,
46588                                               dt,
46589                                               QRegister(rd),
46590                                               DRegister(rm),
46591                                               imm);
46592                                         break;
46593                                       }
46594                                       case 0x002d0000: {
46595                                         // 0xf2ad0a10
46596                                         if (((instr & 0x380000) == 0x0) ||
46597                                             ((instr & 0x3f0000) == 0x80000) ||
46598                                             ((instr & 0x3f0000) == 0x100000) ||
46599                                             ((instr & 0x3f0000) == 0x200000)) {
46600                                           UnallocatedA32(instr);
46601                                           return;
46602                                         }
46603                                         DataType dt =
46604                                             Dt_imm6_4_Decode((instr >> 19) &
46605                                                                  0x7,
46606                                                              (instr >> 24) &
46607                                                                  0x1);
46608                                         if (dt.Is(kDataTypeValueInvalid)) {
46609                                           UnallocatedA32(instr);
46610                                           return;
46611                                         }
46612                                         if (((instr >> 12) & 1) != 0) {
46613                                           UnallocatedA32(instr);
46614                                           return;
46615                                         }
46616                                         unsigned rd =
46617                                             ExtractQRegister(instr, 22, 12);
46618                                         unsigned rm =
46619                                             ExtractDRegister(instr, 5, 0);
46620                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46621                                         uint32_t imm = imm6 - dt.GetSize();
46622                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46623                                         vshll(al,
46624                                               dt,
46625                                               QRegister(rd),
46626                                               DRegister(rm),
46627                                               imm);
46628                                         break;
46629                                       }
46630                                       case 0x002e0000: {
46631                                         // 0xf2ae0a10
46632                                         if (((instr & 0x380000) == 0x0) ||
46633                                             ((instr & 0x3f0000) == 0x80000) ||
46634                                             ((instr & 0x3f0000) == 0x100000) ||
46635                                             ((instr & 0x3f0000) == 0x200000)) {
46636                                           UnallocatedA32(instr);
46637                                           return;
46638                                         }
46639                                         DataType dt =
46640                                             Dt_imm6_4_Decode((instr >> 19) &
46641                                                                  0x7,
46642                                                              (instr >> 24) &
46643                                                                  0x1);
46644                                         if (dt.Is(kDataTypeValueInvalid)) {
46645                                           UnallocatedA32(instr);
46646                                           return;
46647                                         }
46648                                         if (((instr >> 12) & 1) != 0) {
46649                                           UnallocatedA32(instr);
46650                                           return;
46651                                         }
46652                                         unsigned rd =
46653                                             ExtractQRegister(instr, 22, 12);
46654                                         unsigned rm =
46655                                             ExtractDRegister(instr, 5, 0);
46656                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46657                                         uint32_t imm = imm6 - dt.GetSize();
46658                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46659                                         vshll(al,
46660                                               dt,
46661                                               QRegister(rd),
46662                                               DRegister(rm),
46663                                               imm);
46664                                         break;
46665                                       }
46666                                       case 0x002f0000: {
46667                                         // 0xf2af0a10
46668                                         if (((instr & 0x380000) == 0x0) ||
46669                                             ((instr & 0x3f0000) == 0x80000) ||
46670                                             ((instr & 0x3f0000) == 0x100000) ||
46671                                             ((instr & 0x3f0000) == 0x200000)) {
46672                                           UnallocatedA32(instr);
46673                                           return;
46674                                         }
46675                                         DataType dt =
46676                                             Dt_imm6_4_Decode((instr >> 19) &
46677                                                                  0x7,
46678                                                              (instr >> 24) &
46679                                                                  0x1);
46680                                         if (dt.Is(kDataTypeValueInvalid)) {
46681                                           UnallocatedA32(instr);
46682                                           return;
46683                                         }
46684                                         if (((instr >> 12) & 1) != 0) {
46685                                           UnallocatedA32(instr);
46686                                           return;
46687                                         }
46688                                         unsigned rd =
46689                                             ExtractQRegister(instr, 22, 12);
46690                                         unsigned rm =
46691                                             ExtractDRegister(instr, 5, 0);
46692                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46693                                         uint32_t imm = imm6 - dt.GetSize();
46694                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46695                                         vshll(al,
46696                                               dt,
46697                                               QRegister(rd),
46698                                               DRegister(rm),
46699                                               imm);
46700                                         break;
46701                                       }
46702                                       case 0x00300000: {
46703                                         // 0xf2b00a10
46704                                         if (((instr & 0x380000) == 0x0) ||
46705                                             ((instr & 0x3f0000) == 0x80000) ||
46706                                             ((instr & 0x3f0000) == 0x100000) ||
46707                                             ((instr & 0x3f0000) == 0x200000)) {
46708                                           UnallocatedA32(instr);
46709                                           return;
46710                                         }
46711                                         DataType dt =
46712                                             Dt_imm6_4_Decode((instr >> 19) &
46713                                                                  0x7,
46714                                                              (instr >> 24) &
46715                                                                  0x1);
46716                                         if (dt.Is(kDataTypeValueInvalid)) {
46717                                           UnallocatedA32(instr);
46718                                           return;
46719                                         }
46720                                         if (((instr >> 12) & 1) != 0) {
46721                                           UnallocatedA32(instr);
46722                                           return;
46723                                         }
46724                                         unsigned rd =
46725                                             ExtractQRegister(instr, 22, 12);
46726                                         unsigned rm =
46727                                             ExtractDRegister(instr, 5, 0);
46728                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46729                                         uint32_t imm = imm6 - dt.GetSize();
46730                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46731                                         vshll(al,
46732                                               dt,
46733                                               QRegister(rd),
46734                                               DRegister(rm),
46735                                               imm);
46736                                         break;
46737                                       }
46738                                       case 0x00310000: {
46739                                         // 0xf2b10a10
46740                                         if (((instr & 0x380000) == 0x0) ||
46741                                             ((instr & 0x3f0000) == 0x80000) ||
46742                                             ((instr & 0x3f0000) == 0x100000) ||
46743                                             ((instr & 0x3f0000) == 0x200000)) {
46744                                           UnallocatedA32(instr);
46745                                           return;
46746                                         }
46747                                         DataType dt =
46748                                             Dt_imm6_4_Decode((instr >> 19) &
46749                                                                  0x7,
46750                                                              (instr >> 24) &
46751                                                                  0x1);
46752                                         if (dt.Is(kDataTypeValueInvalid)) {
46753                                           UnallocatedA32(instr);
46754                                           return;
46755                                         }
46756                                         if (((instr >> 12) & 1) != 0) {
46757                                           UnallocatedA32(instr);
46758                                           return;
46759                                         }
46760                                         unsigned rd =
46761                                             ExtractQRegister(instr, 22, 12);
46762                                         unsigned rm =
46763                                             ExtractDRegister(instr, 5, 0);
46764                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46765                                         uint32_t imm = imm6 - dt.GetSize();
46766                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46767                                         vshll(al,
46768                                               dt,
46769                                               QRegister(rd),
46770                                               DRegister(rm),
46771                                               imm);
46772                                         break;
46773                                       }
46774                                       case 0x00320000: {
46775                                         // 0xf2b20a10
46776                                         if (((instr & 0x380000) == 0x0) ||
46777                                             ((instr & 0x3f0000) == 0x80000) ||
46778                                             ((instr & 0x3f0000) == 0x100000) ||
46779                                             ((instr & 0x3f0000) == 0x200000)) {
46780                                           UnallocatedA32(instr);
46781                                           return;
46782                                         }
46783                                         DataType dt =
46784                                             Dt_imm6_4_Decode((instr >> 19) &
46785                                                                  0x7,
46786                                                              (instr >> 24) &
46787                                                                  0x1);
46788                                         if (dt.Is(kDataTypeValueInvalid)) {
46789                                           UnallocatedA32(instr);
46790                                           return;
46791                                         }
46792                                         if (((instr >> 12) & 1) != 0) {
46793                                           UnallocatedA32(instr);
46794                                           return;
46795                                         }
46796                                         unsigned rd =
46797                                             ExtractQRegister(instr, 22, 12);
46798                                         unsigned rm =
46799                                             ExtractDRegister(instr, 5, 0);
46800                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46801                                         uint32_t imm = imm6 - dt.GetSize();
46802                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46803                                         vshll(al,
46804                                               dt,
46805                                               QRegister(rd),
46806                                               DRegister(rm),
46807                                               imm);
46808                                         break;
46809                                       }
46810                                       case 0x00330000: {
46811                                         // 0xf2b30a10
46812                                         if (((instr & 0x380000) == 0x0) ||
46813                                             ((instr & 0x3f0000) == 0x80000) ||
46814                                             ((instr & 0x3f0000) == 0x100000) ||
46815                                             ((instr & 0x3f0000) == 0x200000)) {
46816                                           UnallocatedA32(instr);
46817                                           return;
46818                                         }
46819                                         DataType dt =
46820                                             Dt_imm6_4_Decode((instr >> 19) &
46821                                                                  0x7,
46822                                                              (instr >> 24) &
46823                                                                  0x1);
46824                                         if (dt.Is(kDataTypeValueInvalid)) {
46825                                           UnallocatedA32(instr);
46826                                           return;
46827                                         }
46828                                         if (((instr >> 12) & 1) != 0) {
46829                                           UnallocatedA32(instr);
46830                                           return;
46831                                         }
46832                                         unsigned rd =
46833                                             ExtractQRegister(instr, 22, 12);
46834                                         unsigned rm =
46835                                             ExtractDRegister(instr, 5, 0);
46836                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46837                                         uint32_t imm = imm6 - dt.GetSize();
46838                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46839                                         vshll(al,
46840                                               dt,
46841                                               QRegister(rd),
46842                                               DRegister(rm),
46843                                               imm);
46844                                         break;
46845                                       }
46846                                       case 0x00340000: {
46847                                         // 0xf2b40a10
46848                                         if (((instr & 0x380000) == 0x0) ||
46849                                             ((instr & 0x3f0000) == 0x80000) ||
46850                                             ((instr & 0x3f0000) == 0x100000) ||
46851                                             ((instr & 0x3f0000) == 0x200000)) {
46852                                           UnallocatedA32(instr);
46853                                           return;
46854                                         }
46855                                         DataType dt =
46856                                             Dt_imm6_4_Decode((instr >> 19) &
46857                                                                  0x7,
46858                                                              (instr >> 24) &
46859                                                                  0x1);
46860                                         if (dt.Is(kDataTypeValueInvalid)) {
46861                                           UnallocatedA32(instr);
46862                                           return;
46863                                         }
46864                                         if (((instr >> 12) & 1) != 0) {
46865                                           UnallocatedA32(instr);
46866                                           return;
46867                                         }
46868                                         unsigned rd =
46869                                             ExtractQRegister(instr, 22, 12);
46870                                         unsigned rm =
46871                                             ExtractDRegister(instr, 5, 0);
46872                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46873                                         uint32_t imm = imm6 - dt.GetSize();
46874                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46875                                         vshll(al,
46876                                               dt,
46877                                               QRegister(rd),
46878                                               DRegister(rm),
46879                                               imm);
46880                                         break;
46881                                       }
46882                                       case 0x00350000: {
46883                                         // 0xf2b50a10
46884                                         if (((instr & 0x380000) == 0x0) ||
46885                                             ((instr & 0x3f0000) == 0x80000) ||
46886                                             ((instr & 0x3f0000) == 0x100000) ||
46887                                             ((instr & 0x3f0000) == 0x200000)) {
46888                                           UnallocatedA32(instr);
46889                                           return;
46890                                         }
46891                                         DataType dt =
46892                                             Dt_imm6_4_Decode((instr >> 19) &
46893                                                                  0x7,
46894                                                              (instr >> 24) &
46895                                                                  0x1);
46896                                         if (dt.Is(kDataTypeValueInvalid)) {
46897                                           UnallocatedA32(instr);
46898                                           return;
46899                                         }
46900                                         if (((instr >> 12) & 1) != 0) {
46901                                           UnallocatedA32(instr);
46902                                           return;
46903                                         }
46904                                         unsigned rd =
46905                                             ExtractQRegister(instr, 22, 12);
46906                                         unsigned rm =
46907                                             ExtractDRegister(instr, 5, 0);
46908                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46909                                         uint32_t imm = imm6 - dt.GetSize();
46910                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46911                                         vshll(al,
46912                                               dt,
46913                                               QRegister(rd),
46914                                               DRegister(rm),
46915                                               imm);
46916                                         break;
46917                                       }
46918                                       case 0x00360000: {
46919                                         // 0xf2b60a10
46920                                         if (((instr & 0x380000) == 0x0) ||
46921                                             ((instr & 0x3f0000) == 0x80000) ||
46922                                             ((instr & 0x3f0000) == 0x100000) ||
46923                                             ((instr & 0x3f0000) == 0x200000)) {
46924                                           UnallocatedA32(instr);
46925                                           return;
46926                                         }
46927                                         DataType dt =
46928                                             Dt_imm6_4_Decode((instr >> 19) &
46929                                                                  0x7,
46930                                                              (instr >> 24) &
46931                                                                  0x1);
46932                                         if (dt.Is(kDataTypeValueInvalid)) {
46933                                           UnallocatedA32(instr);
46934                                           return;
46935                                         }
46936                                         if (((instr >> 12) & 1) != 0) {
46937                                           UnallocatedA32(instr);
46938                                           return;
46939                                         }
46940                                         unsigned rd =
46941                                             ExtractQRegister(instr, 22, 12);
46942                                         unsigned rm =
46943                                             ExtractDRegister(instr, 5, 0);
46944                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46945                                         uint32_t imm = imm6 - dt.GetSize();
46946                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46947                                         vshll(al,
46948                                               dt,
46949                                               QRegister(rd),
46950                                               DRegister(rm),
46951                                               imm);
46952                                         break;
46953                                       }
46954                                       case 0x00370000: {
46955                                         // 0xf2b70a10
46956                                         if (((instr & 0x380000) == 0x0) ||
46957                                             ((instr & 0x3f0000) == 0x80000) ||
46958                                             ((instr & 0x3f0000) == 0x100000) ||
46959                                             ((instr & 0x3f0000) == 0x200000)) {
46960                                           UnallocatedA32(instr);
46961                                           return;
46962                                         }
46963                                         DataType dt =
46964                                             Dt_imm6_4_Decode((instr >> 19) &
46965                                                                  0x7,
46966                                                              (instr >> 24) &
46967                                                                  0x1);
46968                                         if (dt.Is(kDataTypeValueInvalid)) {
46969                                           UnallocatedA32(instr);
46970                                           return;
46971                                         }
46972                                         if (((instr >> 12) & 1) != 0) {
46973                                           UnallocatedA32(instr);
46974                                           return;
46975                                         }
46976                                         unsigned rd =
46977                                             ExtractQRegister(instr, 22, 12);
46978                                         unsigned rm =
46979                                             ExtractDRegister(instr, 5, 0);
46980                                         uint32_t imm6 = (instr >> 16) & 0x3f;
46981                                         uint32_t imm = imm6 - dt.GetSize();
46982                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
46983                                         vshll(al,
46984                                               dt,
46985                                               QRegister(rd),
46986                                               DRegister(rm),
46987                                               imm);
46988                                         break;
46989                                       }
46990                                       case 0x00380000: {
46991                                         // 0xf2b80a10
46992                                         if (((instr & 0x380000) == 0x0) ||
46993                                             ((instr & 0x3f0000) == 0x80000) ||
46994                                             ((instr & 0x3f0000) == 0x100000) ||
46995                                             ((instr & 0x3f0000) == 0x200000)) {
46996                                           UnallocatedA32(instr);
46997                                           return;
46998                                         }
46999                                         DataType dt =
47000                                             Dt_imm6_4_Decode((instr >> 19) &
47001                                                                  0x7,
47002                                                              (instr >> 24) &
47003                                                                  0x1);
47004                                         if (dt.Is(kDataTypeValueInvalid)) {
47005                                           UnallocatedA32(instr);
47006                                           return;
47007                                         }
47008                                         if (((instr >> 12) & 1) != 0) {
47009                                           UnallocatedA32(instr);
47010                                           return;
47011                                         }
47012                                         unsigned rd =
47013                                             ExtractQRegister(instr, 22, 12);
47014                                         unsigned rm =
47015                                             ExtractDRegister(instr, 5, 0);
47016                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47017                                         uint32_t imm = imm6 - dt.GetSize();
47018                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47019                                         vshll(al,
47020                                               dt,
47021                                               QRegister(rd),
47022                                               DRegister(rm),
47023                                               imm);
47024                                         break;
47025                                       }
47026                                       case 0x00390000: {
47027                                         // 0xf2b90a10
47028                                         if (((instr & 0x380000) == 0x0) ||
47029                                             ((instr & 0x3f0000) == 0x80000) ||
47030                                             ((instr & 0x3f0000) == 0x100000) ||
47031                                             ((instr & 0x3f0000) == 0x200000)) {
47032                                           UnallocatedA32(instr);
47033                                           return;
47034                                         }
47035                                         DataType dt =
47036                                             Dt_imm6_4_Decode((instr >> 19) &
47037                                                                  0x7,
47038                                                              (instr >> 24) &
47039                                                                  0x1);
47040                                         if (dt.Is(kDataTypeValueInvalid)) {
47041                                           UnallocatedA32(instr);
47042                                           return;
47043                                         }
47044                                         if (((instr >> 12) & 1) != 0) {
47045                                           UnallocatedA32(instr);
47046                                           return;
47047                                         }
47048                                         unsigned rd =
47049                                             ExtractQRegister(instr, 22, 12);
47050                                         unsigned rm =
47051                                             ExtractDRegister(instr, 5, 0);
47052                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47053                                         uint32_t imm = imm6 - dt.GetSize();
47054                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47055                                         vshll(al,
47056                                               dt,
47057                                               QRegister(rd),
47058                                               DRegister(rm),
47059                                               imm);
47060                                         break;
47061                                       }
47062                                       case 0x003a0000: {
47063                                         // 0xf2ba0a10
47064                                         if (((instr & 0x380000) == 0x0) ||
47065                                             ((instr & 0x3f0000) == 0x80000) ||
47066                                             ((instr & 0x3f0000) == 0x100000) ||
47067                                             ((instr & 0x3f0000) == 0x200000)) {
47068                                           UnallocatedA32(instr);
47069                                           return;
47070                                         }
47071                                         DataType dt =
47072                                             Dt_imm6_4_Decode((instr >> 19) &
47073                                                                  0x7,
47074                                                              (instr >> 24) &
47075                                                                  0x1);
47076                                         if (dt.Is(kDataTypeValueInvalid)) {
47077                                           UnallocatedA32(instr);
47078                                           return;
47079                                         }
47080                                         if (((instr >> 12) & 1) != 0) {
47081                                           UnallocatedA32(instr);
47082                                           return;
47083                                         }
47084                                         unsigned rd =
47085                                             ExtractQRegister(instr, 22, 12);
47086                                         unsigned rm =
47087                                             ExtractDRegister(instr, 5, 0);
47088                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47089                                         uint32_t imm = imm6 - dt.GetSize();
47090                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47091                                         vshll(al,
47092                                               dt,
47093                                               QRegister(rd),
47094                                               DRegister(rm),
47095                                               imm);
47096                                         break;
47097                                       }
47098                                       case 0x003b0000: {
47099                                         // 0xf2bb0a10
47100                                         if (((instr & 0x380000) == 0x0) ||
47101                                             ((instr & 0x3f0000) == 0x80000) ||
47102                                             ((instr & 0x3f0000) == 0x100000) ||
47103                                             ((instr & 0x3f0000) == 0x200000)) {
47104                                           UnallocatedA32(instr);
47105                                           return;
47106                                         }
47107                                         DataType dt =
47108                                             Dt_imm6_4_Decode((instr >> 19) &
47109                                                                  0x7,
47110                                                              (instr >> 24) &
47111                                                                  0x1);
47112                                         if (dt.Is(kDataTypeValueInvalid)) {
47113                                           UnallocatedA32(instr);
47114                                           return;
47115                                         }
47116                                         if (((instr >> 12) & 1) != 0) {
47117                                           UnallocatedA32(instr);
47118                                           return;
47119                                         }
47120                                         unsigned rd =
47121                                             ExtractQRegister(instr, 22, 12);
47122                                         unsigned rm =
47123                                             ExtractDRegister(instr, 5, 0);
47124                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47125                                         uint32_t imm = imm6 - dt.GetSize();
47126                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47127                                         vshll(al,
47128                                               dt,
47129                                               QRegister(rd),
47130                                               DRegister(rm),
47131                                               imm);
47132                                         break;
47133                                       }
47134                                       case 0x003c0000: {
47135                                         // 0xf2bc0a10
47136                                         if (((instr & 0x380000) == 0x0) ||
47137                                             ((instr & 0x3f0000) == 0x80000) ||
47138                                             ((instr & 0x3f0000) == 0x100000) ||
47139                                             ((instr & 0x3f0000) == 0x200000)) {
47140                                           UnallocatedA32(instr);
47141                                           return;
47142                                         }
47143                                         DataType dt =
47144                                             Dt_imm6_4_Decode((instr >> 19) &
47145                                                                  0x7,
47146                                                              (instr >> 24) &
47147                                                                  0x1);
47148                                         if (dt.Is(kDataTypeValueInvalid)) {
47149                                           UnallocatedA32(instr);
47150                                           return;
47151                                         }
47152                                         if (((instr >> 12) & 1) != 0) {
47153                                           UnallocatedA32(instr);
47154                                           return;
47155                                         }
47156                                         unsigned rd =
47157                                             ExtractQRegister(instr, 22, 12);
47158                                         unsigned rm =
47159                                             ExtractDRegister(instr, 5, 0);
47160                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47161                                         uint32_t imm = imm6 - dt.GetSize();
47162                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47163                                         vshll(al,
47164                                               dt,
47165                                               QRegister(rd),
47166                                               DRegister(rm),
47167                                               imm);
47168                                         break;
47169                                       }
47170                                       case 0x003d0000: {
47171                                         // 0xf2bd0a10
47172                                         if (((instr & 0x380000) == 0x0) ||
47173                                             ((instr & 0x3f0000) == 0x80000) ||
47174                                             ((instr & 0x3f0000) == 0x100000) ||
47175                                             ((instr & 0x3f0000) == 0x200000)) {
47176                                           UnallocatedA32(instr);
47177                                           return;
47178                                         }
47179                                         DataType dt =
47180                                             Dt_imm6_4_Decode((instr >> 19) &
47181                                                                  0x7,
47182                                                              (instr >> 24) &
47183                                                                  0x1);
47184                                         if (dt.Is(kDataTypeValueInvalid)) {
47185                                           UnallocatedA32(instr);
47186                                           return;
47187                                         }
47188                                         if (((instr >> 12) & 1) != 0) {
47189                                           UnallocatedA32(instr);
47190                                           return;
47191                                         }
47192                                         unsigned rd =
47193                                             ExtractQRegister(instr, 22, 12);
47194                                         unsigned rm =
47195                                             ExtractDRegister(instr, 5, 0);
47196                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47197                                         uint32_t imm = imm6 - dt.GetSize();
47198                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47199                                         vshll(al,
47200                                               dt,
47201                                               QRegister(rd),
47202                                               DRegister(rm),
47203                                               imm);
47204                                         break;
47205                                       }
47206                                       case 0x003e0000: {
47207                                         // 0xf2be0a10
47208                                         if (((instr & 0x380000) == 0x0) ||
47209                                             ((instr & 0x3f0000) == 0x80000) ||
47210                                             ((instr & 0x3f0000) == 0x100000) ||
47211                                             ((instr & 0x3f0000) == 0x200000)) {
47212                                           UnallocatedA32(instr);
47213                                           return;
47214                                         }
47215                                         DataType dt =
47216                                             Dt_imm6_4_Decode((instr >> 19) &
47217                                                                  0x7,
47218                                                              (instr >> 24) &
47219                                                                  0x1);
47220                                         if (dt.Is(kDataTypeValueInvalid)) {
47221                                           UnallocatedA32(instr);
47222                                           return;
47223                                         }
47224                                         if (((instr >> 12) & 1) != 0) {
47225                                           UnallocatedA32(instr);
47226                                           return;
47227                                         }
47228                                         unsigned rd =
47229                                             ExtractQRegister(instr, 22, 12);
47230                                         unsigned rm =
47231                                             ExtractDRegister(instr, 5, 0);
47232                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47233                                         uint32_t imm = imm6 - dt.GetSize();
47234                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47235                                         vshll(al,
47236                                               dt,
47237                                               QRegister(rd),
47238                                               DRegister(rm),
47239                                               imm);
47240                                         break;
47241                                       }
47242                                       case 0x003f0000: {
47243                                         // 0xf2bf0a10
47244                                         if (((instr & 0x380000) == 0x0) ||
47245                                             ((instr & 0x3f0000) == 0x80000) ||
47246                                             ((instr & 0x3f0000) == 0x100000) ||
47247                                             ((instr & 0x3f0000) == 0x200000)) {
47248                                           UnallocatedA32(instr);
47249                                           return;
47250                                         }
47251                                         DataType dt =
47252                                             Dt_imm6_4_Decode((instr >> 19) &
47253                                                                  0x7,
47254                                                              (instr >> 24) &
47255                                                                  0x1);
47256                                         if (dt.Is(kDataTypeValueInvalid)) {
47257                                           UnallocatedA32(instr);
47258                                           return;
47259                                         }
47260                                         if (((instr >> 12) & 1) != 0) {
47261                                           UnallocatedA32(instr);
47262                                           return;
47263                                         }
47264                                         unsigned rd =
47265                                             ExtractQRegister(instr, 22, 12);
47266                                         unsigned rm =
47267                                             ExtractDRegister(instr, 5, 0);
47268                                         uint32_t imm6 = (instr >> 16) & 0x3f;
47269                                         uint32_t imm = imm6 - dt.GetSize();
47270                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47271                                         vshll(al,
47272                                               dt,
47273                                               QRegister(rd),
47274                                               DRegister(rm),
47275                                               imm);
47276                                         break;
47277                                       }
47278                                       default:
47279                                         UnallocatedA32(instr);
47280                                         break;
47281                                     }
47282                                     break;
47283                                   }
47284                                   default: {
47285                                     if (((instr & 0x380000) == 0x0) ||
47286                                         ((instr & 0x3f0000) == 0x80000) ||
47287                                         ((instr & 0x3f0000) == 0x100000) ||
47288                                         ((instr & 0x3f0000) == 0x200000)) {
47289                                       UnallocatedA32(instr);
47290                                       return;
47291                                     }
47292                                     DataType dt =
47293                                         Dt_imm6_4_Decode((instr >> 19) & 0x7,
47294                                                          (instr >> 24) & 0x1);
47295                                     if (dt.Is(kDataTypeValueInvalid)) {
47296                                       UnallocatedA32(instr);
47297                                       return;
47298                                     }
47299                                     if (((instr >> 12) & 1) != 0) {
47300                                       UnallocatedA32(instr);
47301                                       return;
47302                                     }
47303                                     unsigned rd =
47304                                         ExtractQRegister(instr, 22, 12);
47305                                     unsigned rm = ExtractDRegister(instr, 5, 0);
47306                                     uint32_t imm6 = (instr >> 16) & 0x3f;
47307                                     uint32_t imm = imm6 - dt.GetSize();
47308                                     // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
47309                                     vshll(al,
47310                                           dt,
47311                                           QRegister(rd),
47312                                           DRegister(rm),
47313                                           imm);
47314                                     break;
47315                                   }
47316                                 }
47317                                 break;
47318                               }
47319                               default:
47320                                 UnallocatedA32(instr);
47321                                 break;
47322                             }
47323                             break;
47324                           }
47325                         }
47326                         break;
47327                       }
47328                       default:
47329                         UnallocatedA32(instr);
47330                         break;
47331                     }
47332                     break;
47333                   }
47334                   case 0x00000c00: {
47335                     // 0xf2800c10
47336                     switch (instr & 0x00000080) {
47337                       case 0x00000000: {
47338                         // 0xf2800c10
47339                         switch (instr & 0x00200000) {
47340                           case 0x00000000: {
47341                             // 0xf2800c10
47342                             switch (instr & 0x00180000) {
47343                               case 0x00000000: {
47344                                 // 0xf2800c10
47345                                 switch (instr & 0x00000300) {
47346                                   case 0x00000200: {
47347                                     // 0xf2800e10
47348                                     if (((instr & 0x920) == 0x100) ||
47349                                         ((instr & 0x520) == 0x100) ||
47350                                         ((instr & 0x820) == 0x20) ||
47351                                         ((instr & 0x420) == 0x20) ||
47352                                         ((instr & 0x220) == 0x20) ||
47353                                         ((instr & 0x120) == 0x120)) {
47354                                       UnallocatedA32(instr);
47355                                       return;
47356                                     }
47357                                     unsigned cmode = ((instr >> 8) & 0xf) |
47358                                                      ((instr >> 1) & 0x10);
47359                                     DataType dt =
47360                                         ImmediateVmov::DecodeDt(cmode);
47361                                     if (dt.Is(kDataTypeValueInvalid)) {
47362                                       UnallocatedA32(instr);
47363                                       return;
47364                                     }
47365                                     unsigned rd =
47366                                         ExtractDRegister(instr, 22, 12);
47367                                     DOperand imm =
47368                                         ImmediateVmov::DecodeImmediate(
47369                                             cmode,
47370                                             (instr & 0xf) |
47371                                                 ((instr >> 12) & 0x70) |
47372                                                 ((instr >> 17) & 0x80));
47373                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47374                                     vmov(al, dt, DRegister(rd), imm);
47375                                     break;
47376                                   }
47377                                   case 0x00000300: {
47378                                     // 0xf2800f10
47379                                     if (((instr & 0x920) == 0x100) ||
47380                                         ((instr & 0x520) == 0x100) ||
47381                                         ((instr & 0x820) == 0x20) ||
47382                                         ((instr & 0x420) == 0x20) ||
47383                                         ((instr & 0x220) == 0x20) ||
47384                                         ((instr & 0x120) == 0x120)) {
47385                                       UnallocatedA32(instr);
47386                                       return;
47387                                     }
47388                                     unsigned cmode = ((instr >> 8) & 0xf) |
47389                                                      ((instr >> 1) & 0x10);
47390                                     DataType dt =
47391                                         ImmediateVmov::DecodeDt(cmode);
47392                                     if (dt.Is(kDataTypeValueInvalid)) {
47393                                       UnallocatedA32(instr);
47394                                       return;
47395                                     }
47396                                     unsigned rd =
47397                                         ExtractDRegister(instr, 22, 12);
47398                                     DOperand imm =
47399                                         ImmediateVmov::DecodeImmediate(
47400                                             cmode,
47401                                             (instr & 0xf) |
47402                                                 ((instr >> 12) & 0x70) |
47403                                                 ((instr >> 17) & 0x80));
47404                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
47405                                     vmov(al, dt, DRegister(rd), imm);
47406                                     break;
47407                                   }
47408                                   default: {
47409                                     switch (instr & 0x00000020) {
47410                                       case 0x00000020: {
47411                                         // 0xf2800c30
47412                                         switch (instr & 0x00000f20) {
47413                                           case 0x00000000: {
47414                                             // 0xf2800c10
47415                                             if (((instr & 0x920) == 0x100) ||
47416                                                 ((instr & 0x520) == 0x100) ||
47417                                                 ((instr & 0x820) == 0x20) ||
47418                                                 ((instr & 0x420) == 0x20) ||
47419                                                 ((instr & 0x220) == 0x20) ||
47420                                                 ((instr & 0x120) == 0x120)) {
47421                                               UnallocatedA32(instr);
47422                                               return;
47423                                             }
47424                                             unsigned cmode =
47425                                                 ((instr >> 8) & 0xf) |
47426                                                 ((instr >> 1) & 0x10);
47427                                             DataType dt =
47428                                                 ImmediateVmov::DecodeDt(cmode);
47429                                             if (dt.Is(kDataTypeValueInvalid)) {
47430                                               UnallocatedA32(instr);
47431                                               return;
47432                                             }
47433                                             unsigned rd =
47434                                                 ExtractDRegister(instr, 22, 12);
47435                                             DOperand imm =
47436                                                 ImmediateVmov::DecodeImmediate(
47437                                                     cmode,
47438                                                     (instr & 0xf) |
47439                                                         ((instr >> 12) & 0x70) |
47440                                                         ((instr >> 17) & 0x80));
47441                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47442                                             vmov(al, dt, DRegister(rd), imm);
47443                                             break;
47444                                           }
47445                                           case 0x00000020: {
47446                                             // 0xf2800c30
47447                                             if (((instr & 0xd00) == 0x100) ||
47448                                                 ((instr & 0xd00) == 0x500) ||
47449                                                 ((instr & 0xd00) == 0x900) ||
47450                                                 ((instr & 0xe00) == 0xe00)) {
47451                                               UnallocatedA32(instr);
47452                                               return;
47453                                             }
47454                                             unsigned cmode = (instr >> 8) & 0xf;
47455                                             DataType dt =
47456                                                 ImmediateVmvn::DecodeDt(cmode);
47457                                             if (dt.Is(kDataTypeValueInvalid)) {
47458                                               UnallocatedA32(instr);
47459                                               return;
47460                                             }
47461                                             unsigned rd =
47462                                                 ExtractDRegister(instr, 22, 12);
47463                                             DOperand imm =
47464                                                 ImmediateVmvn::DecodeImmediate(
47465                                                     cmode,
47466                                                     (instr & 0xf) |
47467                                                         ((instr >> 12) & 0x70) |
47468                                                         ((instr >> 17) & 0x80));
47469                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47470                                             vmvn(al, dt, DRegister(rd), imm);
47471                                             break;
47472                                           }
47473                                           case 0x00000200: {
47474                                             // 0xf2800e10
47475                                             if (((instr & 0x920) == 0x100) ||
47476                                                 ((instr & 0x520) == 0x100) ||
47477                                                 ((instr & 0x820) == 0x20) ||
47478                                                 ((instr & 0x420) == 0x20) ||
47479                                                 ((instr & 0x220) == 0x20) ||
47480                                                 ((instr & 0x120) == 0x120)) {
47481                                               UnallocatedA32(instr);
47482                                               return;
47483                                             }
47484                                             unsigned cmode =
47485                                                 ((instr >> 8) & 0xf) |
47486                                                 ((instr >> 1) & 0x10);
47487                                             DataType dt =
47488                                                 ImmediateVmov::DecodeDt(cmode);
47489                                             if (dt.Is(kDataTypeValueInvalid)) {
47490                                               UnallocatedA32(instr);
47491                                               return;
47492                                             }
47493                                             unsigned rd =
47494                                                 ExtractDRegister(instr, 22, 12);
47495                                             DOperand imm =
47496                                                 ImmediateVmov::DecodeImmediate(
47497                                                     cmode,
47498                                                     (instr & 0xf) |
47499                                                         ((instr >> 12) & 0x70) |
47500                                                         ((instr >> 17) & 0x80));
47501                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47502                                             vmov(al, dt, DRegister(rd), imm);
47503                                             break;
47504                                           }
47505                                           case 0x00000220: {
47506                                             // 0xf2800e30
47507                                             if (((instr & 0xd00) == 0x100) ||
47508                                                 ((instr & 0xd00) == 0x500) ||
47509                                                 ((instr & 0xd00) == 0x900) ||
47510                                                 ((instr & 0xe00) == 0xe00)) {
47511                                               UnallocatedA32(instr);
47512                                               return;
47513                                             }
47514                                             unsigned cmode = (instr >> 8) & 0xf;
47515                                             DataType dt =
47516                                                 ImmediateVmvn::DecodeDt(cmode);
47517                                             if (dt.Is(kDataTypeValueInvalid)) {
47518                                               UnallocatedA32(instr);
47519                                               return;
47520                                             }
47521                                             unsigned rd =
47522                                                 ExtractDRegister(instr, 22, 12);
47523                                             DOperand imm =
47524                                                 ImmediateVmvn::DecodeImmediate(
47525                                                     cmode,
47526                                                     (instr & 0xf) |
47527                                                         ((instr >> 12) & 0x70) |
47528                                                         ((instr >> 17) & 0x80));
47529                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47530                                             vmvn(al, dt, DRegister(rd), imm);
47531                                             break;
47532                                           }
47533                                           case 0x00000400: {
47534                                             // 0xf2800c10
47535                                             if (((instr & 0x920) == 0x100) ||
47536                                                 ((instr & 0x520) == 0x100) ||
47537                                                 ((instr & 0x820) == 0x20) ||
47538                                                 ((instr & 0x420) == 0x20) ||
47539                                                 ((instr & 0x220) == 0x20) ||
47540                                                 ((instr & 0x120) == 0x120)) {
47541                                               UnallocatedA32(instr);
47542                                               return;
47543                                             }
47544                                             unsigned cmode =
47545                                                 ((instr >> 8) & 0xf) |
47546                                                 ((instr >> 1) & 0x10);
47547                                             DataType dt =
47548                                                 ImmediateVmov::DecodeDt(cmode);
47549                                             if (dt.Is(kDataTypeValueInvalid)) {
47550                                               UnallocatedA32(instr);
47551                                               return;
47552                                             }
47553                                             unsigned rd =
47554                                                 ExtractDRegister(instr, 22, 12);
47555                                             DOperand imm =
47556                                                 ImmediateVmov::DecodeImmediate(
47557                                                     cmode,
47558                                                     (instr & 0xf) |
47559                                                         ((instr >> 12) & 0x70) |
47560                                                         ((instr >> 17) & 0x80));
47561                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47562                                             vmov(al, dt, DRegister(rd), imm);
47563                                             break;
47564                                           }
47565                                           case 0x00000420: {
47566                                             // 0xf2800c30
47567                                             if (((instr & 0xd00) == 0x100) ||
47568                                                 ((instr & 0xd00) == 0x500) ||
47569                                                 ((instr & 0xd00) == 0x900) ||
47570                                                 ((instr & 0xe00) == 0xe00)) {
47571                                               UnallocatedA32(instr);
47572                                               return;
47573                                             }
47574                                             unsigned cmode = (instr >> 8) & 0xf;
47575                                             DataType dt =
47576                                                 ImmediateVmvn::DecodeDt(cmode);
47577                                             if (dt.Is(kDataTypeValueInvalid)) {
47578                                               UnallocatedA32(instr);
47579                                               return;
47580                                             }
47581                                             unsigned rd =
47582                                                 ExtractDRegister(instr, 22, 12);
47583                                             DOperand imm =
47584                                                 ImmediateVmvn::DecodeImmediate(
47585                                                     cmode,
47586                                                     (instr & 0xf) |
47587                                                         ((instr >> 12) & 0x70) |
47588                                                         ((instr >> 17) & 0x80));
47589                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47590                                             vmvn(al, dt, DRegister(rd), imm);
47591                                             break;
47592                                           }
47593                                           case 0x00000600: {
47594                                             // 0xf2800e10
47595                                             if (((instr & 0x920) == 0x100) ||
47596                                                 ((instr & 0x520) == 0x100) ||
47597                                                 ((instr & 0x820) == 0x20) ||
47598                                                 ((instr & 0x420) == 0x20) ||
47599                                                 ((instr & 0x220) == 0x20) ||
47600                                                 ((instr & 0x120) == 0x120)) {
47601                                               UnallocatedA32(instr);
47602                                               return;
47603                                             }
47604                                             unsigned cmode =
47605                                                 ((instr >> 8) & 0xf) |
47606                                                 ((instr >> 1) & 0x10);
47607                                             DataType dt =
47608                                                 ImmediateVmov::DecodeDt(cmode);
47609                                             if (dt.Is(kDataTypeValueInvalid)) {
47610                                               UnallocatedA32(instr);
47611                                               return;
47612                                             }
47613                                             unsigned rd =
47614                                                 ExtractDRegister(instr, 22, 12);
47615                                             DOperand imm =
47616                                                 ImmediateVmov::DecodeImmediate(
47617                                                     cmode,
47618                                                     (instr & 0xf) |
47619                                                         ((instr >> 12) & 0x70) |
47620                                                         ((instr >> 17) & 0x80));
47621                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47622                                             vmov(al, dt, DRegister(rd), imm);
47623                                             break;
47624                                           }
47625                                           case 0x00000620: {
47626                                             // 0xf2800e30
47627                                             if (((instr & 0xd00) == 0x100) ||
47628                                                 ((instr & 0xd00) == 0x500) ||
47629                                                 ((instr & 0xd00) == 0x900) ||
47630                                                 ((instr & 0xe00) == 0xe00)) {
47631                                               UnallocatedA32(instr);
47632                                               return;
47633                                             }
47634                                             unsigned cmode = (instr >> 8) & 0xf;
47635                                             DataType dt =
47636                                                 ImmediateVmvn::DecodeDt(cmode);
47637                                             if (dt.Is(kDataTypeValueInvalid)) {
47638                                               UnallocatedA32(instr);
47639                                               return;
47640                                             }
47641                                             unsigned rd =
47642                                                 ExtractDRegister(instr, 22, 12);
47643                                             DOperand imm =
47644                                                 ImmediateVmvn::DecodeImmediate(
47645                                                     cmode,
47646                                                     (instr & 0xf) |
47647                                                         ((instr >> 12) & 0x70) |
47648                                                         ((instr >> 17) & 0x80));
47649                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47650                                             vmvn(al, dt, DRegister(rd), imm);
47651                                             break;
47652                                           }
47653                                           case 0x00000800: {
47654                                             // 0xf2800c10
47655                                             if (((instr & 0x920) == 0x100) ||
47656                                                 ((instr & 0x520) == 0x100) ||
47657                                                 ((instr & 0x820) == 0x20) ||
47658                                                 ((instr & 0x420) == 0x20) ||
47659                                                 ((instr & 0x220) == 0x20) ||
47660                                                 ((instr & 0x120) == 0x120)) {
47661                                               UnallocatedA32(instr);
47662                                               return;
47663                                             }
47664                                             unsigned cmode =
47665                                                 ((instr >> 8) & 0xf) |
47666                                                 ((instr >> 1) & 0x10);
47667                                             DataType dt =
47668                                                 ImmediateVmov::DecodeDt(cmode);
47669                                             if (dt.Is(kDataTypeValueInvalid)) {
47670                                               UnallocatedA32(instr);
47671                                               return;
47672                                             }
47673                                             unsigned rd =
47674                                                 ExtractDRegister(instr, 22, 12);
47675                                             DOperand imm =
47676                                                 ImmediateVmov::DecodeImmediate(
47677                                                     cmode,
47678                                                     (instr & 0xf) |
47679                                                         ((instr >> 12) & 0x70) |
47680                                                         ((instr >> 17) & 0x80));
47681                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47682                                             vmov(al, dt, DRegister(rd), imm);
47683                                             break;
47684                                           }
47685                                           case 0x00000820: {
47686                                             // 0xf2800c30
47687                                             if (((instr & 0xd00) == 0x100) ||
47688                                                 ((instr & 0xd00) == 0x500) ||
47689                                                 ((instr & 0xd00) == 0x900) ||
47690                                                 ((instr & 0xe00) == 0xe00)) {
47691                                               UnallocatedA32(instr);
47692                                               return;
47693                                             }
47694                                             unsigned cmode = (instr >> 8) & 0xf;
47695                                             DataType dt =
47696                                                 ImmediateVmvn::DecodeDt(cmode);
47697                                             if (dt.Is(kDataTypeValueInvalid)) {
47698                                               UnallocatedA32(instr);
47699                                               return;
47700                                             }
47701                                             unsigned rd =
47702                                                 ExtractDRegister(instr, 22, 12);
47703                                             DOperand imm =
47704                                                 ImmediateVmvn::DecodeImmediate(
47705                                                     cmode,
47706                                                     (instr & 0xf) |
47707                                                         ((instr >> 12) & 0x70) |
47708                                                         ((instr >> 17) & 0x80));
47709                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47710                                             vmvn(al, dt, DRegister(rd), imm);
47711                                             break;
47712                                           }
47713                                           case 0x00000a00: {
47714                                             // 0xf2800e10
47715                                             if (((instr & 0x920) == 0x100) ||
47716                                                 ((instr & 0x520) == 0x100) ||
47717                                                 ((instr & 0x820) == 0x20) ||
47718                                                 ((instr & 0x420) == 0x20) ||
47719                                                 ((instr & 0x220) == 0x20) ||
47720                                                 ((instr & 0x120) == 0x120)) {
47721                                               UnallocatedA32(instr);
47722                                               return;
47723                                             }
47724                                             unsigned cmode =
47725                                                 ((instr >> 8) & 0xf) |
47726                                                 ((instr >> 1) & 0x10);
47727                                             DataType dt =
47728                                                 ImmediateVmov::DecodeDt(cmode);
47729                                             if (dt.Is(kDataTypeValueInvalid)) {
47730                                               UnallocatedA32(instr);
47731                                               return;
47732                                             }
47733                                             unsigned rd =
47734                                                 ExtractDRegister(instr, 22, 12);
47735                                             DOperand imm =
47736                                                 ImmediateVmov::DecodeImmediate(
47737                                                     cmode,
47738                                                     (instr & 0xf) |
47739                                                         ((instr >> 12) & 0x70) |
47740                                                         ((instr >> 17) & 0x80));
47741                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47742                                             vmov(al, dt, DRegister(rd), imm);
47743                                             break;
47744                                           }
47745                                           case 0x00000a20: {
47746                                             // 0xf2800e30
47747                                             if (((instr & 0xd00) == 0x100) ||
47748                                                 ((instr & 0xd00) == 0x500) ||
47749                                                 ((instr & 0xd00) == 0x900) ||
47750                                                 ((instr & 0xe00) == 0xe00)) {
47751                                               UnallocatedA32(instr);
47752                                               return;
47753                                             }
47754                                             unsigned cmode = (instr >> 8) & 0xf;
47755                                             DataType dt =
47756                                                 ImmediateVmvn::DecodeDt(cmode);
47757                                             if (dt.Is(kDataTypeValueInvalid)) {
47758                                               UnallocatedA32(instr);
47759                                               return;
47760                                             }
47761                                             unsigned rd =
47762                                                 ExtractDRegister(instr, 22, 12);
47763                                             DOperand imm =
47764                                                 ImmediateVmvn::DecodeImmediate(
47765                                                     cmode,
47766                                                     (instr & 0xf) |
47767                                                         ((instr >> 12) & 0x70) |
47768                                                         ((instr >> 17) & 0x80));
47769                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47770                                             vmvn(al, dt, DRegister(rd), imm);
47771                                             break;
47772                                           }
47773                                           case 0x00000c00: {
47774                                             // 0xf2800c10
47775                                             if (((instr & 0x920) == 0x100) ||
47776                                                 ((instr & 0x520) == 0x100) ||
47777                                                 ((instr & 0x820) == 0x20) ||
47778                                                 ((instr & 0x420) == 0x20) ||
47779                                                 ((instr & 0x220) == 0x20) ||
47780                                                 ((instr & 0x120) == 0x120)) {
47781                                               UnallocatedA32(instr);
47782                                               return;
47783                                             }
47784                                             unsigned cmode =
47785                                                 ((instr >> 8) & 0xf) |
47786                                                 ((instr >> 1) & 0x10);
47787                                             DataType dt =
47788                                                 ImmediateVmov::DecodeDt(cmode);
47789                                             if (dt.Is(kDataTypeValueInvalid)) {
47790                                               UnallocatedA32(instr);
47791                                               return;
47792                                             }
47793                                             unsigned rd =
47794                                                 ExtractDRegister(instr, 22, 12);
47795                                             DOperand imm =
47796                                                 ImmediateVmov::DecodeImmediate(
47797                                                     cmode,
47798                                                     (instr & 0xf) |
47799                                                         ((instr >> 12) & 0x70) |
47800                                                         ((instr >> 17) & 0x80));
47801                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47802                                             vmov(al, dt, DRegister(rd), imm);
47803                                             break;
47804                                           }
47805                                           case 0x00000c20: {
47806                                             // 0xf2800c30
47807                                             if (((instr & 0xd00) == 0x100) ||
47808                                                 ((instr & 0xd00) == 0x500) ||
47809                                                 ((instr & 0xd00) == 0x900) ||
47810                                                 ((instr & 0xe00) == 0xe00)) {
47811                                               UnallocatedA32(instr);
47812                                               return;
47813                                             }
47814                                             unsigned cmode = (instr >> 8) & 0xf;
47815                                             DataType dt =
47816                                                 ImmediateVmvn::DecodeDt(cmode);
47817                                             if (dt.Is(kDataTypeValueInvalid)) {
47818                                               UnallocatedA32(instr);
47819                                               return;
47820                                             }
47821                                             unsigned rd =
47822                                                 ExtractDRegister(instr, 22, 12);
47823                                             DOperand imm =
47824                                                 ImmediateVmvn::DecodeImmediate(
47825                                                     cmode,
47826                                                     (instr & 0xf) |
47827                                                         ((instr >> 12) & 0x70) |
47828                                                         ((instr >> 17) & 0x80));
47829                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47830                                             vmvn(al, dt, DRegister(rd), imm);
47831                                             break;
47832                                           }
47833                                           case 0x00000d00: {
47834                                             // 0xf2800d10
47835                                             if (((instr & 0x920) == 0x100) ||
47836                                                 ((instr & 0x520) == 0x100) ||
47837                                                 ((instr & 0x820) == 0x20) ||
47838                                                 ((instr & 0x420) == 0x20) ||
47839                                                 ((instr & 0x220) == 0x20) ||
47840                                                 ((instr & 0x120) == 0x120)) {
47841                                               UnallocatedA32(instr);
47842                                               return;
47843                                             }
47844                                             unsigned cmode =
47845                                                 ((instr >> 8) & 0xf) |
47846                                                 ((instr >> 1) & 0x10);
47847                                             DataType dt =
47848                                                 ImmediateVmov::DecodeDt(cmode);
47849                                             if (dt.Is(kDataTypeValueInvalid)) {
47850                                               UnallocatedA32(instr);
47851                                               return;
47852                                             }
47853                                             unsigned rd =
47854                                                 ExtractDRegister(instr, 22, 12);
47855                                             DOperand imm =
47856                                                 ImmediateVmov::DecodeImmediate(
47857                                                     cmode,
47858                                                     (instr & 0xf) |
47859                                                         ((instr >> 12) & 0x70) |
47860                                                         ((instr >> 17) & 0x80));
47861                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47862                                             vmov(al, dt, DRegister(rd), imm);
47863                                             break;
47864                                           }
47865                                           case 0x00000d20: {
47866                                             // 0xf2800d30
47867                                             if (((instr & 0xd00) == 0x100) ||
47868                                                 ((instr & 0xd00) == 0x500) ||
47869                                                 ((instr & 0xd00) == 0x900) ||
47870                                                 ((instr & 0xe00) == 0xe00)) {
47871                                               UnallocatedA32(instr);
47872                                               return;
47873                                             }
47874                                             unsigned cmode = (instr >> 8) & 0xf;
47875                                             DataType dt =
47876                                                 ImmediateVmvn::DecodeDt(cmode);
47877                                             if (dt.Is(kDataTypeValueInvalid)) {
47878                                               UnallocatedA32(instr);
47879                                               return;
47880                                             }
47881                                             unsigned rd =
47882                                                 ExtractDRegister(instr, 22, 12);
47883                                             DOperand imm =
47884                                                 ImmediateVmvn::DecodeImmediate(
47885                                                     cmode,
47886                                                     (instr & 0xf) |
47887                                                         ((instr >> 12) & 0x70) |
47888                                                         ((instr >> 17) & 0x80));
47889                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47890                                             vmvn(al, dt, DRegister(rd), imm);
47891                                             break;
47892                                           }
47893                                           case 0x00000e00: {
47894                                             // 0xf2800e10
47895                                             if (((instr & 0x920) == 0x100) ||
47896                                                 ((instr & 0x520) == 0x100) ||
47897                                                 ((instr & 0x820) == 0x20) ||
47898                                                 ((instr & 0x420) == 0x20) ||
47899                                                 ((instr & 0x220) == 0x20) ||
47900                                                 ((instr & 0x120) == 0x120)) {
47901                                               UnallocatedA32(instr);
47902                                               return;
47903                                             }
47904                                             unsigned cmode =
47905                                                 ((instr >> 8) & 0xf) |
47906                                                 ((instr >> 1) & 0x10);
47907                                             DataType dt =
47908                                                 ImmediateVmov::DecodeDt(cmode);
47909                                             if (dt.Is(kDataTypeValueInvalid)) {
47910                                               UnallocatedA32(instr);
47911                                               return;
47912                                             }
47913                                             unsigned rd =
47914                                                 ExtractDRegister(instr, 22, 12);
47915                                             DOperand imm =
47916                                                 ImmediateVmov::DecodeImmediate(
47917                                                     cmode,
47918                                                     (instr & 0xf) |
47919                                                         ((instr >> 12) & 0x70) |
47920                                                         ((instr >> 17) & 0x80));
47921                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47922                                             vmov(al, dt, DRegister(rd), imm);
47923                                             break;
47924                                           }
47925                                           case 0x00000e20: {
47926                                             // 0xf2800e30
47927                                             if (((instr & 0x920) == 0x100) ||
47928                                                 ((instr & 0x520) == 0x100) ||
47929                                                 ((instr & 0x820) == 0x20) ||
47930                                                 ((instr & 0x420) == 0x20) ||
47931                                                 ((instr & 0x220) == 0x20) ||
47932                                                 ((instr & 0x120) == 0x120)) {
47933                                               UnallocatedA32(instr);
47934                                               return;
47935                                             }
47936                                             unsigned cmode =
47937                                                 ((instr >> 8) & 0xf) |
47938                                                 ((instr >> 1) & 0x10);
47939                                             DataType dt =
47940                                                 ImmediateVmov::DecodeDt(cmode);
47941                                             if (dt.Is(kDataTypeValueInvalid)) {
47942                                               UnallocatedA32(instr);
47943                                               return;
47944                                             }
47945                                             unsigned rd =
47946                                                 ExtractDRegister(instr, 22, 12);
47947                                             DOperand imm =
47948                                                 ImmediateVmov::DecodeImmediate(
47949                                                     cmode,
47950                                                     (instr & 0xf) |
47951                                                         ((instr >> 12) & 0x70) |
47952                                                         ((instr >> 17) & 0x80));
47953                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47954                                             vmov(al, dt, DRegister(rd), imm);
47955                                             break;
47956                                           }
47957                                           case 0x00000f00: {
47958                                             // 0xf2800f10
47959                                             if (((instr & 0x920) == 0x100) ||
47960                                                 ((instr & 0x520) == 0x100) ||
47961                                                 ((instr & 0x820) == 0x20) ||
47962                                                 ((instr & 0x420) == 0x20) ||
47963                                                 ((instr & 0x220) == 0x20) ||
47964                                                 ((instr & 0x120) == 0x120)) {
47965                                               UnallocatedA32(instr);
47966                                               return;
47967                                             }
47968                                             unsigned cmode =
47969                                                 ((instr >> 8) & 0xf) |
47970                                                 ((instr >> 1) & 0x10);
47971                                             DataType dt =
47972                                                 ImmediateVmov::DecodeDt(cmode);
47973                                             if (dt.Is(kDataTypeValueInvalid)) {
47974                                               UnallocatedA32(instr);
47975                                               return;
47976                                             }
47977                                             unsigned rd =
47978                                                 ExtractDRegister(instr, 22, 12);
47979                                             DOperand imm =
47980                                                 ImmediateVmov::DecodeImmediate(
47981                                                     cmode,
47982                                                     (instr & 0xf) |
47983                                                         ((instr >> 12) & 0x70) |
47984                                                         ((instr >> 17) & 0x80));
47985                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
47986                                             vmov(al, dt, DRegister(rd), imm);
47987                                             break;
47988                                           }
47989                                           default:
47990                                             UnallocatedA32(instr);
47991                                             break;
47992                                         }
47993                                         break;
47994                                       }
47995                                       default: {
47996                                         if (((instr & 0x920) == 0x100) ||
47997                                             ((instr & 0x520) == 0x100) ||
47998                                             ((instr & 0x820) == 0x20) ||
47999                                             ((instr & 0x420) == 0x20) ||
48000                                             ((instr & 0x220) == 0x20) ||
48001                                             ((instr & 0x120) == 0x120)) {
48002                                           UnallocatedA32(instr);
48003                                           return;
48004                                         }
48005                                         unsigned cmode = ((instr >> 8) & 0xf) |
48006                                                          ((instr >> 1) & 0x10);
48007                                         DataType dt =
48008                                             ImmediateVmov::DecodeDt(cmode);
48009                                         if (dt.Is(kDataTypeValueInvalid)) {
48010                                           UnallocatedA32(instr);
48011                                           return;
48012                                         }
48013                                         unsigned rd =
48014                                             ExtractDRegister(instr, 22, 12);
48015                                         DOperand imm =
48016                                             ImmediateVmov::DecodeImmediate(
48017                                                 cmode,
48018                                                 (instr & 0xf) |
48019                                                     ((instr >> 12) & 0x70) |
48020                                                     ((instr >> 17) & 0x80));
48021                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
48022                                         vmov(al, dt, DRegister(rd), imm);
48023                                         break;
48024                                       }
48025                                     }
48026                                     break;
48027                                   }
48028                                 }
48029                                 break;
48030                               }
48031                               default:
48032                                 UnallocatedA32(instr);
48033                                 break;
48034                             }
48035                             break;
48036                           }
48037                           default: {
48038                             if ((instr & 0x00000200) == 0x00000200) {
48039                               if (((instr & 0x200000) == 0x0)) {
48040                                 UnallocatedA32(instr);
48041                                 return;
48042                               }
48043                               DataType dt1 = Dt_op_U_1_Decode1(
48044                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
48045                               if (dt1.Is(kDataTypeValueInvalid)) {
48046                                 UnallocatedA32(instr);
48047                                 return;
48048                               }
48049                               DataType dt2 = Dt_op_U_1_Decode2(
48050                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
48051                               if (dt2.Is(kDataTypeValueInvalid)) {
48052                                 UnallocatedA32(instr);
48053                                 return;
48054                               }
48055                               unsigned rd = ExtractDRegister(instr, 22, 12);
48056                               unsigned rm = ExtractDRegister(instr, 5, 0);
48057                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
48058                               // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
48059                               vcvt(al,
48060                                    dt1,
48061                                    dt2,
48062                                    DRegister(rd),
48063                                    DRegister(rm),
48064                                    fbits);
48065                             } else {
48066                               UnallocatedA32(instr);
48067                             }
48068                             break;
48069                           }
48070                         }
48071                         break;
48072                       }
48073                       default:
48074                         UnallocatedA32(instr);
48075                         break;
48076                     }
48077                     break;
48078                   }
48079                 }
48080                 break;
48081               }
48082               case 0x00000040: {
48083                 // 0xf2800050
48084                 switch (instr & 0x00000c00) {
48085                   case 0x00000000: {
48086                     // 0xf2800050
48087                     switch (instr & 0x00380080) {
48088                       case 0x00000000: {
48089                         // 0xf2800050
48090                         switch (instr & 0x00000100) {
48091                           case 0x00000000: {
48092                             // 0xf2800050
48093                             switch (instr & 0x00000200) {
48094                               default: {
48095                                 switch (instr & 0x00000020) {
48096                                   case 0x00000020: {
48097                                     // 0xf2800070
48098                                     if (((instr & 0xd00) == 0x100) ||
48099                                         ((instr & 0xd00) == 0x500) ||
48100                                         ((instr & 0xd00) == 0x900) ||
48101                                         ((instr & 0xe00) == 0xe00)) {
48102                                       UnallocatedA32(instr);
48103                                       return;
48104                                     }
48105                                     unsigned cmode = (instr >> 8) & 0xf;
48106                                     DataType dt =
48107                                         ImmediateVmvn::DecodeDt(cmode);
48108                                     if (dt.Is(kDataTypeValueInvalid)) {
48109                                       UnallocatedA32(instr);
48110                                       return;
48111                                     }
48112                                     if (((instr >> 12) & 1) != 0) {
48113                                       UnallocatedA32(instr);
48114                                       return;
48115                                     }
48116                                     unsigned rd =
48117                                         ExtractQRegister(instr, 22, 12);
48118                                     QOperand imm =
48119                                         ImmediateVmvn::DecodeImmediate(
48120                                             cmode,
48121                                             (instr & 0xf) |
48122                                                 ((instr >> 12) & 0x70) |
48123                                                 ((instr >> 17) & 0x80));
48124                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48125                                     vmvn(al, dt, QRegister(rd), imm);
48126                                     break;
48127                                   }
48128                                   default: {
48129                                     if (((instr & 0x920) == 0x100) ||
48130                                         ((instr & 0x520) == 0x100) ||
48131                                         ((instr & 0x820) == 0x20) ||
48132                                         ((instr & 0x420) == 0x20) ||
48133                                         ((instr & 0x220) == 0x20) ||
48134                                         ((instr & 0x120) == 0x120)) {
48135                                       UnallocatedA32(instr);
48136                                       return;
48137                                     }
48138                                     unsigned cmode = ((instr >> 8) & 0xf) |
48139                                                      ((instr >> 1) & 0x10);
48140                                     DataType dt =
48141                                         ImmediateVmov::DecodeDt(cmode);
48142                                     if (dt.Is(kDataTypeValueInvalid)) {
48143                                       UnallocatedA32(instr);
48144                                       return;
48145                                     }
48146                                     if (((instr >> 12) & 1) != 0) {
48147                                       UnallocatedA32(instr);
48148                                       return;
48149                                     }
48150                                     unsigned rd =
48151                                         ExtractQRegister(instr, 22, 12);
48152                                     QOperand imm =
48153                                         ImmediateVmov::DecodeImmediate(
48154                                             cmode,
48155                                             (instr & 0xf) |
48156                                                 ((instr >> 12) & 0x70) |
48157                                                 ((instr >> 17) & 0x80));
48158                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48159                                     vmov(al, dt, QRegister(rd), imm);
48160                                     break;
48161                                   }
48162                                 }
48163                                 break;
48164                               }
48165                             }
48166                             break;
48167                           }
48168                           case 0x00000100: {
48169                             // 0xf2800150
48170                             switch (instr & 0x00000020) {
48171                               case 0x00000000: {
48172                                 // 0xf2800150
48173                                 if (((instr & 0x100) == 0x0) ||
48174                                     ((instr & 0xc00) == 0xc00)) {
48175                                   UnallocatedA32(instr);
48176                                   return;
48177                                 }
48178                                 unsigned cmode = (instr >> 8) & 0xf;
48179                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
48180                                 if (dt.Is(kDataTypeValueInvalid)) {
48181                                   UnallocatedA32(instr);
48182                                   return;
48183                                 }
48184                                 if (((instr >> 12) & 1) != 0) {
48185                                   UnallocatedA32(instr);
48186                                   return;
48187                                 }
48188                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48189                                 QOperand imm = ImmediateVorr::DecodeImmediate(
48190                                     cmode,
48191                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
48192                                         ((instr >> 17) & 0x80));
48193                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48194                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
48195                                 break;
48196                               }
48197                               case 0x00000020: {
48198                                 // 0xf2800170
48199                                 if (((instr & 0x100) == 0x0) ||
48200                                     ((instr & 0xc00) == 0xc00)) {
48201                                   UnallocatedA32(instr);
48202                                   return;
48203                                 }
48204                                 unsigned cmode = (instr >> 8) & 0xf;
48205                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
48206                                 if (dt.Is(kDataTypeValueInvalid)) {
48207                                   UnallocatedA32(instr);
48208                                   return;
48209                                 }
48210                                 if (((instr >> 12) & 1) != 0) {
48211                                   UnallocatedA32(instr);
48212                                   return;
48213                                 }
48214                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48215                                 QOperand imm = ImmediateVbic::DecodeImmediate(
48216                                     cmode,
48217                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
48218                                         ((instr >> 17) & 0x80));
48219                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48220                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
48221                                 break;
48222                               }
48223                             }
48224                             break;
48225                           }
48226                         }
48227                         break;
48228                       }
48229                       default: {
48230                         switch (instr & 0x00000300) {
48231                           case 0x00000000: {
48232                             // 0xf2800050
48233                             if (((instr & 0x380080) == 0x0)) {
48234                               UnallocatedA32(instr);
48235                               return;
48236                             }
48237                             DataType dt =
48238                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48239                                                        ((instr >> 4) & 0x8),
48240                                                    (instr >> 24) & 0x1);
48241                             if (dt.Is(kDataTypeValueInvalid)) {
48242                               UnallocatedA32(instr);
48243                               return;
48244                             }
48245                             if (((instr >> 12) & 1) != 0) {
48246                               UnallocatedA32(instr);
48247                               return;
48248                             }
48249                             unsigned rd = ExtractQRegister(instr, 22, 12);
48250                             if ((instr & 1) != 0) {
48251                               UnallocatedA32(instr);
48252                               return;
48253                             }
48254                             unsigned rm = ExtractQRegister(instr, 5, 0);
48255                             uint32_t imm6 = (instr >> 16) & 0x3f;
48256                             uint32_t imm =
48257                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48258                                 imm6;
48259                             // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48260                             vshr(al, dt, QRegister(rd), QRegister(rm), imm);
48261                             break;
48262                           }
48263                           case 0x00000100: {
48264                             // 0xf2800150
48265                             if (((instr & 0x380080) == 0x0)) {
48266                               UnallocatedA32(instr);
48267                               return;
48268                             }
48269                             DataType dt =
48270                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48271                                                        ((instr >> 4) & 0x8),
48272                                                    (instr >> 24) & 0x1);
48273                             if (dt.Is(kDataTypeValueInvalid)) {
48274                               UnallocatedA32(instr);
48275                               return;
48276                             }
48277                             if (((instr >> 12) & 1) != 0) {
48278                               UnallocatedA32(instr);
48279                               return;
48280                             }
48281                             unsigned rd = ExtractQRegister(instr, 22, 12);
48282                             if ((instr & 1) != 0) {
48283                               UnallocatedA32(instr);
48284                               return;
48285                             }
48286                             unsigned rm = ExtractQRegister(instr, 5, 0);
48287                             uint32_t imm6 = (instr >> 16) & 0x3f;
48288                             uint32_t imm =
48289                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48290                                 imm6;
48291                             // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48292                             vsra(al, dt, QRegister(rd), QRegister(rm), imm);
48293                             break;
48294                           }
48295                           case 0x00000200: {
48296                             // 0xf2800250
48297                             if (((instr & 0x380080) == 0x0)) {
48298                               UnallocatedA32(instr);
48299                               return;
48300                             }
48301                             DataType dt =
48302                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48303                                                        ((instr >> 4) & 0x8),
48304                                                    (instr >> 24) & 0x1);
48305                             if (dt.Is(kDataTypeValueInvalid)) {
48306                               UnallocatedA32(instr);
48307                               return;
48308                             }
48309                             if (((instr >> 12) & 1) != 0) {
48310                               UnallocatedA32(instr);
48311                               return;
48312                             }
48313                             unsigned rd = ExtractQRegister(instr, 22, 12);
48314                             if ((instr & 1) != 0) {
48315                               UnallocatedA32(instr);
48316                               return;
48317                             }
48318                             unsigned rm = ExtractQRegister(instr, 5, 0);
48319                             uint32_t imm6 = (instr >> 16) & 0x3f;
48320                             uint32_t imm =
48321                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48322                                 imm6;
48323                             // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48324                             vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
48325                             break;
48326                           }
48327                           case 0x00000300: {
48328                             // 0xf2800350
48329                             if (((instr & 0x380080) == 0x0)) {
48330                               UnallocatedA32(instr);
48331                               return;
48332                             }
48333                             DataType dt =
48334                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48335                                                        ((instr >> 4) & 0x8),
48336                                                    (instr >> 24) & 0x1);
48337                             if (dt.Is(kDataTypeValueInvalid)) {
48338                               UnallocatedA32(instr);
48339                               return;
48340                             }
48341                             if (((instr >> 12) & 1) != 0) {
48342                               UnallocatedA32(instr);
48343                               return;
48344                             }
48345                             unsigned rd = ExtractQRegister(instr, 22, 12);
48346                             if ((instr & 1) != 0) {
48347                               UnallocatedA32(instr);
48348                               return;
48349                             }
48350                             unsigned rm = ExtractQRegister(instr, 5, 0);
48351                             uint32_t imm6 = (instr >> 16) & 0x3f;
48352                             uint32_t imm =
48353                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48354                                 imm6;
48355                             // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48356                             vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
48357                             break;
48358                           }
48359                         }
48360                         break;
48361                       }
48362                     }
48363                     break;
48364                   }
48365                   case 0x00000400: {
48366                     // 0xf2800450
48367                     switch (instr & 0x00380080) {
48368                       case 0x00000000: {
48369                         // 0xf2800450
48370                         switch (instr & 0x00000100) {
48371                           case 0x00000000: {
48372                             // 0xf2800450
48373                             switch (instr & 0x00000200) {
48374                               default: {
48375                                 switch (instr & 0x00000020) {
48376                                   case 0x00000020: {
48377                                     // 0xf2800470
48378                                     if (((instr & 0xd00) == 0x100) ||
48379                                         ((instr & 0xd00) == 0x500) ||
48380                                         ((instr & 0xd00) == 0x900) ||
48381                                         ((instr & 0xe00) == 0xe00)) {
48382                                       UnallocatedA32(instr);
48383                                       return;
48384                                     }
48385                                     unsigned cmode = (instr >> 8) & 0xf;
48386                                     DataType dt =
48387                                         ImmediateVmvn::DecodeDt(cmode);
48388                                     if (dt.Is(kDataTypeValueInvalid)) {
48389                                       UnallocatedA32(instr);
48390                                       return;
48391                                     }
48392                                     if (((instr >> 12) & 1) != 0) {
48393                                       UnallocatedA32(instr);
48394                                       return;
48395                                     }
48396                                     unsigned rd =
48397                                         ExtractQRegister(instr, 22, 12);
48398                                     QOperand imm =
48399                                         ImmediateVmvn::DecodeImmediate(
48400                                             cmode,
48401                                             (instr & 0xf) |
48402                                                 ((instr >> 12) & 0x70) |
48403                                                 ((instr >> 17) & 0x80));
48404                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48405                                     vmvn(al, dt, QRegister(rd), imm);
48406                                     break;
48407                                   }
48408                                   default: {
48409                                     if (((instr & 0x920) == 0x100) ||
48410                                         ((instr & 0x520) == 0x100) ||
48411                                         ((instr & 0x820) == 0x20) ||
48412                                         ((instr & 0x420) == 0x20) ||
48413                                         ((instr & 0x220) == 0x20) ||
48414                                         ((instr & 0x120) == 0x120)) {
48415                                       UnallocatedA32(instr);
48416                                       return;
48417                                     }
48418                                     unsigned cmode = ((instr >> 8) & 0xf) |
48419                                                      ((instr >> 1) & 0x10);
48420                                     DataType dt =
48421                                         ImmediateVmov::DecodeDt(cmode);
48422                                     if (dt.Is(kDataTypeValueInvalid)) {
48423                                       UnallocatedA32(instr);
48424                                       return;
48425                                     }
48426                                     if (((instr >> 12) & 1) != 0) {
48427                                       UnallocatedA32(instr);
48428                                       return;
48429                                     }
48430                                     unsigned rd =
48431                                         ExtractQRegister(instr, 22, 12);
48432                                     QOperand imm =
48433                                         ImmediateVmov::DecodeImmediate(
48434                                             cmode,
48435                                             (instr & 0xf) |
48436                                                 ((instr >> 12) & 0x70) |
48437                                                 ((instr >> 17) & 0x80));
48438                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48439                                     vmov(al, dt, QRegister(rd), imm);
48440                                     break;
48441                                   }
48442                                 }
48443                                 break;
48444                               }
48445                             }
48446                             break;
48447                           }
48448                           case 0x00000100: {
48449                             // 0xf2800550
48450                             switch (instr & 0x00000020) {
48451                               case 0x00000000: {
48452                                 // 0xf2800550
48453                                 if (((instr & 0x100) == 0x0) ||
48454                                     ((instr & 0xc00) == 0xc00)) {
48455                                   UnallocatedA32(instr);
48456                                   return;
48457                                 }
48458                                 unsigned cmode = (instr >> 8) & 0xf;
48459                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
48460                                 if (dt.Is(kDataTypeValueInvalid)) {
48461                                   UnallocatedA32(instr);
48462                                   return;
48463                                 }
48464                                 if (((instr >> 12) & 1) != 0) {
48465                                   UnallocatedA32(instr);
48466                                   return;
48467                                 }
48468                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48469                                 QOperand imm = ImmediateVorr::DecodeImmediate(
48470                                     cmode,
48471                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
48472                                         ((instr >> 17) & 0x80));
48473                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48474                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
48475                                 break;
48476                               }
48477                               case 0x00000020: {
48478                                 // 0xf2800570
48479                                 if (((instr & 0x100) == 0x0) ||
48480                                     ((instr & 0xc00) == 0xc00)) {
48481                                   UnallocatedA32(instr);
48482                                   return;
48483                                 }
48484                                 unsigned cmode = (instr >> 8) & 0xf;
48485                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
48486                                 if (dt.Is(kDataTypeValueInvalid)) {
48487                                   UnallocatedA32(instr);
48488                                   return;
48489                                 }
48490                                 if (((instr >> 12) & 1) != 0) {
48491                                   UnallocatedA32(instr);
48492                                   return;
48493                                 }
48494                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48495                                 QOperand imm = ImmediateVbic::DecodeImmediate(
48496                                     cmode,
48497                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
48498                                         ((instr >> 17) & 0x80));
48499                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48500                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
48501                                 break;
48502                               }
48503                             }
48504                             break;
48505                           }
48506                         }
48507                         break;
48508                       }
48509                       default: {
48510                         switch (instr & 0x00000300) {
48511                           case 0x00000000: {
48512                             // 0xf2800450
48513                             if ((instr & 0x01000000) == 0x01000000) {
48514                               if (((instr & 0x380080) == 0x0)) {
48515                                 UnallocatedA32(instr);
48516                                 return;
48517                               }
48518                               DataType dt = Dt_L_imm6_4_Decode(
48519                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
48520                               if (dt.Is(kDataTypeValueInvalid)) {
48521                                 UnallocatedA32(instr);
48522                                 return;
48523                               }
48524                               if (((instr >> 12) & 1) != 0) {
48525                                 UnallocatedA32(instr);
48526                                 return;
48527                               }
48528                               unsigned rd = ExtractQRegister(instr, 22, 12);
48529                               if ((instr & 1) != 0) {
48530                                 UnallocatedA32(instr);
48531                                 return;
48532                               }
48533                               unsigned rm = ExtractQRegister(instr, 5, 0);
48534                               uint32_t imm6 = (instr >> 16) & 0x3f;
48535                               uint32_t imm =
48536                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
48537                                   imm6;
48538                               // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48539                               vsri(al, dt, QRegister(rd), QRegister(rm), imm);
48540                             } else {
48541                               UnallocatedA32(instr);
48542                             }
48543                             break;
48544                           }
48545                           case 0x00000100: {
48546                             // 0xf2800550
48547                             switch (instr & 0x01000000) {
48548                               case 0x00000000: {
48549                                 // 0xf2800550
48550                                 if (((instr & 0x380080) == 0x0)) {
48551                                   UnallocatedA32(instr);
48552                                   return;
48553                                 }
48554                                 DataType dt =
48555                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
48556                                                        ((instr >> 4) & 0x8));
48557                                 if (dt.Is(kDataTypeValueInvalid)) {
48558                                   UnallocatedA32(instr);
48559                                   return;
48560                                 }
48561                                 if (((instr >> 12) & 1) != 0) {
48562                                   UnallocatedA32(instr);
48563                                   return;
48564                                 }
48565                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48566                                 if ((instr & 1) != 0) {
48567                                   UnallocatedA32(instr);
48568                                   return;
48569                                 }
48570                                 unsigned rm = ExtractQRegister(instr, 5, 0);
48571                                 uint32_t imm6 = (instr >> 16) & 0x3f;
48572                                 uint32_t imm =
48573                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48574                                 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48575                                 vshl(al, dt, QRegister(rd), QRegister(rm), imm);
48576                                 break;
48577                               }
48578                               case 0x01000000: {
48579                                 // 0xf3800550
48580                                 if (((instr & 0x380080) == 0x0)) {
48581                                   UnallocatedA32(instr);
48582                                   return;
48583                                 }
48584                                 DataType dt =
48585                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
48586                                                        ((instr >> 4) & 0x8));
48587                                 if (dt.Is(kDataTypeValueInvalid)) {
48588                                   UnallocatedA32(instr);
48589                                   return;
48590                                 }
48591                                 if (((instr >> 12) & 1) != 0) {
48592                                   UnallocatedA32(instr);
48593                                   return;
48594                                 }
48595                                 unsigned rd = ExtractQRegister(instr, 22, 12);
48596                                 if ((instr & 1) != 0) {
48597                                   UnallocatedA32(instr);
48598                                   return;
48599                                 }
48600                                 unsigned rm = ExtractQRegister(instr, 5, 0);
48601                                 uint32_t imm6 = (instr >> 16) & 0x3f;
48602                                 uint32_t imm =
48603                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48604                                 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
48605                                 vsli(al, dt, QRegister(rd), QRegister(rm), imm);
48606                                 break;
48607                               }
48608                             }
48609                             break;
48610                           }
48611                           case 0x00000200: {
48612                             // 0xf2800650
48613                             if (((instr & 0x380080) == 0x0)) {
48614                               UnallocatedA32(instr);
48615                               return;
48616                             }
48617                             DataType dt =
48618                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
48619                                                        ((instr >> 4) & 0x8),
48620                                                    (instr >> 24) & 0x1);
48621                             if (dt.Is(kDataTypeValueInvalid)) {
48622                               UnallocatedA32(instr);
48623                               return;
48624                             }
48625                             if (((instr >> 12) & 1) != 0) {
48626                               UnallocatedA32(instr);
48627                               return;
48628                             }
48629                             unsigned rd = ExtractQRegister(instr, 22, 12);
48630                             if ((instr & 1) != 0) {
48631                               UnallocatedA32(instr);
48632                               return;
48633                             }
48634                             unsigned rm = ExtractQRegister(instr, 5, 0);
48635                             uint32_t imm6 = (instr >> 16) & 0x3f;
48636                             uint32_t imm =
48637                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48638                             // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48639                             vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
48640                             break;
48641                           }
48642                           case 0x00000300: {
48643                             // 0xf2800750
48644                             if (((instr & 0x380080) == 0x0)) {
48645                               UnallocatedA32(instr);
48646                               return;
48647                             }
48648                             DataType dt =
48649                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
48650                                                        ((instr >> 4) & 0x8),
48651                                                    (instr >> 24) & 0x1);
48652                             if (dt.Is(kDataTypeValueInvalid)) {
48653                               UnallocatedA32(instr);
48654                               return;
48655                             }
48656                             if (((instr >> 12) & 1) != 0) {
48657                               UnallocatedA32(instr);
48658                               return;
48659                             }
48660                             unsigned rd = ExtractQRegister(instr, 22, 12);
48661                             if ((instr & 1) != 0) {
48662                               UnallocatedA32(instr);
48663                               return;
48664                             }
48665                             unsigned rm = ExtractQRegister(instr, 5, 0);
48666                             uint32_t imm6 = (instr >> 16) & 0x3f;
48667                             uint32_t imm =
48668                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
48669                             // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48670                             vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
48671                             break;
48672                           }
48673                         }
48674                         break;
48675                       }
48676                     }
48677                     break;
48678                   }
48679                   case 0x00000800: {
48680                     // 0xf2800850
48681                     switch (instr & 0x00000080) {
48682                       case 0x00000000: {
48683                         // 0xf2800850
48684                         switch (instr & 0x00380000) {
48685                           case 0x00000000: {
48686                             // 0xf2800850
48687                             switch (instr & 0x00000100) {
48688                               case 0x00000000: {
48689                                 // 0xf2800850
48690                                 switch (instr & 0x00000200) {
48691                                   default: {
48692                                     switch (instr & 0x00000020) {
48693                                       case 0x00000020: {
48694                                         // 0xf2800870
48695                                         if (((instr & 0xd00) == 0x100) ||
48696                                             ((instr & 0xd00) == 0x500) ||
48697                                             ((instr & 0xd00) == 0x900) ||
48698                                             ((instr & 0xe00) == 0xe00)) {
48699                                           UnallocatedA32(instr);
48700                                           return;
48701                                         }
48702                                         unsigned cmode = (instr >> 8) & 0xf;
48703                                         DataType dt =
48704                                             ImmediateVmvn::DecodeDt(cmode);
48705                                         if (dt.Is(kDataTypeValueInvalid)) {
48706                                           UnallocatedA32(instr);
48707                                           return;
48708                                         }
48709                                         if (((instr >> 12) & 1) != 0) {
48710                                           UnallocatedA32(instr);
48711                                           return;
48712                                         }
48713                                         unsigned rd =
48714                                             ExtractQRegister(instr, 22, 12);
48715                                         QOperand imm =
48716                                             ImmediateVmvn::DecodeImmediate(
48717                                                 cmode,
48718                                                 (instr & 0xf) |
48719                                                     ((instr >> 12) & 0x70) |
48720                                                     ((instr >> 17) & 0x80));
48721                                         // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48722                                         vmvn(al, dt, QRegister(rd), imm);
48723                                         break;
48724                                       }
48725                                       default: {
48726                                         if (((instr & 0x920) == 0x100) ||
48727                                             ((instr & 0x520) == 0x100) ||
48728                                             ((instr & 0x820) == 0x20) ||
48729                                             ((instr & 0x420) == 0x20) ||
48730                                             ((instr & 0x220) == 0x20) ||
48731                                             ((instr & 0x120) == 0x120)) {
48732                                           UnallocatedA32(instr);
48733                                           return;
48734                                         }
48735                                         unsigned cmode = ((instr >> 8) & 0xf) |
48736                                                          ((instr >> 1) & 0x10);
48737                                         DataType dt =
48738                                             ImmediateVmov::DecodeDt(cmode);
48739                                         if (dt.Is(kDataTypeValueInvalid)) {
48740                                           UnallocatedA32(instr);
48741                                           return;
48742                                         }
48743                                         if (((instr >> 12) & 1) != 0) {
48744                                           UnallocatedA32(instr);
48745                                           return;
48746                                         }
48747                                         unsigned rd =
48748                                             ExtractQRegister(instr, 22, 12);
48749                                         QOperand imm =
48750                                             ImmediateVmov::DecodeImmediate(
48751                                                 cmode,
48752                                                 (instr & 0xf) |
48753                                                     ((instr >> 12) & 0x70) |
48754                                                     ((instr >> 17) & 0x80));
48755                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48756                                         vmov(al, dt, QRegister(rd), imm);
48757                                         break;
48758                                       }
48759                                     }
48760                                     break;
48761                                   }
48762                                 }
48763                                 break;
48764                               }
48765                               case 0x00000100: {
48766                                 // 0xf2800950
48767                                 switch (instr & 0x00000020) {
48768                                   case 0x00000000: {
48769                                     // 0xf2800950
48770                                     if (((instr & 0x100) == 0x0) ||
48771                                         ((instr & 0xc00) == 0xc00)) {
48772                                       UnallocatedA32(instr);
48773                                       return;
48774                                     }
48775                                     unsigned cmode = (instr >> 8) & 0xf;
48776                                     DataType dt =
48777                                         ImmediateVorr::DecodeDt(cmode);
48778                                     if (dt.Is(kDataTypeValueInvalid)) {
48779                                       UnallocatedA32(instr);
48780                                       return;
48781                                     }
48782                                     if (((instr >> 12) & 1) != 0) {
48783                                       UnallocatedA32(instr);
48784                                       return;
48785                                     }
48786                                     unsigned rd =
48787                                         ExtractQRegister(instr, 22, 12);
48788                                     QOperand imm =
48789                                         ImmediateVorr::DecodeImmediate(
48790                                             cmode,
48791                                             (instr & 0xf) |
48792                                                 ((instr >> 12) & 0x70) |
48793                                                 ((instr >> 17) & 0x80));
48794                                     // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48795                                     vorr(al,
48796                                          dt,
48797                                          QRegister(rd),
48798                                          QRegister(rd),
48799                                          imm);
48800                                     break;
48801                                   }
48802                                   case 0x00000020: {
48803                                     // 0xf2800970
48804                                     if (((instr & 0x100) == 0x0) ||
48805                                         ((instr & 0xc00) == 0xc00)) {
48806                                       UnallocatedA32(instr);
48807                                       return;
48808                                     }
48809                                     unsigned cmode = (instr >> 8) & 0xf;
48810                                     DataType dt =
48811                                         ImmediateVbic::DecodeDt(cmode);
48812                                     if (dt.Is(kDataTypeValueInvalid)) {
48813                                       UnallocatedA32(instr);
48814                                       return;
48815                                     }
48816                                     if (((instr >> 12) & 1) != 0) {
48817                                       UnallocatedA32(instr);
48818                                       return;
48819                                     }
48820                                     unsigned rd =
48821                                         ExtractQRegister(instr, 22, 12);
48822                                     QOperand imm =
48823                                         ImmediateVbic::DecodeImmediate(
48824                                             cmode,
48825                                             (instr & 0xf) |
48826                                                 ((instr >> 12) & 0x70) |
48827                                                 ((instr >> 17) & 0x80));
48828                                     // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
48829                                     vbic(al,
48830                                          dt,
48831                                          QRegister(rd),
48832                                          QRegister(rd),
48833                                          imm);
48834                                     break;
48835                                   }
48836                                 }
48837                                 break;
48838                               }
48839                             }
48840                             break;
48841                           }
48842                           default: {
48843                             switch (instr & 0x00000300) {
48844                               case 0x00000000: {
48845                                 // 0xf2800850
48846                                 switch (instr & 0x01000000) {
48847                                   case 0x00000000: {
48848                                     // 0xf2800850
48849                                     if (((instr & 0x380000) == 0x0)) {
48850                                       UnallocatedA32(instr);
48851                                       return;
48852                                     }
48853                                     DataType dt =
48854                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
48855                                     if (dt.Is(kDataTypeValueInvalid)) {
48856                                       UnallocatedA32(instr);
48857                                       return;
48858                                     }
48859                                     unsigned rd =
48860                                         ExtractDRegister(instr, 22, 12);
48861                                     if ((instr & 1) != 0) {
48862                                       UnallocatedA32(instr);
48863                                       return;
48864                                     }
48865                                     unsigned rm = ExtractQRegister(instr, 5, 0);
48866                                     uint32_t imm6 = (instr >> 16) & 0x3f;
48867                                     uint32_t imm = dt.GetSize() - imm6;
48868                                     // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48869                                     vrshrn(al,
48870                                            dt,
48871                                            DRegister(rd),
48872                                            QRegister(rm),
48873                                            imm);
48874                                     break;
48875                                   }
48876                                   case 0x01000000: {
48877                                     // 0xf3800850
48878                                     if (((instr & 0x380000) == 0x0)) {
48879                                       UnallocatedA32(instr);
48880                                       return;
48881                                     }
48882                                     DataType dt =
48883                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
48884                                                          (instr >> 24) & 0x1);
48885                                     if (dt.Is(kDataTypeValueInvalid)) {
48886                                       UnallocatedA32(instr);
48887                                       return;
48888                                     }
48889                                     unsigned rd =
48890                                         ExtractDRegister(instr, 22, 12);
48891                                     if ((instr & 1) != 0) {
48892                                       UnallocatedA32(instr);
48893                                       return;
48894                                     }
48895                                     unsigned rm = ExtractQRegister(instr, 5, 0);
48896                                     uint32_t imm6 = (instr >> 16) & 0x3f;
48897                                     uint32_t imm = dt.GetSize() - imm6;
48898                                     // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48899                                     vqrshrun(al,
48900                                              dt,
48901                                              DRegister(rd),
48902                                              QRegister(rm),
48903                                              imm);
48904                                     break;
48905                                   }
48906                                 }
48907                                 break;
48908                               }
48909                               case 0x00000100: {
48910                                 // 0xf2800950
48911                                 if (((instr & 0x380000) == 0x0)) {
48912                                   UnallocatedA32(instr);
48913                                   return;
48914                                 }
48915                                 DataType dt =
48916                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
48917                                                      (instr >> 24) & 0x1);
48918                                 if (dt.Is(kDataTypeValueInvalid)) {
48919                                   UnallocatedA32(instr);
48920                                   return;
48921                                 }
48922                                 unsigned rd = ExtractDRegister(instr, 22, 12);
48923                                 if ((instr & 1) != 0) {
48924                                   UnallocatedA32(instr);
48925                                   return;
48926                                 }
48927                                 unsigned rm = ExtractQRegister(instr, 5, 0);
48928                                 uint32_t imm6 = (instr >> 16) & 0x3f;
48929                                 uint32_t imm = dt.GetSize() - imm6;
48930                                 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
48931                                 vqrshrn(al,
48932                                         dt,
48933                                         DRegister(rd),
48934                                         QRegister(rm),
48935                                         imm);
48936                                 break;
48937                               }
48938                               default:
48939                                 UnallocatedA32(instr);
48940                                 break;
48941                             }
48942                             break;
48943                           }
48944                         }
48945                         break;
48946                       }
48947                       default:
48948                         UnallocatedA32(instr);
48949                         break;
48950                     }
48951                     break;
48952                   }
48953                   case 0x00000c00: {
48954                     // 0xf2800c50
48955                     switch (instr & 0x00000080) {
48956                       case 0x00000000: {
48957                         // 0xf2800c50
48958                         switch (instr & 0x00200000) {
48959                           case 0x00000000: {
48960                             // 0xf2800c50
48961                             switch (instr & 0x00180000) {
48962                               case 0x00000000: {
48963                                 // 0xf2800c50
48964                                 switch (instr & 0x00000300) {
48965                                   case 0x00000200: {
48966                                     // 0xf2800e50
48967                                     if (((instr & 0x920) == 0x100) ||
48968                                         ((instr & 0x520) == 0x100) ||
48969                                         ((instr & 0x820) == 0x20) ||
48970                                         ((instr & 0x420) == 0x20) ||
48971                                         ((instr & 0x220) == 0x20) ||
48972                                         ((instr & 0x120) == 0x120)) {
48973                                       UnallocatedA32(instr);
48974                                       return;
48975                                     }
48976                                     unsigned cmode = ((instr >> 8) & 0xf) |
48977                                                      ((instr >> 1) & 0x10);
48978                                     DataType dt =
48979                                         ImmediateVmov::DecodeDt(cmode);
48980                                     if (dt.Is(kDataTypeValueInvalid)) {
48981                                       UnallocatedA32(instr);
48982                                       return;
48983                                     }
48984                                     if (((instr >> 12) & 1) != 0) {
48985                                       UnallocatedA32(instr);
48986                                       return;
48987                                     }
48988                                     unsigned rd =
48989                                         ExtractQRegister(instr, 22, 12);
48990                                     QOperand imm =
48991                                         ImmediateVmov::DecodeImmediate(
48992                                             cmode,
48993                                             (instr & 0xf) |
48994                                                 ((instr >> 12) & 0x70) |
48995                                                 ((instr >> 17) & 0x80));
48996                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
48997                                     vmov(al, dt, QRegister(rd), imm);
48998                                     break;
48999                                   }
49000                                   case 0x00000300: {
49001                                     // 0xf2800f50
49002                                     if (((instr & 0x920) == 0x100) ||
49003                                         ((instr & 0x520) == 0x100) ||
49004                                         ((instr & 0x820) == 0x20) ||
49005                                         ((instr & 0x420) == 0x20) ||
49006                                         ((instr & 0x220) == 0x20) ||
49007                                         ((instr & 0x120) == 0x120)) {
49008                                       UnallocatedA32(instr);
49009                                       return;
49010                                     }
49011                                     unsigned cmode = ((instr >> 8) & 0xf) |
49012                                                      ((instr >> 1) & 0x10);
49013                                     DataType dt =
49014                                         ImmediateVmov::DecodeDt(cmode);
49015                                     if (dt.Is(kDataTypeValueInvalid)) {
49016                                       UnallocatedA32(instr);
49017                                       return;
49018                                     }
49019                                     if (((instr >> 12) & 1) != 0) {
49020                                       UnallocatedA32(instr);
49021                                       return;
49022                                     }
49023                                     unsigned rd =
49024                                         ExtractQRegister(instr, 22, 12);
49025                                     QOperand imm =
49026                                         ImmediateVmov::DecodeImmediate(
49027                                             cmode,
49028                                             (instr & 0xf) |
49029                                                 ((instr >> 12) & 0x70) |
49030                                                 ((instr >> 17) & 0x80));
49031                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49032                                     vmov(al, dt, QRegister(rd), imm);
49033                                     break;
49034                                   }
49035                                   default: {
49036                                     switch (instr & 0x00000020) {
49037                                       case 0x00000020: {
49038                                         // 0xf2800c70
49039                                         switch (instr & 0x00000f20) {
49040                                           case 0x00000000: {
49041                                             // 0xf2800c50
49042                                             if (((instr & 0x920) == 0x100) ||
49043                                                 ((instr & 0x520) == 0x100) ||
49044                                                 ((instr & 0x820) == 0x20) ||
49045                                                 ((instr & 0x420) == 0x20) ||
49046                                                 ((instr & 0x220) == 0x20) ||
49047                                                 ((instr & 0x120) == 0x120)) {
49048                                               UnallocatedA32(instr);
49049                                               return;
49050                                             }
49051                                             unsigned cmode =
49052                                                 ((instr >> 8) & 0xf) |
49053                                                 ((instr >> 1) & 0x10);
49054                                             DataType dt =
49055                                                 ImmediateVmov::DecodeDt(cmode);
49056                                             if (dt.Is(kDataTypeValueInvalid)) {
49057                                               UnallocatedA32(instr);
49058                                               return;
49059                                             }
49060                                             if (((instr >> 12) & 1) != 0) {
49061                                               UnallocatedA32(instr);
49062                                               return;
49063                                             }
49064                                             unsigned rd =
49065                                                 ExtractQRegister(instr, 22, 12);
49066                                             QOperand imm =
49067                                                 ImmediateVmov::DecodeImmediate(
49068                                                     cmode,
49069                                                     (instr & 0xf) |
49070                                                         ((instr >> 12) & 0x70) |
49071                                                         ((instr >> 17) & 0x80));
49072                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49073                                             vmov(al, dt, QRegister(rd), imm);
49074                                             break;
49075                                           }
49076                                           case 0x00000020: {
49077                                             // 0xf2800c70
49078                                             if (((instr & 0xd00) == 0x100) ||
49079                                                 ((instr & 0xd00) == 0x500) ||
49080                                                 ((instr & 0xd00) == 0x900) ||
49081                                                 ((instr & 0xe00) == 0xe00)) {
49082                                               UnallocatedA32(instr);
49083                                               return;
49084                                             }
49085                                             unsigned cmode = (instr >> 8) & 0xf;
49086                                             DataType dt =
49087                                                 ImmediateVmvn::DecodeDt(cmode);
49088                                             if (dt.Is(kDataTypeValueInvalid)) {
49089                                               UnallocatedA32(instr);
49090                                               return;
49091                                             }
49092                                             if (((instr >> 12) & 1) != 0) {
49093                                               UnallocatedA32(instr);
49094                                               return;
49095                                             }
49096                                             unsigned rd =
49097                                                 ExtractQRegister(instr, 22, 12);
49098                                             QOperand imm =
49099                                                 ImmediateVmvn::DecodeImmediate(
49100                                                     cmode,
49101                                                     (instr & 0xf) |
49102                                                         ((instr >> 12) & 0x70) |
49103                                                         ((instr >> 17) & 0x80));
49104                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49105                                             vmvn(al, dt, QRegister(rd), imm);
49106                                             break;
49107                                           }
49108                                           case 0x00000200: {
49109                                             // 0xf2800e50
49110                                             if (((instr & 0x920) == 0x100) ||
49111                                                 ((instr & 0x520) == 0x100) ||
49112                                                 ((instr & 0x820) == 0x20) ||
49113                                                 ((instr & 0x420) == 0x20) ||
49114                                                 ((instr & 0x220) == 0x20) ||
49115                                                 ((instr & 0x120) == 0x120)) {
49116                                               UnallocatedA32(instr);
49117                                               return;
49118                                             }
49119                                             unsigned cmode =
49120                                                 ((instr >> 8) & 0xf) |
49121                                                 ((instr >> 1) & 0x10);
49122                                             DataType dt =
49123                                                 ImmediateVmov::DecodeDt(cmode);
49124                                             if (dt.Is(kDataTypeValueInvalid)) {
49125                                               UnallocatedA32(instr);
49126                                               return;
49127                                             }
49128                                             if (((instr >> 12) & 1) != 0) {
49129                                               UnallocatedA32(instr);
49130                                               return;
49131                                             }
49132                                             unsigned rd =
49133                                                 ExtractQRegister(instr, 22, 12);
49134                                             QOperand imm =
49135                                                 ImmediateVmov::DecodeImmediate(
49136                                                     cmode,
49137                                                     (instr & 0xf) |
49138                                                         ((instr >> 12) & 0x70) |
49139                                                         ((instr >> 17) & 0x80));
49140                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49141                                             vmov(al, dt, QRegister(rd), imm);
49142                                             break;
49143                                           }
49144                                           case 0x00000220: {
49145                                             // 0xf2800e70
49146                                             if (((instr & 0xd00) == 0x100) ||
49147                                                 ((instr & 0xd00) == 0x500) ||
49148                                                 ((instr & 0xd00) == 0x900) ||
49149                                                 ((instr & 0xe00) == 0xe00)) {
49150                                               UnallocatedA32(instr);
49151                                               return;
49152                                             }
49153                                             unsigned cmode = (instr >> 8) & 0xf;
49154                                             DataType dt =
49155                                                 ImmediateVmvn::DecodeDt(cmode);
49156                                             if (dt.Is(kDataTypeValueInvalid)) {
49157                                               UnallocatedA32(instr);
49158                                               return;
49159                                             }
49160                                             if (((instr >> 12) & 1) != 0) {
49161                                               UnallocatedA32(instr);
49162                                               return;
49163                                             }
49164                                             unsigned rd =
49165                                                 ExtractQRegister(instr, 22, 12);
49166                                             QOperand imm =
49167                                                 ImmediateVmvn::DecodeImmediate(
49168                                                     cmode,
49169                                                     (instr & 0xf) |
49170                                                         ((instr >> 12) & 0x70) |
49171                                                         ((instr >> 17) & 0x80));
49172                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49173                                             vmvn(al, dt, QRegister(rd), imm);
49174                                             break;
49175                                           }
49176                                           case 0x00000400: {
49177                                             // 0xf2800c50
49178                                             if (((instr & 0x920) == 0x100) ||
49179                                                 ((instr & 0x520) == 0x100) ||
49180                                                 ((instr & 0x820) == 0x20) ||
49181                                                 ((instr & 0x420) == 0x20) ||
49182                                                 ((instr & 0x220) == 0x20) ||
49183                                                 ((instr & 0x120) == 0x120)) {
49184                                               UnallocatedA32(instr);
49185                                               return;
49186                                             }
49187                                             unsigned cmode =
49188                                                 ((instr >> 8) & 0xf) |
49189                                                 ((instr >> 1) & 0x10);
49190                                             DataType dt =
49191                                                 ImmediateVmov::DecodeDt(cmode);
49192                                             if (dt.Is(kDataTypeValueInvalid)) {
49193                                               UnallocatedA32(instr);
49194                                               return;
49195                                             }
49196                                             if (((instr >> 12) & 1) != 0) {
49197                                               UnallocatedA32(instr);
49198                                               return;
49199                                             }
49200                                             unsigned rd =
49201                                                 ExtractQRegister(instr, 22, 12);
49202                                             QOperand imm =
49203                                                 ImmediateVmov::DecodeImmediate(
49204                                                     cmode,
49205                                                     (instr & 0xf) |
49206                                                         ((instr >> 12) & 0x70) |
49207                                                         ((instr >> 17) & 0x80));
49208                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49209                                             vmov(al, dt, QRegister(rd), imm);
49210                                             break;
49211                                           }
49212                                           case 0x00000420: {
49213                                             // 0xf2800c70
49214                                             if (((instr & 0xd00) == 0x100) ||
49215                                                 ((instr & 0xd00) == 0x500) ||
49216                                                 ((instr & 0xd00) == 0x900) ||
49217                                                 ((instr & 0xe00) == 0xe00)) {
49218                                               UnallocatedA32(instr);
49219                                               return;
49220                                             }
49221                                             unsigned cmode = (instr >> 8) & 0xf;
49222                                             DataType dt =
49223                                                 ImmediateVmvn::DecodeDt(cmode);
49224                                             if (dt.Is(kDataTypeValueInvalid)) {
49225                                               UnallocatedA32(instr);
49226                                               return;
49227                                             }
49228                                             if (((instr >> 12) & 1) != 0) {
49229                                               UnallocatedA32(instr);
49230                                               return;
49231                                             }
49232                                             unsigned rd =
49233                                                 ExtractQRegister(instr, 22, 12);
49234                                             QOperand imm =
49235                                                 ImmediateVmvn::DecodeImmediate(
49236                                                     cmode,
49237                                                     (instr & 0xf) |
49238                                                         ((instr >> 12) & 0x70) |
49239                                                         ((instr >> 17) & 0x80));
49240                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49241                                             vmvn(al, dt, QRegister(rd), imm);
49242                                             break;
49243                                           }
49244                                           case 0x00000600: {
49245                                             // 0xf2800e50
49246                                             if (((instr & 0x920) == 0x100) ||
49247                                                 ((instr & 0x520) == 0x100) ||
49248                                                 ((instr & 0x820) == 0x20) ||
49249                                                 ((instr & 0x420) == 0x20) ||
49250                                                 ((instr & 0x220) == 0x20) ||
49251                                                 ((instr & 0x120) == 0x120)) {
49252                                               UnallocatedA32(instr);
49253                                               return;
49254                                             }
49255                                             unsigned cmode =
49256                                                 ((instr >> 8) & 0xf) |
49257                                                 ((instr >> 1) & 0x10);
49258                                             DataType dt =
49259                                                 ImmediateVmov::DecodeDt(cmode);
49260                                             if (dt.Is(kDataTypeValueInvalid)) {
49261                                               UnallocatedA32(instr);
49262                                               return;
49263                                             }
49264                                             if (((instr >> 12) & 1) != 0) {
49265                                               UnallocatedA32(instr);
49266                                               return;
49267                                             }
49268                                             unsigned rd =
49269                                                 ExtractQRegister(instr, 22, 12);
49270                                             QOperand imm =
49271                                                 ImmediateVmov::DecodeImmediate(
49272                                                     cmode,
49273                                                     (instr & 0xf) |
49274                                                         ((instr >> 12) & 0x70) |
49275                                                         ((instr >> 17) & 0x80));
49276                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49277                                             vmov(al, dt, QRegister(rd), imm);
49278                                             break;
49279                                           }
49280                                           case 0x00000620: {
49281                                             // 0xf2800e70
49282                                             if (((instr & 0xd00) == 0x100) ||
49283                                                 ((instr & 0xd00) == 0x500) ||
49284                                                 ((instr & 0xd00) == 0x900) ||
49285                                                 ((instr & 0xe00) == 0xe00)) {
49286                                               UnallocatedA32(instr);
49287                                               return;
49288                                             }
49289                                             unsigned cmode = (instr >> 8) & 0xf;
49290                                             DataType dt =
49291                                                 ImmediateVmvn::DecodeDt(cmode);
49292                                             if (dt.Is(kDataTypeValueInvalid)) {
49293                                               UnallocatedA32(instr);
49294                                               return;
49295                                             }
49296                                             if (((instr >> 12) & 1) != 0) {
49297                                               UnallocatedA32(instr);
49298                                               return;
49299                                             }
49300                                             unsigned rd =
49301                                                 ExtractQRegister(instr, 22, 12);
49302                                             QOperand imm =
49303                                                 ImmediateVmvn::DecodeImmediate(
49304                                                     cmode,
49305                                                     (instr & 0xf) |
49306                                                         ((instr >> 12) & 0x70) |
49307                                                         ((instr >> 17) & 0x80));
49308                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49309                                             vmvn(al, dt, QRegister(rd), imm);
49310                                             break;
49311                                           }
49312                                           case 0x00000800: {
49313                                             // 0xf2800c50
49314                                             if (((instr & 0x920) == 0x100) ||
49315                                                 ((instr & 0x520) == 0x100) ||
49316                                                 ((instr & 0x820) == 0x20) ||
49317                                                 ((instr & 0x420) == 0x20) ||
49318                                                 ((instr & 0x220) == 0x20) ||
49319                                                 ((instr & 0x120) == 0x120)) {
49320                                               UnallocatedA32(instr);
49321                                               return;
49322                                             }
49323                                             unsigned cmode =
49324                                                 ((instr >> 8) & 0xf) |
49325                                                 ((instr >> 1) & 0x10);
49326                                             DataType dt =
49327                                                 ImmediateVmov::DecodeDt(cmode);
49328                                             if (dt.Is(kDataTypeValueInvalid)) {
49329                                               UnallocatedA32(instr);
49330                                               return;
49331                                             }
49332                                             if (((instr >> 12) & 1) != 0) {
49333                                               UnallocatedA32(instr);
49334                                               return;
49335                                             }
49336                                             unsigned rd =
49337                                                 ExtractQRegister(instr, 22, 12);
49338                                             QOperand imm =
49339                                                 ImmediateVmov::DecodeImmediate(
49340                                                     cmode,
49341                                                     (instr & 0xf) |
49342                                                         ((instr >> 12) & 0x70) |
49343                                                         ((instr >> 17) & 0x80));
49344                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49345                                             vmov(al, dt, QRegister(rd), imm);
49346                                             break;
49347                                           }
49348                                           case 0x00000820: {
49349                                             // 0xf2800c70
49350                                             if (((instr & 0xd00) == 0x100) ||
49351                                                 ((instr & 0xd00) == 0x500) ||
49352                                                 ((instr & 0xd00) == 0x900) ||
49353                                                 ((instr & 0xe00) == 0xe00)) {
49354                                               UnallocatedA32(instr);
49355                                               return;
49356                                             }
49357                                             unsigned cmode = (instr >> 8) & 0xf;
49358                                             DataType dt =
49359                                                 ImmediateVmvn::DecodeDt(cmode);
49360                                             if (dt.Is(kDataTypeValueInvalid)) {
49361                                               UnallocatedA32(instr);
49362                                               return;
49363                                             }
49364                                             if (((instr >> 12) & 1) != 0) {
49365                                               UnallocatedA32(instr);
49366                                               return;
49367                                             }
49368                                             unsigned rd =
49369                                                 ExtractQRegister(instr, 22, 12);
49370                                             QOperand imm =
49371                                                 ImmediateVmvn::DecodeImmediate(
49372                                                     cmode,
49373                                                     (instr & 0xf) |
49374                                                         ((instr >> 12) & 0x70) |
49375                                                         ((instr >> 17) & 0x80));
49376                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49377                                             vmvn(al, dt, QRegister(rd), imm);
49378                                             break;
49379                                           }
49380                                           case 0x00000a00: {
49381                                             // 0xf2800e50
49382                                             if (((instr & 0x920) == 0x100) ||
49383                                                 ((instr & 0x520) == 0x100) ||
49384                                                 ((instr & 0x820) == 0x20) ||
49385                                                 ((instr & 0x420) == 0x20) ||
49386                                                 ((instr & 0x220) == 0x20) ||
49387                                                 ((instr & 0x120) == 0x120)) {
49388                                               UnallocatedA32(instr);
49389                                               return;
49390                                             }
49391                                             unsigned cmode =
49392                                                 ((instr >> 8) & 0xf) |
49393                                                 ((instr >> 1) & 0x10);
49394                                             DataType dt =
49395                                                 ImmediateVmov::DecodeDt(cmode);
49396                                             if (dt.Is(kDataTypeValueInvalid)) {
49397                                               UnallocatedA32(instr);
49398                                               return;
49399                                             }
49400                                             if (((instr >> 12) & 1) != 0) {
49401                                               UnallocatedA32(instr);
49402                                               return;
49403                                             }
49404                                             unsigned rd =
49405                                                 ExtractQRegister(instr, 22, 12);
49406                                             QOperand imm =
49407                                                 ImmediateVmov::DecodeImmediate(
49408                                                     cmode,
49409                                                     (instr & 0xf) |
49410                                                         ((instr >> 12) & 0x70) |
49411                                                         ((instr >> 17) & 0x80));
49412                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49413                                             vmov(al, dt, QRegister(rd), imm);
49414                                             break;
49415                                           }
49416                                           case 0x00000a20: {
49417                                             // 0xf2800e70
49418                                             if (((instr & 0xd00) == 0x100) ||
49419                                                 ((instr & 0xd00) == 0x500) ||
49420                                                 ((instr & 0xd00) == 0x900) ||
49421                                                 ((instr & 0xe00) == 0xe00)) {
49422                                               UnallocatedA32(instr);
49423                                               return;
49424                                             }
49425                                             unsigned cmode = (instr >> 8) & 0xf;
49426                                             DataType dt =
49427                                                 ImmediateVmvn::DecodeDt(cmode);
49428                                             if (dt.Is(kDataTypeValueInvalid)) {
49429                                               UnallocatedA32(instr);
49430                                               return;
49431                                             }
49432                                             if (((instr >> 12) & 1) != 0) {
49433                                               UnallocatedA32(instr);
49434                                               return;
49435                                             }
49436                                             unsigned rd =
49437                                                 ExtractQRegister(instr, 22, 12);
49438                                             QOperand imm =
49439                                                 ImmediateVmvn::DecodeImmediate(
49440                                                     cmode,
49441                                                     (instr & 0xf) |
49442                                                         ((instr >> 12) & 0x70) |
49443                                                         ((instr >> 17) & 0x80));
49444                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49445                                             vmvn(al, dt, QRegister(rd), imm);
49446                                             break;
49447                                           }
49448                                           case 0x00000c00: {
49449                                             // 0xf2800c50
49450                                             if (((instr & 0x920) == 0x100) ||
49451                                                 ((instr & 0x520) == 0x100) ||
49452                                                 ((instr & 0x820) == 0x20) ||
49453                                                 ((instr & 0x420) == 0x20) ||
49454                                                 ((instr & 0x220) == 0x20) ||
49455                                                 ((instr & 0x120) == 0x120)) {
49456                                               UnallocatedA32(instr);
49457                                               return;
49458                                             }
49459                                             unsigned cmode =
49460                                                 ((instr >> 8) & 0xf) |
49461                                                 ((instr >> 1) & 0x10);
49462                                             DataType dt =
49463                                                 ImmediateVmov::DecodeDt(cmode);
49464                                             if (dt.Is(kDataTypeValueInvalid)) {
49465                                               UnallocatedA32(instr);
49466                                               return;
49467                                             }
49468                                             if (((instr >> 12) & 1) != 0) {
49469                                               UnallocatedA32(instr);
49470                                               return;
49471                                             }
49472                                             unsigned rd =
49473                                                 ExtractQRegister(instr, 22, 12);
49474                                             QOperand imm =
49475                                                 ImmediateVmov::DecodeImmediate(
49476                                                     cmode,
49477                                                     (instr & 0xf) |
49478                                                         ((instr >> 12) & 0x70) |
49479                                                         ((instr >> 17) & 0x80));
49480                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49481                                             vmov(al, dt, QRegister(rd), imm);
49482                                             break;
49483                                           }
49484                                           case 0x00000c20: {
49485                                             // 0xf2800c70
49486                                             if (((instr & 0xd00) == 0x100) ||
49487                                                 ((instr & 0xd00) == 0x500) ||
49488                                                 ((instr & 0xd00) == 0x900) ||
49489                                                 ((instr & 0xe00) == 0xe00)) {
49490                                               UnallocatedA32(instr);
49491                                               return;
49492                                             }
49493                                             unsigned cmode = (instr >> 8) & 0xf;
49494                                             DataType dt =
49495                                                 ImmediateVmvn::DecodeDt(cmode);
49496                                             if (dt.Is(kDataTypeValueInvalid)) {
49497                                               UnallocatedA32(instr);
49498                                               return;
49499                                             }
49500                                             if (((instr >> 12) & 1) != 0) {
49501                                               UnallocatedA32(instr);
49502                                               return;
49503                                             }
49504                                             unsigned rd =
49505                                                 ExtractQRegister(instr, 22, 12);
49506                                             QOperand imm =
49507                                                 ImmediateVmvn::DecodeImmediate(
49508                                                     cmode,
49509                                                     (instr & 0xf) |
49510                                                         ((instr >> 12) & 0x70) |
49511                                                         ((instr >> 17) & 0x80));
49512                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49513                                             vmvn(al, dt, QRegister(rd), imm);
49514                                             break;
49515                                           }
49516                                           case 0x00000d00: {
49517                                             // 0xf2800d50
49518                                             if (((instr & 0x920) == 0x100) ||
49519                                                 ((instr & 0x520) == 0x100) ||
49520                                                 ((instr & 0x820) == 0x20) ||
49521                                                 ((instr & 0x420) == 0x20) ||
49522                                                 ((instr & 0x220) == 0x20) ||
49523                                                 ((instr & 0x120) == 0x120)) {
49524                                               UnallocatedA32(instr);
49525                                               return;
49526                                             }
49527                                             unsigned cmode =
49528                                                 ((instr >> 8) & 0xf) |
49529                                                 ((instr >> 1) & 0x10);
49530                                             DataType dt =
49531                                                 ImmediateVmov::DecodeDt(cmode);
49532                                             if (dt.Is(kDataTypeValueInvalid)) {
49533                                               UnallocatedA32(instr);
49534                                               return;
49535                                             }
49536                                             if (((instr >> 12) & 1) != 0) {
49537                                               UnallocatedA32(instr);
49538                                               return;
49539                                             }
49540                                             unsigned rd =
49541                                                 ExtractQRegister(instr, 22, 12);
49542                                             QOperand imm =
49543                                                 ImmediateVmov::DecodeImmediate(
49544                                                     cmode,
49545                                                     (instr & 0xf) |
49546                                                         ((instr >> 12) & 0x70) |
49547                                                         ((instr >> 17) & 0x80));
49548                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49549                                             vmov(al, dt, QRegister(rd), imm);
49550                                             break;
49551                                           }
49552                                           case 0x00000d20: {
49553                                             // 0xf2800d70
49554                                             if (((instr & 0xd00) == 0x100) ||
49555                                                 ((instr & 0xd00) == 0x500) ||
49556                                                 ((instr & 0xd00) == 0x900) ||
49557                                                 ((instr & 0xe00) == 0xe00)) {
49558                                               UnallocatedA32(instr);
49559                                               return;
49560                                             }
49561                                             unsigned cmode = (instr >> 8) & 0xf;
49562                                             DataType dt =
49563                                                 ImmediateVmvn::DecodeDt(cmode);
49564                                             if (dt.Is(kDataTypeValueInvalid)) {
49565                                               UnallocatedA32(instr);
49566                                               return;
49567                                             }
49568                                             if (((instr >> 12) & 1) != 0) {
49569                                               UnallocatedA32(instr);
49570                                               return;
49571                                             }
49572                                             unsigned rd =
49573                                                 ExtractQRegister(instr, 22, 12);
49574                                             QOperand imm =
49575                                                 ImmediateVmvn::DecodeImmediate(
49576                                                     cmode,
49577                                                     (instr & 0xf) |
49578                                                         ((instr >> 12) & 0x70) |
49579                                                         ((instr >> 17) & 0x80));
49580                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49581                                             vmvn(al, dt, QRegister(rd), imm);
49582                                             break;
49583                                           }
49584                                           case 0x00000e00: {
49585                                             // 0xf2800e50
49586                                             if (((instr & 0x920) == 0x100) ||
49587                                                 ((instr & 0x520) == 0x100) ||
49588                                                 ((instr & 0x820) == 0x20) ||
49589                                                 ((instr & 0x420) == 0x20) ||
49590                                                 ((instr & 0x220) == 0x20) ||
49591                                                 ((instr & 0x120) == 0x120)) {
49592                                               UnallocatedA32(instr);
49593                                               return;
49594                                             }
49595                                             unsigned cmode =
49596                                                 ((instr >> 8) & 0xf) |
49597                                                 ((instr >> 1) & 0x10);
49598                                             DataType dt =
49599                                                 ImmediateVmov::DecodeDt(cmode);
49600                                             if (dt.Is(kDataTypeValueInvalid)) {
49601                                               UnallocatedA32(instr);
49602                                               return;
49603                                             }
49604                                             if (((instr >> 12) & 1) != 0) {
49605                                               UnallocatedA32(instr);
49606                                               return;
49607                                             }
49608                                             unsigned rd =
49609                                                 ExtractQRegister(instr, 22, 12);
49610                                             QOperand imm =
49611                                                 ImmediateVmov::DecodeImmediate(
49612                                                     cmode,
49613                                                     (instr & 0xf) |
49614                                                         ((instr >> 12) & 0x70) |
49615                                                         ((instr >> 17) & 0x80));
49616                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49617                                             vmov(al, dt, QRegister(rd), imm);
49618                                             break;
49619                                           }
49620                                           case 0x00000e20: {
49621                                             // 0xf2800e70
49622                                             if (((instr & 0x920) == 0x100) ||
49623                                                 ((instr & 0x520) == 0x100) ||
49624                                                 ((instr & 0x820) == 0x20) ||
49625                                                 ((instr & 0x420) == 0x20) ||
49626                                                 ((instr & 0x220) == 0x20) ||
49627                                                 ((instr & 0x120) == 0x120)) {
49628                                               UnallocatedA32(instr);
49629                                               return;
49630                                             }
49631                                             unsigned cmode =
49632                                                 ((instr >> 8) & 0xf) |
49633                                                 ((instr >> 1) & 0x10);
49634                                             DataType dt =
49635                                                 ImmediateVmov::DecodeDt(cmode);
49636                                             if (dt.Is(kDataTypeValueInvalid)) {
49637                                               UnallocatedA32(instr);
49638                                               return;
49639                                             }
49640                                             if (((instr >> 12) & 1) != 0) {
49641                                               UnallocatedA32(instr);
49642                                               return;
49643                                             }
49644                                             unsigned rd =
49645                                                 ExtractQRegister(instr, 22, 12);
49646                                             QOperand imm =
49647                                                 ImmediateVmov::DecodeImmediate(
49648                                                     cmode,
49649                                                     (instr & 0xf) |
49650                                                         ((instr >> 12) & 0x70) |
49651                                                         ((instr >> 17) & 0x80));
49652                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49653                                             vmov(al, dt, QRegister(rd), imm);
49654                                             break;
49655                                           }
49656                                           case 0x00000f00: {
49657                                             // 0xf2800f50
49658                                             if (((instr & 0x920) == 0x100) ||
49659                                                 ((instr & 0x520) == 0x100) ||
49660                                                 ((instr & 0x820) == 0x20) ||
49661                                                 ((instr & 0x420) == 0x20) ||
49662                                                 ((instr & 0x220) == 0x20) ||
49663                                                 ((instr & 0x120) == 0x120)) {
49664                                               UnallocatedA32(instr);
49665                                               return;
49666                                             }
49667                                             unsigned cmode =
49668                                                 ((instr >> 8) & 0xf) |
49669                                                 ((instr >> 1) & 0x10);
49670                                             DataType dt =
49671                                                 ImmediateVmov::DecodeDt(cmode);
49672                                             if (dt.Is(kDataTypeValueInvalid)) {
49673                                               UnallocatedA32(instr);
49674                                               return;
49675                                             }
49676                                             if (((instr >> 12) & 1) != 0) {
49677                                               UnallocatedA32(instr);
49678                                               return;
49679                                             }
49680                                             unsigned rd =
49681                                                 ExtractQRegister(instr, 22, 12);
49682                                             QOperand imm =
49683                                                 ImmediateVmov::DecodeImmediate(
49684                                                     cmode,
49685                                                     (instr & 0xf) |
49686                                                         ((instr >> 12) & 0x70) |
49687                                                         ((instr >> 17) & 0x80));
49688                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
49689                                             vmov(al, dt, QRegister(rd), imm);
49690                                             break;
49691                                           }
49692                                           default:
49693                                             UnallocatedA32(instr);
49694                                             break;
49695                                         }
49696                                         break;
49697                                       }
49698                                       default: {
49699                                         if (((instr & 0x920) == 0x100) ||
49700                                             ((instr & 0x520) == 0x100) ||
49701                                             ((instr & 0x820) == 0x20) ||
49702                                             ((instr & 0x420) == 0x20) ||
49703                                             ((instr & 0x220) == 0x20) ||
49704                                             ((instr & 0x120) == 0x120)) {
49705                                           UnallocatedA32(instr);
49706                                           return;
49707                                         }
49708                                         unsigned cmode = ((instr >> 8) & 0xf) |
49709                                                          ((instr >> 1) & 0x10);
49710                                         DataType dt =
49711                                             ImmediateVmov::DecodeDt(cmode);
49712                                         if (dt.Is(kDataTypeValueInvalid)) {
49713                                           UnallocatedA32(instr);
49714                                           return;
49715                                         }
49716                                         if (((instr >> 12) & 1) != 0) {
49717                                           UnallocatedA32(instr);
49718                                           return;
49719                                         }
49720                                         unsigned rd =
49721                                             ExtractQRegister(instr, 22, 12);
49722                                         QOperand imm =
49723                                             ImmediateVmov::DecodeImmediate(
49724                                                 cmode,
49725                                                 (instr & 0xf) |
49726                                                     ((instr >> 12) & 0x70) |
49727                                                     ((instr >> 17) & 0x80));
49728                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
49729                                         vmov(al, dt, QRegister(rd), imm);
49730                                         break;
49731                                       }
49732                                     }
49733                                     break;
49734                                   }
49735                                 }
49736                                 break;
49737                               }
49738                               default:
49739                                 UnallocatedA32(instr);
49740                                 break;
49741                             }
49742                             break;
49743                           }
49744                           default: {
49745                             if ((instr & 0x00000200) == 0x00000200) {
49746                               if (((instr & 0x200000) == 0x0)) {
49747                                 UnallocatedA32(instr);
49748                                 return;
49749                               }
49750                               DataType dt1 = Dt_op_U_1_Decode1(
49751                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49752                               if (dt1.Is(kDataTypeValueInvalid)) {
49753                                 UnallocatedA32(instr);
49754                                 return;
49755                               }
49756                               DataType dt2 = Dt_op_U_1_Decode2(
49757                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
49758                               if (dt2.Is(kDataTypeValueInvalid)) {
49759                                 UnallocatedA32(instr);
49760                                 return;
49761                               }
49762                               if (((instr >> 12) & 1) != 0) {
49763                                 UnallocatedA32(instr);
49764                                 return;
49765                               }
49766                               unsigned rd = ExtractQRegister(instr, 22, 12);
49767                               if ((instr & 1) != 0) {
49768                                 UnallocatedA32(instr);
49769                                 return;
49770                               }
49771                               unsigned rm = ExtractQRegister(instr, 5, 0);
49772                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
49773                               // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
49774                               vcvt(al,
49775                                    dt1,
49776                                    dt2,
49777                                    QRegister(rd),
49778                                    QRegister(rm),
49779                                    fbits);
49780                             } else {
49781                               UnallocatedA32(instr);
49782                             }
49783                             break;
49784                           }
49785                         }
49786                         break;
49787                       }
49788                       default:
49789                         UnallocatedA32(instr);
49790                         break;
49791                     }
49792                     break;
49793                   }
49794                 }
49795                 break;
49796               }
49797             }
49798             break;
49799           }
49800         }
49801         break;
49802       }
49803       case 0x04000000: {
49804         // 0xf4000000
49805         switch (instr & 0x01300000) {
49806           case 0x00000000: {
49807             // 0xf4000000
49808             switch (instr & 0x00800000) {
49809               case 0x00000000: {
49810                 // 0xf4000000
49811                 switch (instr & 0x0000000d) {
49812                   case 0x0000000d: {
49813                     // 0xf400000d
49814                     switch (instr & 0x00000002) {
49815                       case 0x00000000: {
49816                         // 0xf400000d
49817                         switch (instr & 0x00000f00) {
49818                           case 0x00000000: {
49819                             // 0xf400000d
49820                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49821                             if (dt.Is(kDataTypeValueInvalid)) {
49822                               UnallocatedA32(instr);
49823                               return;
49824                             }
49825                             Alignment align =
49826                                 Align_align_4_Decode((instr >> 4) & 0x3);
49827                             if (dt.Is(kDataTypeValueInvalid) ||
49828                                 align.Is(kBadAlignment)) {
49829                               UnallocatedA32(instr);
49830                               return;
49831                             }
49832                             unsigned first = ExtractDRegister(instr, 22, 12);
49833                             unsigned length;
49834                             SpacingType spacing;
49835                             switch ((instr >> 8) & 0xf) {
49836                               default:
49837                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49838                               case 0x0:
49839                                 length = 4;
49840                                 spacing = kSingle;
49841                                 break;
49842                               case 0x1:
49843                                 length = 4;
49844                                 spacing = kDouble;
49845                                 break;
49846                             }
49847                             unsigned last =
49848                                 first +
49849                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49850                             TransferType transfer = kMultipleLanes;
49851                             unsigned rn = (instr >> 16) & 0xf;
49852                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49853                             vst4(al,
49854                                  dt,
49855                                  NeonRegisterList(DRegister(first),
49856                                                   DRegister(last),
49857                                                   spacing,
49858                                                   transfer),
49859                                  AlignedMemOperand(Register(rn),
49860                                                    align,
49861                                                    PostIndex));
49862                             break;
49863                           }
49864                           case 0x00000100: {
49865                             // 0xf400010d
49866                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49867                             if (dt.Is(kDataTypeValueInvalid)) {
49868                               UnallocatedA32(instr);
49869                               return;
49870                             }
49871                             Alignment align =
49872                                 Align_align_4_Decode((instr >> 4) & 0x3);
49873                             if (dt.Is(kDataTypeValueInvalid) ||
49874                                 align.Is(kBadAlignment)) {
49875                               UnallocatedA32(instr);
49876                               return;
49877                             }
49878                             unsigned first = ExtractDRegister(instr, 22, 12);
49879                             unsigned length;
49880                             SpacingType spacing;
49881                             switch ((instr >> 8) & 0xf) {
49882                               default:
49883                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49884                               case 0x0:
49885                                 length = 4;
49886                                 spacing = kSingle;
49887                                 break;
49888                               case 0x1:
49889                                 length = 4;
49890                                 spacing = kDouble;
49891                                 break;
49892                             }
49893                             unsigned last =
49894                                 first +
49895                                 (length - 1) * (spacing == kSingle ? 1 : 2);
49896                             TransferType transfer = kMultipleLanes;
49897                             unsigned rn = (instr >> 16) & 0xf;
49898                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49899                             vst4(al,
49900                                  dt,
49901                                  NeonRegisterList(DRegister(first),
49902                                                   DRegister(last),
49903                                                   spacing,
49904                                                   transfer),
49905                                  AlignedMemOperand(Register(rn),
49906                                                    align,
49907                                                    PostIndex));
49908                             break;
49909                           }
49910                           case 0x00000200: {
49911                             // 0xf400020d
49912                             if (((instr & 0xe20) == 0x620) ||
49913                                 ((instr & 0xf30) == 0xa30)) {
49914                               UnallocatedA32(instr);
49915                               return;
49916                             }
49917                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
49918                             if (dt.Is(kDataTypeValueInvalid)) {
49919                               UnallocatedA32(instr);
49920                               return;
49921                             }
49922                             Alignment align =
49923                                 Align_align_5_Decode((instr >> 4) & 0x3);
49924                             if (dt.Is(kDataTypeValueInvalid) ||
49925                                 align.Is(kBadAlignment)) {
49926                               UnallocatedA32(instr);
49927                               return;
49928                             }
49929                             unsigned first = ExtractDRegister(instr, 22, 12);
49930                             unsigned length;
49931                             SpacingType spacing = kSingle;
49932                             switch ((instr >> 8) & 0xf) {
49933                               default:
49934                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49935                               case 0x7:
49936                                 length = 1;
49937                                 break;
49938                               case 0xa:
49939                                 length = 2;
49940                                 break;
49941                               case 0x6:
49942                                 length = 3;
49943                                 break;
49944                               case 0x2:
49945                                 length = 4;
49946                                 break;
49947                             }
49948                             unsigned last = first + length - 1;
49949                             TransferType transfer = kMultipleLanes;
49950                             unsigned rn = (instr >> 16) & 0xf;
49951                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
49952                             vst1(al,
49953                                  dt,
49954                                  NeonRegisterList(DRegister(first),
49955                                                   DRegister(last),
49956                                                   spacing,
49957                                                   transfer),
49958                                  AlignedMemOperand(Register(rn),
49959                                                    align,
49960                                                    PostIndex));
49961                             break;
49962                           }
49963                           case 0x00000300: {
49964                             // 0xf400030d
49965                             if (((instr & 0xe30) == 0x830)) {
49966                               UnallocatedA32(instr);
49967                               return;
49968                             }
49969                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
49970                             if (dt.Is(kDataTypeValueInvalid)) {
49971                               UnallocatedA32(instr);
49972                               return;
49973                             }
49974                             Alignment align =
49975                                 Align_align_2_Decode((instr >> 4) & 0x3);
49976                             if (dt.Is(kDataTypeValueInvalid) ||
49977                                 align.Is(kBadAlignment)) {
49978                               UnallocatedA32(instr);
49979                               return;
49980                             }
49981                             unsigned first = ExtractDRegister(instr, 22, 12);
49982                             unsigned length;
49983                             SpacingType spacing;
49984                             switch ((instr >> 8) & 0xf) {
49985                               default:
49986                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
49987                               case 0x8:
49988                                 length = 2;
49989                                 spacing = kSingle;
49990                                 break;
49991                               case 0x9:
49992                                 length = 2;
49993                                 spacing = kDouble;
49994                                 break;
49995                               case 0x3:
49996                                 length = 4;
49997                                 spacing = kSingle;
49998                                 break;
49999                             }
50000                             unsigned last =
50001                                 first +
50002                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50003                             TransferType transfer = kMultipleLanes;
50004                             unsigned rn = (instr >> 16) & 0xf;
50005                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50006                             vst2(al,
50007                                  dt,
50008                                  NeonRegisterList(DRegister(first),
50009                                                   DRegister(last),
50010                                                   spacing,
50011                                                   transfer),
50012                                  AlignedMemOperand(Register(rn),
50013                                                    align,
50014                                                    PostIndex));
50015                             break;
50016                           }
50017                           case 0x00000400: {
50018                             // 0xf400040d
50019                             if (((instr & 0x20) == 0x20)) {
50020                               UnallocatedA32(instr);
50021                               return;
50022                             }
50023                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50024                             if (dt.Is(kDataTypeValueInvalid)) {
50025                               UnallocatedA32(instr);
50026                               return;
50027                             }
50028                             Alignment align =
50029                                 Align_align_3_Decode((instr >> 4) & 0x3);
50030                             if (dt.Is(kDataTypeValueInvalid) ||
50031                                 align.Is(kBadAlignment)) {
50032                               UnallocatedA32(instr);
50033                               return;
50034                             }
50035                             unsigned first = ExtractDRegister(instr, 22, 12);
50036                             unsigned length;
50037                             SpacingType spacing;
50038                             switch ((instr >> 8) & 0xf) {
50039                               default:
50040                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50041                               case 0x4:
50042                                 length = 3;
50043                                 spacing = kSingle;
50044                                 break;
50045                               case 0x5:
50046                                 length = 3;
50047                                 spacing = kDouble;
50048                                 break;
50049                             }
50050                             unsigned last =
50051                                 first +
50052                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50053                             TransferType transfer = kMultipleLanes;
50054                             unsigned rn = (instr >> 16) & 0xf;
50055                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50056                             vst3(al,
50057                                  dt,
50058                                  NeonRegisterList(DRegister(first),
50059                                                   DRegister(last),
50060                                                   spacing,
50061                                                   transfer),
50062                                  AlignedMemOperand(Register(rn),
50063                                                    align,
50064                                                    PostIndex));
50065                             break;
50066                           }
50067                           case 0x00000500: {
50068                             // 0xf400050d
50069                             if (((instr & 0x20) == 0x20)) {
50070                               UnallocatedA32(instr);
50071                               return;
50072                             }
50073                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50074                             if (dt.Is(kDataTypeValueInvalid)) {
50075                               UnallocatedA32(instr);
50076                               return;
50077                             }
50078                             Alignment align =
50079                                 Align_align_3_Decode((instr >> 4) & 0x3);
50080                             if (dt.Is(kDataTypeValueInvalid) ||
50081                                 align.Is(kBadAlignment)) {
50082                               UnallocatedA32(instr);
50083                               return;
50084                             }
50085                             unsigned first = ExtractDRegister(instr, 22, 12);
50086                             unsigned length;
50087                             SpacingType spacing;
50088                             switch ((instr >> 8) & 0xf) {
50089                               default:
50090                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50091                               case 0x4:
50092                                 length = 3;
50093                                 spacing = kSingle;
50094                                 break;
50095                               case 0x5:
50096                                 length = 3;
50097                                 spacing = kDouble;
50098                                 break;
50099                             }
50100                             unsigned last =
50101                                 first +
50102                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50103                             TransferType transfer = kMultipleLanes;
50104                             unsigned rn = (instr >> 16) & 0xf;
50105                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50106                             vst3(al,
50107                                  dt,
50108                                  NeonRegisterList(DRegister(first),
50109                                                   DRegister(last),
50110                                                   spacing,
50111                                                   transfer),
50112                                  AlignedMemOperand(Register(rn),
50113                                                    align,
50114                                                    PostIndex));
50115                             break;
50116                           }
50117                           case 0x00000600: {
50118                             // 0xf400060d
50119                             if (((instr & 0xe20) == 0x620) ||
50120                                 ((instr & 0xf30) == 0xa30)) {
50121                               UnallocatedA32(instr);
50122                               return;
50123                             }
50124                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50125                             if (dt.Is(kDataTypeValueInvalid)) {
50126                               UnallocatedA32(instr);
50127                               return;
50128                             }
50129                             Alignment align =
50130                                 Align_align_5_Decode((instr >> 4) & 0x3);
50131                             if (dt.Is(kDataTypeValueInvalid) ||
50132                                 align.Is(kBadAlignment)) {
50133                               UnallocatedA32(instr);
50134                               return;
50135                             }
50136                             unsigned first = ExtractDRegister(instr, 22, 12);
50137                             unsigned length;
50138                             SpacingType spacing = kSingle;
50139                             switch ((instr >> 8) & 0xf) {
50140                               default:
50141                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50142                               case 0x7:
50143                                 length = 1;
50144                                 break;
50145                               case 0xa:
50146                                 length = 2;
50147                                 break;
50148                               case 0x6:
50149                                 length = 3;
50150                                 break;
50151                               case 0x2:
50152                                 length = 4;
50153                                 break;
50154                             }
50155                             unsigned last = first + length - 1;
50156                             TransferType transfer = kMultipleLanes;
50157                             unsigned rn = (instr >> 16) & 0xf;
50158                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50159                             vst1(al,
50160                                  dt,
50161                                  NeonRegisterList(DRegister(first),
50162                                                   DRegister(last),
50163                                                   spacing,
50164                                                   transfer),
50165                                  AlignedMemOperand(Register(rn),
50166                                                    align,
50167                                                    PostIndex));
50168                             break;
50169                           }
50170                           case 0x00000700: {
50171                             // 0xf400070d
50172                             if (((instr & 0xe20) == 0x620) ||
50173                                 ((instr & 0xf30) == 0xa30)) {
50174                               UnallocatedA32(instr);
50175                               return;
50176                             }
50177                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50178                             if (dt.Is(kDataTypeValueInvalid)) {
50179                               UnallocatedA32(instr);
50180                               return;
50181                             }
50182                             Alignment align =
50183                                 Align_align_5_Decode((instr >> 4) & 0x3);
50184                             if (dt.Is(kDataTypeValueInvalid) ||
50185                                 align.Is(kBadAlignment)) {
50186                               UnallocatedA32(instr);
50187                               return;
50188                             }
50189                             unsigned first = ExtractDRegister(instr, 22, 12);
50190                             unsigned length;
50191                             SpacingType spacing = kSingle;
50192                             switch ((instr >> 8) & 0xf) {
50193                               default:
50194                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50195                               case 0x7:
50196                                 length = 1;
50197                                 break;
50198                               case 0xa:
50199                                 length = 2;
50200                                 break;
50201                               case 0x6:
50202                                 length = 3;
50203                                 break;
50204                               case 0x2:
50205                                 length = 4;
50206                                 break;
50207                             }
50208                             unsigned last = first + length - 1;
50209                             TransferType transfer = kMultipleLanes;
50210                             unsigned rn = (instr >> 16) & 0xf;
50211                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50212                             vst1(al,
50213                                  dt,
50214                                  NeonRegisterList(DRegister(first),
50215                                                   DRegister(last),
50216                                                   spacing,
50217                                                   transfer),
50218                                  AlignedMemOperand(Register(rn),
50219                                                    align,
50220                                                    PostIndex));
50221                             break;
50222                           }
50223                           case 0x00000800: {
50224                             // 0xf400080d
50225                             if (((instr & 0xe30) == 0x830)) {
50226                               UnallocatedA32(instr);
50227                               return;
50228                             }
50229                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50230                             if (dt.Is(kDataTypeValueInvalid)) {
50231                               UnallocatedA32(instr);
50232                               return;
50233                             }
50234                             Alignment align =
50235                                 Align_align_2_Decode((instr >> 4) & 0x3);
50236                             if (dt.Is(kDataTypeValueInvalid) ||
50237                                 align.Is(kBadAlignment)) {
50238                               UnallocatedA32(instr);
50239                               return;
50240                             }
50241                             unsigned first = ExtractDRegister(instr, 22, 12);
50242                             unsigned length;
50243                             SpacingType spacing;
50244                             switch ((instr >> 8) & 0xf) {
50245                               default:
50246                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50247                               case 0x8:
50248                                 length = 2;
50249                                 spacing = kSingle;
50250                                 break;
50251                               case 0x9:
50252                                 length = 2;
50253                                 spacing = kDouble;
50254                                 break;
50255                               case 0x3:
50256                                 length = 4;
50257                                 spacing = kSingle;
50258                                 break;
50259                             }
50260                             unsigned last =
50261                                 first +
50262                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50263                             TransferType transfer = kMultipleLanes;
50264                             unsigned rn = (instr >> 16) & 0xf;
50265                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50266                             vst2(al,
50267                                  dt,
50268                                  NeonRegisterList(DRegister(first),
50269                                                   DRegister(last),
50270                                                   spacing,
50271                                                   transfer),
50272                                  AlignedMemOperand(Register(rn),
50273                                                    align,
50274                                                    PostIndex));
50275                             break;
50276                           }
50277                           case 0x00000900: {
50278                             // 0xf400090d
50279                             if (((instr & 0xe30) == 0x830)) {
50280                               UnallocatedA32(instr);
50281                               return;
50282                             }
50283                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50284                             if (dt.Is(kDataTypeValueInvalid)) {
50285                               UnallocatedA32(instr);
50286                               return;
50287                             }
50288                             Alignment align =
50289                                 Align_align_2_Decode((instr >> 4) & 0x3);
50290                             if (dt.Is(kDataTypeValueInvalid) ||
50291                                 align.Is(kBadAlignment)) {
50292                               UnallocatedA32(instr);
50293                               return;
50294                             }
50295                             unsigned first = ExtractDRegister(instr, 22, 12);
50296                             unsigned length;
50297                             SpacingType spacing;
50298                             switch ((instr >> 8) & 0xf) {
50299                               default:
50300                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50301                               case 0x8:
50302                                 length = 2;
50303                                 spacing = kSingle;
50304                                 break;
50305                               case 0x9:
50306                                 length = 2;
50307                                 spacing = kDouble;
50308                                 break;
50309                               case 0x3:
50310                                 length = 4;
50311                                 spacing = kSingle;
50312                                 break;
50313                             }
50314                             unsigned last =
50315                                 first +
50316                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50317                             TransferType transfer = kMultipleLanes;
50318                             unsigned rn = (instr >> 16) & 0xf;
50319                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50320                             vst2(al,
50321                                  dt,
50322                                  NeonRegisterList(DRegister(first),
50323                                                   DRegister(last),
50324                                                   spacing,
50325                                                   transfer),
50326                                  AlignedMemOperand(Register(rn),
50327                                                    align,
50328                                                    PostIndex));
50329                             break;
50330                           }
50331                           case 0x00000a00: {
50332                             // 0xf4000a0d
50333                             if (((instr & 0xe20) == 0x620) ||
50334                                 ((instr & 0xf30) == 0xa30)) {
50335                               UnallocatedA32(instr);
50336                               return;
50337                             }
50338                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50339                             if (dt.Is(kDataTypeValueInvalid)) {
50340                               UnallocatedA32(instr);
50341                               return;
50342                             }
50343                             Alignment align =
50344                                 Align_align_5_Decode((instr >> 4) & 0x3);
50345                             if (dt.Is(kDataTypeValueInvalid) ||
50346                                 align.Is(kBadAlignment)) {
50347                               UnallocatedA32(instr);
50348                               return;
50349                             }
50350                             unsigned first = ExtractDRegister(instr, 22, 12);
50351                             unsigned length;
50352                             SpacingType spacing = kSingle;
50353                             switch ((instr >> 8) & 0xf) {
50354                               default:
50355                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50356                               case 0x7:
50357                                 length = 1;
50358                                 break;
50359                               case 0xa:
50360                                 length = 2;
50361                                 break;
50362                               case 0x6:
50363                                 length = 3;
50364                                 break;
50365                               case 0x2:
50366                                 length = 4;
50367                                 break;
50368                             }
50369                             unsigned last = first + length - 1;
50370                             TransferType transfer = kMultipleLanes;
50371                             unsigned rn = (instr >> 16) & 0xf;
50372                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
50373                             vst1(al,
50374                                  dt,
50375                                  NeonRegisterList(DRegister(first),
50376                                                   DRegister(last),
50377                                                   spacing,
50378                                                   transfer),
50379                                  AlignedMemOperand(Register(rn),
50380                                                    align,
50381                                                    PostIndex));
50382                             break;
50383                           }
50384                           default:
50385                             UnallocatedA32(instr);
50386                             break;
50387                         }
50388                         break;
50389                       }
50390                       case 0x00000002: {
50391                         // 0xf400000f
50392                         switch (instr & 0x00000f00) {
50393                           case 0x00000000: {
50394                             // 0xf400000d
50395                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50396                             if (dt.Is(kDataTypeValueInvalid)) {
50397                               UnallocatedA32(instr);
50398                               return;
50399                             }
50400                             Alignment align =
50401                                 Align_align_4_Decode((instr >> 4) & 0x3);
50402                             if (dt.Is(kDataTypeValueInvalid) ||
50403                                 align.Is(kBadAlignment)) {
50404                               UnallocatedA32(instr);
50405                               return;
50406                             }
50407                             unsigned first = ExtractDRegister(instr, 22, 12);
50408                             unsigned length;
50409                             SpacingType spacing;
50410                             switch ((instr >> 8) & 0xf) {
50411                               default:
50412                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50413                               case 0x0:
50414                                 length = 4;
50415                                 spacing = kSingle;
50416                                 break;
50417                               case 0x1:
50418                                 length = 4;
50419                                 spacing = kDouble;
50420                                 break;
50421                             }
50422                             unsigned last =
50423                                 first +
50424                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50425                             TransferType transfer = kMultipleLanes;
50426                             unsigned rn = (instr >> 16) & 0xf;
50427                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50428                             vst4(al,
50429                                  dt,
50430                                  NeonRegisterList(DRegister(first),
50431                                                   DRegister(last),
50432                                                   spacing,
50433                                                   transfer),
50434                                  AlignedMemOperand(Register(rn),
50435                                                    align,
50436                                                    Offset));
50437                             break;
50438                           }
50439                           case 0x00000100: {
50440                             // 0xf400010d
50441                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50442                             if (dt.Is(kDataTypeValueInvalid)) {
50443                               UnallocatedA32(instr);
50444                               return;
50445                             }
50446                             Alignment align =
50447                                 Align_align_4_Decode((instr >> 4) & 0x3);
50448                             if (dt.Is(kDataTypeValueInvalid) ||
50449                                 align.Is(kBadAlignment)) {
50450                               UnallocatedA32(instr);
50451                               return;
50452                             }
50453                             unsigned first = ExtractDRegister(instr, 22, 12);
50454                             unsigned length;
50455                             SpacingType spacing;
50456                             switch ((instr >> 8) & 0xf) {
50457                               default:
50458                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50459                               case 0x0:
50460                                 length = 4;
50461                                 spacing = kSingle;
50462                                 break;
50463                               case 0x1:
50464                                 length = 4;
50465                                 spacing = kDouble;
50466                                 break;
50467                             }
50468                             unsigned last =
50469                                 first +
50470                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50471                             TransferType transfer = kMultipleLanes;
50472                             unsigned rn = (instr >> 16) & 0xf;
50473                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50474                             vst4(al,
50475                                  dt,
50476                                  NeonRegisterList(DRegister(first),
50477                                                   DRegister(last),
50478                                                   spacing,
50479                                                   transfer),
50480                                  AlignedMemOperand(Register(rn),
50481                                                    align,
50482                                                    Offset));
50483                             break;
50484                           }
50485                           case 0x00000200: {
50486                             // 0xf400020d
50487                             if (((instr & 0xe20) == 0x620) ||
50488                                 ((instr & 0xf30) == 0xa30)) {
50489                               UnallocatedA32(instr);
50490                               return;
50491                             }
50492                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50493                             if (dt.Is(kDataTypeValueInvalid)) {
50494                               UnallocatedA32(instr);
50495                               return;
50496                             }
50497                             Alignment align =
50498                                 Align_align_5_Decode((instr >> 4) & 0x3);
50499                             if (dt.Is(kDataTypeValueInvalid) ||
50500                                 align.Is(kBadAlignment)) {
50501                               UnallocatedA32(instr);
50502                               return;
50503                             }
50504                             unsigned first = ExtractDRegister(instr, 22, 12);
50505                             unsigned length;
50506                             SpacingType spacing = kSingle;
50507                             switch ((instr >> 8) & 0xf) {
50508                               default:
50509                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50510                               case 0x7:
50511                                 length = 1;
50512                                 break;
50513                               case 0xa:
50514                                 length = 2;
50515                                 break;
50516                               case 0x6:
50517                                 length = 3;
50518                                 break;
50519                               case 0x2:
50520                                 length = 4;
50521                                 break;
50522                             }
50523                             unsigned last = first + length - 1;
50524                             TransferType transfer = kMultipleLanes;
50525                             unsigned rn = (instr >> 16) & 0xf;
50526                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50527                             vst1(al,
50528                                  dt,
50529                                  NeonRegisterList(DRegister(first),
50530                                                   DRegister(last),
50531                                                   spacing,
50532                                                   transfer),
50533                                  AlignedMemOperand(Register(rn),
50534                                                    align,
50535                                                    Offset));
50536                             break;
50537                           }
50538                           case 0x00000300: {
50539                             // 0xf400030d
50540                             if (((instr & 0xe30) == 0x830)) {
50541                               UnallocatedA32(instr);
50542                               return;
50543                             }
50544                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50545                             if (dt.Is(kDataTypeValueInvalid)) {
50546                               UnallocatedA32(instr);
50547                               return;
50548                             }
50549                             Alignment align =
50550                                 Align_align_2_Decode((instr >> 4) & 0x3);
50551                             if (dt.Is(kDataTypeValueInvalid) ||
50552                                 align.Is(kBadAlignment)) {
50553                               UnallocatedA32(instr);
50554                               return;
50555                             }
50556                             unsigned first = ExtractDRegister(instr, 22, 12);
50557                             unsigned length;
50558                             SpacingType spacing;
50559                             switch ((instr >> 8) & 0xf) {
50560                               default:
50561                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50562                               case 0x8:
50563                                 length = 2;
50564                                 spacing = kSingle;
50565                                 break;
50566                               case 0x9:
50567                                 length = 2;
50568                                 spacing = kDouble;
50569                                 break;
50570                               case 0x3:
50571                                 length = 4;
50572                                 spacing = kSingle;
50573                                 break;
50574                             }
50575                             unsigned last =
50576                                 first +
50577                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50578                             TransferType transfer = kMultipleLanes;
50579                             unsigned rn = (instr >> 16) & 0xf;
50580                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50581                             vst2(al,
50582                                  dt,
50583                                  NeonRegisterList(DRegister(first),
50584                                                   DRegister(last),
50585                                                   spacing,
50586                                                   transfer),
50587                                  AlignedMemOperand(Register(rn),
50588                                                    align,
50589                                                    Offset));
50590                             break;
50591                           }
50592                           case 0x00000400: {
50593                             // 0xf400040d
50594                             if (((instr & 0x20) == 0x20)) {
50595                               UnallocatedA32(instr);
50596                               return;
50597                             }
50598                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50599                             if (dt.Is(kDataTypeValueInvalid)) {
50600                               UnallocatedA32(instr);
50601                               return;
50602                             }
50603                             Alignment align =
50604                                 Align_align_3_Decode((instr >> 4) & 0x3);
50605                             if (dt.Is(kDataTypeValueInvalid) ||
50606                                 align.Is(kBadAlignment)) {
50607                               UnallocatedA32(instr);
50608                               return;
50609                             }
50610                             unsigned first = ExtractDRegister(instr, 22, 12);
50611                             unsigned length;
50612                             SpacingType spacing;
50613                             switch ((instr >> 8) & 0xf) {
50614                               default:
50615                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50616                               case 0x4:
50617                                 length = 3;
50618                                 spacing = kSingle;
50619                                 break;
50620                               case 0x5:
50621                                 length = 3;
50622                                 spacing = kDouble;
50623                                 break;
50624                             }
50625                             unsigned last =
50626                                 first +
50627                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50628                             TransferType transfer = kMultipleLanes;
50629                             unsigned rn = (instr >> 16) & 0xf;
50630                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50631                             vst3(al,
50632                                  dt,
50633                                  NeonRegisterList(DRegister(first),
50634                                                   DRegister(last),
50635                                                   spacing,
50636                                                   transfer),
50637                                  AlignedMemOperand(Register(rn),
50638                                                    align,
50639                                                    Offset));
50640                             break;
50641                           }
50642                           case 0x00000500: {
50643                             // 0xf400050d
50644                             if (((instr & 0x20) == 0x20)) {
50645                               UnallocatedA32(instr);
50646                               return;
50647                             }
50648                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50649                             if (dt.Is(kDataTypeValueInvalid)) {
50650                               UnallocatedA32(instr);
50651                               return;
50652                             }
50653                             Alignment align =
50654                                 Align_align_3_Decode((instr >> 4) & 0x3);
50655                             if (dt.Is(kDataTypeValueInvalid) ||
50656                                 align.Is(kBadAlignment)) {
50657                               UnallocatedA32(instr);
50658                               return;
50659                             }
50660                             unsigned first = ExtractDRegister(instr, 22, 12);
50661                             unsigned length;
50662                             SpacingType spacing;
50663                             switch ((instr >> 8) & 0xf) {
50664                               default:
50665                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50666                               case 0x4:
50667                                 length = 3;
50668                                 spacing = kSingle;
50669                                 break;
50670                               case 0x5:
50671                                 length = 3;
50672                                 spacing = kDouble;
50673                                 break;
50674                             }
50675                             unsigned last =
50676                                 first +
50677                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50678                             TransferType transfer = kMultipleLanes;
50679                             unsigned rn = (instr >> 16) & 0xf;
50680                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50681                             vst3(al,
50682                                  dt,
50683                                  NeonRegisterList(DRegister(first),
50684                                                   DRegister(last),
50685                                                   spacing,
50686                                                   transfer),
50687                                  AlignedMemOperand(Register(rn),
50688                                                    align,
50689                                                    Offset));
50690                             break;
50691                           }
50692                           case 0x00000600: {
50693                             // 0xf400060d
50694                             if (((instr & 0xe20) == 0x620) ||
50695                                 ((instr & 0xf30) == 0xa30)) {
50696                               UnallocatedA32(instr);
50697                               return;
50698                             }
50699                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50700                             if (dt.Is(kDataTypeValueInvalid)) {
50701                               UnallocatedA32(instr);
50702                               return;
50703                             }
50704                             Alignment align =
50705                                 Align_align_5_Decode((instr >> 4) & 0x3);
50706                             if (dt.Is(kDataTypeValueInvalid) ||
50707                                 align.Is(kBadAlignment)) {
50708                               UnallocatedA32(instr);
50709                               return;
50710                             }
50711                             unsigned first = ExtractDRegister(instr, 22, 12);
50712                             unsigned length;
50713                             SpacingType spacing = kSingle;
50714                             switch ((instr >> 8) & 0xf) {
50715                               default:
50716                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50717                               case 0x7:
50718                                 length = 1;
50719                                 break;
50720                               case 0xa:
50721                                 length = 2;
50722                                 break;
50723                               case 0x6:
50724                                 length = 3;
50725                                 break;
50726                               case 0x2:
50727                                 length = 4;
50728                                 break;
50729                             }
50730                             unsigned last = first + length - 1;
50731                             TransferType transfer = kMultipleLanes;
50732                             unsigned rn = (instr >> 16) & 0xf;
50733                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50734                             vst1(al,
50735                                  dt,
50736                                  NeonRegisterList(DRegister(first),
50737                                                   DRegister(last),
50738                                                   spacing,
50739                                                   transfer),
50740                                  AlignedMemOperand(Register(rn),
50741                                                    align,
50742                                                    Offset));
50743                             break;
50744                           }
50745                           case 0x00000700: {
50746                             // 0xf400070d
50747                             if (((instr & 0xe20) == 0x620) ||
50748                                 ((instr & 0xf30) == 0xa30)) {
50749                               UnallocatedA32(instr);
50750                               return;
50751                             }
50752                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50753                             if (dt.Is(kDataTypeValueInvalid)) {
50754                               UnallocatedA32(instr);
50755                               return;
50756                             }
50757                             Alignment align =
50758                                 Align_align_5_Decode((instr >> 4) & 0x3);
50759                             if (dt.Is(kDataTypeValueInvalid) ||
50760                                 align.Is(kBadAlignment)) {
50761                               UnallocatedA32(instr);
50762                               return;
50763                             }
50764                             unsigned first = ExtractDRegister(instr, 22, 12);
50765                             unsigned length;
50766                             SpacingType spacing = kSingle;
50767                             switch ((instr >> 8) & 0xf) {
50768                               default:
50769                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50770                               case 0x7:
50771                                 length = 1;
50772                                 break;
50773                               case 0xa:
50774                                 length = 2;
50775                                 break;
50776                               case 0x6:
50777                                 length = 3;
50778                                 break;
50779                               case 0x2:
50780                                 length = 4;
50781                                 break;
50782                             }
50783                             unsigned last = first + length - 1;
50784                             TransferType transfer = kMultipleLanes;
50785                             unsigned rn = (instr >> 16) & 0xf;
50786                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50787                             vst1(al,
50788                                  dt,
50789                                  NeonRegisterList(DRegister(first),
50790                                                   DRegister(last),
50791                                                   spacing,
50792                                                   transfer),
50793                                  AlignedMemOperand(Register(rn),
50794                                                    align,
50795                                                    Offset));
50796                             break;
50797                           }
50798                           case 0x00000800: {
50799                             // 0xf400080d
50800                             if (((instr & 0xe30) == 0x830)) {
50801                               UnallocatedA32(instr);
50802                               return;
50803                             }
50804                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50805                             if (dt.Is(kDataTypeValueInvalid)) {
50806                               UnallocatedA32(instr);
50807                               return;
50808                             }
50809                             Alignment align =
50810                                 Align_align_2_Decode((instr >> 4) & 0x3);
50811                             if (dt.Is(kDataTypeValueInvalid) ||
50812                                 align.Is(kBadAlignment)) {
50813                               UnallocatedA32(instr);
50814                               return;
50815                             }
50816                             unsigned first = ExtractDRegister(instr, 22, 12);
50817                             unsigned length;
50818                             SpacingType spacing;
50819                             switch ((instr >> 8) & 0xf) {
50820                               default:
50821                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50822                               case 0x8:
50823                                 length = 2;
50824                                 spacing = kSingle;
50825                                 break;
50826                               case 0x9:
50827                                 length = 2;
50828                                 spacing = kDouble;
50829                                 break;
50830                               case 0x3:
50831                                 length = 4;
50832                                 spacing = kSingle;
50833                                 break;
50834                             }
50835                             unsigned last =
50836                                 first +
50837                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50838                             TransferType transfer = kMultipleLanes;
50839                             unsigned rn = (instr >> 16) & 0xf;
50840                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50841                             vst2(al,
50842                                  dt,
50843                                  NeonRegisterList(DRegister(first),
50844                                                   DRegister(last),
50845                                                   spacing,
50846                                                   transfer),
50847                                  AlignedMemOperand(Register(rn),
50848                                                    align,
50849                                                    Offset));
50850                             break;
50851                           }
50852                           case 0x00000900: {
50853                             // 0xf400090d
50854                             if (((instr & 0xe30) == 0x830)) {
50855                               UnallocatedA32(instr);
50856                               return;
50857                             }
50858                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50859                             if (dt.Is(kDataTypeValueInvalid)) {
50860                               UnallocatedA32(instr);
50861                               return;
50862                             }
50863                             Alignment align =
50864                                 Align_align_2_Decode((instr >> 4) & 0x3);
50865                             if (dt.Is(kDataTypeValueInvalid) ||
50866                                 align.Is(kBadAlignment)) {
50867                               UnallocatedA32(instr);
50868                               return;
50869                             }
50870                             unsigned first = ExtractDRegister(instr, 22, 12);
50871                             unsigned length;
50872                             SpacingType spacing;
50873                             switch ((instr >> 8) & 0xf) {
50874                               default:
50875                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50876                               case 0x8:
50877                                 length = 2;
50878                                 spacing = kSingle;
50879                                 break;
50880                               case 0x9:
50881                                 length = 2;
50882                                 spacing = kDouble;
50883                                 break;
50884                               case 0x3:
50885                                 length = 4;
50886                                 spacing = kSingle;
50887                                 break;
50888                             }
50889                             unsigned last =
50890                                 first +
50891                                 (length - 1) * (spacing == kSingle ? 1 : 2);
50892                             TransferType transfer = kMultipleLanes;
50893                             unsigned rn = (instr >> 16) & 0xf;
50894                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50895                             vst2(al,
50896                                  dt,
50897                                  NeonRegisterList(DRegister(first),
50898                                                   DRegister(last),
50899                                                   spacing,
50900                                                   transfer),
50901                                  AlignedMemOperand(Register(rn),
50902                                                    align,
50903                                                    Offset));
50904                             break;
50905                           }
50906                           case 0x00000a00: {
50907                             // 0xf4000a0d
50908                             if (((instr & 0xe20) == 0x620) ||
50909                                 ((instr & 0xf30) == 0xa30)) {
50910                               UnallocatedA32(instr);
50911                               return;
50912                             }
50913                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
50914                             if (dt.Is(kDataTypeValueInvalid)) {
50915                               UnallocatedA32(instr);
50916                               return;
50917                             }
50918                             Alignment align =
50919                                 Align_align_5_Decode((instr >> 4) & 0x3);
50920                             if (dt.Is(kDataTypeValueInvalid) ||
50921                                 align.Is(kBadAlignment)) {
50922                               UnallocatedA32(instr);
50923                               return;
50924                             }
50925                             unsigned first = ExtractDRegister(instr, 22, 12);
50926                             unsigned length;
50927                             SpacingType spacing = kSingle;
50928                             switch ((instr >> 8) & 0xf) {
50929                               default:
50930                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
50931                               case 0x7:
50932                                 length = 1;
50933                                 break;
50934                               case 0xa:
50935                                 length = 2;
50936                                 break;
50937                               case 0x6:
50938                                 length = 3;
50939                                 break;
50940                               case 0x2:
50941                                 length = 4;
50942                                 break;
50943                             }
50944                             unsigned last = first + length - 1;
50945                             TransferType transfer = kMultipleLanes;
50946                             unsigned rn = (instr >> 16) & 0xf;
50947                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
50948                             vst1(al,
50949                                  dt,
50950                                  NeonRegisterList(DRegister(first),
50951                                                   DRegister(last),
50952                                                   spacing,
50953                                                   transfer),
50954                                  AlignedMemOperand(Register(rn),
50955                                                    align,
50956                                                    Offset));
50957                             break;
50958                           }
50959                           default:
50960                             UnallocatedA32(instr);
50961                             break;
50962                         }
50963                         break;
50964                       }
50965                     }
50966                     break;
50967                   }
50968                   default: {
50969                     switch (instr & 0x00000f00) {
50970                       case 0x00000000: {
50971                         // 0xf4000000
50972                         if (((instr & 0xd) == 0xd)) {
50973                           UnallocatedA32(instr);
50974                           return;
50975                         }
50976                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
50977                         if (dt.Is(kDataTypeValueInvalid)) {
50978                           UnallocatedA32(instr);
50979                           return;
50980                         }
50981                         Alignment align =
50982                             Align_align_4_Decode((instr >> 4) & 0x3);
50983                         if (dt.Is(kDataTypeValueInvalid) ||
50984                             align.Is(kBadAlignment)) {
50985                           UnallocatedA32(instr);
50986                           return;
50987                         }
50988                         unsigned first = ExtractDRegister(instr, 22, 12);
50989                         unsigned length;
50990                         SpacingType spacing;
50991                         switch ((instr >> 8) & 0xf) {
50992                           default:
50993                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
50994                           case 0x0:
50995                             length = 4;
50996                             spacing = kSingle;
50997                             break;
50998                           case 0x1:
50999                             length = 4;
51000                             spacing = kDouble;
51001                             break;
51002                         }
51003                         unsigned last =
51004                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51005                         TransferType transfer = kMultipleLanes;
51006                         unsigned rn = (instr >> 16) & 0xf;
51007                         unsigned rm = instr & 0xf;
51008                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51009                         vst4(al,
51010                              dt,
51011                              NeonRegisterList(DRegister(first),
51012                                               DRegister(last),
51013                                               spacing,
51014                                               transfer),
51015                              AlignedMemOperand(Register(rn),
51016                                                align,
51017                                                Register(rm),
51018                                                PostIndex));
51019                         break;
51020                       }
51021                       case 0x00000100: {
51022                         // 0xf4000100
51023                         if (((instr & 0xd) == 0xd)) {
51024                           UnallocatedA32(instr);
51025                           return;
51026                         }
51027                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51028                         if (dt.Is(kDataTypeValueInvalid)) {
51029                           UnallocatedA32(instr);
51030                           return;
51031                         }
51032                         Alignment align =
51033                             Align_align_4_Decode((instr >> 4) & 0x3);
51034                         if (dt.Is(kDataTypeValueInvalid) ||
51035                             align.Is(kBadAlignment)) {
51036                           UnallocatedA32(instr);
51037                           return;
51038                         }
51039                         unsigned first = ExtractDRegister(instr, 22, 12);
51040                         unsigned length;
51041                         SpacingType spacing;
51042                         switch ((instr >> 8) & 0xf) {
51043                           default:
51044                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51045                           case 0x0:
51046                             length = 4;
51047                             spacing = kSingle;
51048                             break;
51049                           case 0x1:
51050                             length = 4;
51051                             spacing = kDouble;
51052                             break;
51053                         }
51054                         unsigned last =
51055                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51056                         TransferType transfer = kMultipleLanes;
51057                         unsigned rn = (instr >> 16) & 0xf;
51058                         unsigned rm = instr & 0xf;
51059                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51060                         vst4(al,
51061                              dt,
51062                              NeonRegisterList(DRegister(first),
51063                                               DRegister(last),
51064                                               spacing,
51065                                               transfer),
51066                              AlignedMemOperand(Register(rn),
51067                                                align,
51068                                                Register(rm),
51069                                                PostIndex));
51070                         break;
51071                       }
51072                       case 0x00000200: {
51073                         // 0xf4000200
51074                         if (((instr & 0xd) == 0xd) ||
51075                             ((instr & 0xe20) == 0x620) ||
51076                             ((instr & 0xf30) == 0xa30)) {
51077                           UnallocatedA32(instr);
51078                           return;
51079                         }
51080                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51081                         if (dt.Is(kDataTypeValueInvalid)) {
51082                           UnallocatedA32(instr);
51083                           return;
51084                         }
51085                         Alignment align =
51086                             Align_align_5_Decode((instr >> 4) & 0x3);
51087                         if (dt.Is(kDataTypeValueInvalid) ||
51088                             align.Is(kBadAlignment)) {
51089                           UnallocatedA32(instr);
51090                           return;
51091                         }
51092                         unsigned first = ExtractDRegister(instr, 22, 12);
51093                         unsigned length;
51094                         SpacingType spacing = kSingle;
51095                         switch ((instr >> 8) & 0xf) {
51096                           default:
51097                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51098                           case 0x7:
51099                             length = 1;
51100                             break;
51101                           case 0xa:
51102                             length = 2;
51103                             break;
51104                           case 0x6:
51105                             length = 3;
51106                             break;
51107                           case 0x2:
51108                             length = 4;
51109                             break;
51110                         }
51111                         unsigned last = first + length - 1;
51112                         TransferType transfer = kMultipleLanes;
51113                         unsigned rn = (instr >> 16) & 0xf;
51114                         unsigned rm = instr & 0xf;
51115                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51116                         vst1(al,
51117                              dt,
51118                              NeonRegisterList(DRegister(first),
51119                                               DRegister(last),
51120                                               spacing,
51121                                               transfer),
51122                              AlignedMemOperand(Register(rn),
51123                                                align,
51124                                                Register(rm),
51125                                                PostIndex));
51126                         break;
51127                       }
51128                       case 0x00000300: {
51129                         // 0xf4000300
51130                         if (((instr & 0xd) == 0xd) ||
51131                             ((instr & 0xe30) == 0x830)) {
51132                           UnallocatedA32(instr);
51133                           return;
51134                         }
51135                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51136                         if (dt.Is(kDataTypeValueInvalid)) {
51137                           UnallocatedA32(instr);
51138                           return;
51139                         }
51140                         Alignment align =
51141                             Align_align_2_Decode((instr >> 4) & 0x3);
51142                         if (dt.Is(kDataTypeValueInvalid) ||
51143                             align.Is(kBadAlignment)) {
51144                           UnallocatedA32(instr);
51145                           return;
51146                         }
51147                         unsigned first = ExtractDRegister(instr, 22, 12);
51148                         unsigned length;
51149                         SpacingType spacing;
51150                         switch ((instr >> 8) & 0xf) {
51151                           default:
51152                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51153                           case 0x8:
51154                             length = 2;
51155                             spacing = kSingle;
51156                             break;
51157                           case 0x9:
51158                             length = 2;
51159                             spacing = kDouble;
51160                             break;
51161                           case 0x3:
51162                             length = 4;
51163                             spacing = kSingle;
51164                             break;
51165                         }
51166                         unsigned last =
51167                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51168                         TransferType transfer = kMultipleLanes;
51169                         unsigned rn = (instr >> 16) & 0xf;
51170                         unsigned rm = instr & 0xf;
51171                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51172                         vst2(al,
51173                              dt,
51174                              NeonRegisterList(DRegister(first),
51175                                               DRegister(last),
51176                                               spacing,
51177                                               transfer),
51178                              AlignedMemOperand(Register(rn),
51179                                                align,
51180                                                Register(rm),
51181                                                PostIndex));
51182                         break;
51183                       }
51184                       case 0x00000400: {
51185                         // 0xf4000400
51186                         if (((instr & 0xd) == 0xd) ||
51187                             ((instr & 0x20) == 0x20)) {
51188                           UnallocatedA32(instr);
51189                           return;
51190                         }
51191                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51192                         if (dt.Is(kDataTypeValueInvalid)) {
51193                           UnallocatedA32(instr);
51194                           return;
51195                         }
51196                         Alignment align =
51197                             Align_align_3_Decode((instr >> 4) & 0x3);
51198                         if (dt.Is(kDataTypeValueInvalid) ||
51199                             align.Is(kBadAlignment)) {
51200                           UnallocatedA32(instr);
51201                           return;
51202                         }
51203                         unsigned first = ExtractDRegister(instr, 22, 12);
51204                         unsigned length;
51205                         SpacingType spacing;
51206                         switch ((instr >> 8) & 0xf) {
51207                           default:
51208                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51209                           case 0x4:
51210                             length = 3;
51211                             spacing = kSingle;
51212                             break;
51213                           case 0x5:
51214                             length = 3;
51215                             spacing = kDouble;
51216                             break;
51217                         }
51218                         unsigned last =
51219                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51220                         TransferType transfer = kMultipleLanes;
51221                         unsigned rn = (instr >> 16) & 0xf;
51222                         unsigned rm = instr & 0xf;
51223                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51224                         vst3(al,
51225                              dt,
51226                              NeonRegisterList(DRegister(first),
51227                                               DRegister(last),
51228                                               spacing,
51229                                               transfer),
51230                              AlignedMemOperand(Register(rn),
51231                                                align,
51232                                                Register(rm),
51233                                                PostIndex));
51234                         break;
51235                       }
51236                       case 0x00000500: {
51237                         // 0xf4000500
51238                         if (((instr & 0xd) == 0xd) ||
51239                             ((instr & 0x20) == 0x20)) {
51240                           UnallocatedA32(instr);
51241                           return;
51242                         }
51243                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51244                         if (dt.Is(kDataTypeValueInvalid)) {
51245                           UnallocatedA32(instr);
51246                           return;
51247                         }
51248                         Alignment align =
51249                             Align_align_3_Decode((instr >> 4) & 0x3);
51250                         if (dt.Is(kDataTypeValueInvalid) ||
51251                             align.Is(kBadAlignment)) {
51252                           UnallocatedA32(instr);
51253                           return;
51254                         }
51255                         unsigned first = ExtractDRegister(instr, 22, 12);
51256                         unsigned length;
51257                         SpacingType spacing;
51258                         switch ((instr >> 8) & 0xf) {
51259                           default:
51260                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51261                           case 0x4:
51262                             length = 3;
51263                             spacing = kSingle;
51264                             break;
51265                           case 0x5:
51266                             length = 3;
51267                             spacing = kDouble;
51268                             break;
51269                         }
51270                         unsigned last =
51271                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51272                         TransferType transfer = kMultipleLanes;
51273                         unsigned rn = (instr >> 16) & 0xf;
51274                         unsigned rm = instr & 0xf;
51275                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51276                         vst3(al,
51277                              dt,
51278                              NeonRegisterList(DRegister(first),
51279                                               DRegister(last),
51280                                               spacing,
51281                                               transfer),
51282                              AlignedMemOperand(Register(rn),
51283                                                align,
51284                                                Register(rm),
51285                                                PostIndex));
51286                         break;
51287                       }
51288                       case 0x00000600: {
51289                         // 0xf4000600
51290                         if (((instr & 0xd) == 0xd) ||
51291                             ((instr & 0xe20) == 0x620) ||
51292                             ((instr & 0xf30) == 0xa30)) {
51293                           UnallocatedA32(instr);
51294                           return;
51295                         }
51296                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51297                         if (dt.Is(kDataTypeValueInvalid)) {
51298                           UnallocatedA32(instr);
51299                           return;
51300                         }
51301                         Alignment align =
51302                             Align_align_5_Decode((instr >> 4) & 0x3);
51303                         if (dt.Is(kDataTypeValueInvalid) ||
51304                             align.Is(kBadAlignment)) {
51305                           UnallocatedA32(instr);
51306                           return;
51307                         }
51308                         unsigned first = ExtractDRegister(instr, 22, 12);
51309                         unsigned length;
51310                         SpacingType spacing = kSingle;
51311                         switch ((instr >> 8) & 0xf) {
51312                           default:
51313                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51314                           case 0x7:
51315                             length = 1;
51316                             break;
51317                           case 0xa:
51318                             length = 2;
51319                             break;
51320                           case 0x6:
51321                             length = 3;
51322                             break;
51323                           case 0x2:
51324                             length = 4;
51325                             break;
51326                         }
51327                         unsigned last = first + length - 1;
51328                         TransferType transfer = kMultipleLanes;
51329                         unsigned rn = (instr >> 16) & 0xf;
51330                         unsigned rm = instr & 0xf;
51331                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51332                         vst1(al,
51333                              dt,
51334                              NeonRegisterList(DRegister(first),
51335                                               DRegister(last),
51336                                               spacing,
51337                                               transfer),
51338                              AlignedMemOperand(Register(rn),
51339                                                align,
51340                                                Register(rm),
51341                                                PostIndex));
51342                         break;
51343                       }
51344                       case 0x00000700: {
51345                         // 0xf4000700
51346                         if (((instr & 0xd) == 0xd) ||
51347                             ((instr & 0xe20) == 0x620) ||
51348                             ((instr & 0xf30) == 0xa30)) {
51349                           UnallocatedA32(instr);
51350                           return;
51351                         }
51352                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51353                         if (dt.Is(kDataTypeValueInvalid)) {
51354                           UnallocatedA32(instr);
51355                           return;
51356                         }
51357                         Alignment align =
51358                             Align_align_5_Decode((instr >> 4) & 0x3);
51359                         if (dt.Is(kDataTypeValueInvalid) ||
51360                             align.Is(kBadAlignment)) {
51361                           UnallocatedA32(instr);
51362                           return;
51363                         }
51364                         unsigned first = ExtractDRegister(instr, 22, 12);
51365                         unsigned length;
51366                         SpacingType spacing = kSingle;
51367                         switch ((instr >> 8) & 0xf) {
51368                           default:
51369                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51370                           case 0x7:
51371                             length = 1;
51372                             break;
51373                           case 0xa:
51374                             length = 2;
51375                             break;
51376                           case 0x6:
51377                             length = 3;
51378                             break;
51379                           case 0x2:
51380                             length = 4;
51381                             break;
51382                         }
51383                         unsigned last = first + length - 1;
51384                         TransferType transfer = kMultipleLanes;
51385                         unsigned rn = (instr >> 16) & 0xf;
51386                         unsigned rm = instr & 0xf;
51387                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51388                         vst1(al,
51389                              dt,
51390                              NeonRegisterList(DRegister(first),
51391                                               DRegister(last),
51392                                               spacing,
51393                                               transfer),
51394                              AlignedMemOperand(Register(rn),
51395                                                align,
51396                                                Register(rm),
51397                                                PostIndex));
51398                         break;
51399                       }
51400                       case 0x00000800: {
51401                         // 0xf4000800
51402                         if (((instr & 0xd) == 0xd) ||
51403                             ((instr & 0xe30) == 0x830)) {
51404                           UnallocatedA32(instr);
51405                           return;
51406                         }
51407                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51408                         if (dt.Is(kDataTypeValueInvalid)) {
51409                           UnallocatedA32(instr);
51410                           return;
51411                         }
51412                         Alignment align =
51413                             Align_align_2_Decode((instr >> 4) & 0x3);
51414                         if (dt.Is(kDataTypeValueInvalid) ||
51415                             align.Is(kBadAlignment)) {
51416                           UnallocatedA32(instr);
51417                           return;
51418                         }
51419                         unsigned first = ExtractDRegister(instr, 22, 12);
51420                         unsigned length;
51421                         SpacingType spacing;
51422                         switch ((instr >> 8) & 0xf) {
51423                           default:
51424                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51425                           case 0x8:
51426                             length = 2;
51427                             spacing = kSingle;
51428                             break;
51429                           case 0x9:
51430                             length = 2;
51431                             spacing = kDouble;
51432                             break;
51433                           case 0x3:
51434                             length = 4;
51435                             spacing = kSingle;
51436                             break;
51437                         }
51438                         unsigned last =
51439                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51440                         TransferType transfer = kMultipleLanes;
51441                         unsigned rn = (instr >> 16) & 0xf;
51442                         unsigned rm = instr & 0xf;
51443                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51444                         vst2(al,
51445                              dt,
51446                              NeonRegisterList(DRegister(first),
51447                                               DRegister(last),
51448                                               spacing,
51449                                               transfer),
51450                              AlignedMemOperand(Register(rn),
51451                                                align,
51452                                                Register(rm),
51453                                                PostIndex));
51454                         break;
51455                       }
51456                       case 0x00000900: {
51457                         // 0xf4000900
51458                         if (((instr & 0xd) == 0xd) ||
51459                             ((instr & 0xe30) == 0x830)) {
51460                           UnallocatedA32(instr);
51461                           return;
51462                         }
51463                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
51464                         if (dt.Is(kDataTypeValueInvalid)) {
51465                           UnallocatedA32(instr);
51466                           return;
51467                         }
51468                         Alignment align =
51469                             Align_align_2_Decode((instr >> 4) & 0x3);
51470                         if (dt.Is(kDataTypeValueInvalid) ||
51471                             align.Is(kBadAlignment)) {
51472                           UnallocatedA32(instr);
51473                           return;
51474                         }
51475                         unsigned first = ExtractDRegister(instr, 22, 12);
51476                         unsigned length;
51477                         SpacingType spacing;
51478                         switch ((instr >> 8) & 0xf) {
51479                           default:
51480                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51481                           case 0x8:
51482                             length = 2;
51483                             spacing = kSingle;
51484                             break;
51485                           case 0x9:
51486                             length = 2;
51487                             spacing = kDouble;
51488                             break;
51489                           case 0x3:
51490                             length = 4;
51491                             spacing = kSingle;
51492                             break;
51493                         }
51494                         unsigned last =
51495                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
51496                         TransferType transfer = kMultipleLanes;
51497                         unsigned rn = (instr >> 16) & 0xf;
51498                         unsigned rm = instr & 0xf;
51499                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51500                         vst2(al,
51501                              dt,
51502                              NeonRegisterList(DRegister(first),
51503                                               DRegister(last),
51504                                               spacing,
51505                                               transfer),
51506                              AlignedMemOperand(Register(rn),
51507                                                align,
51508                                                Register(rm),
51509                                                PostIndex));
51510                         break;
51511                       }
51512                       case 0x00000a00: {
51513                         // 0xf4000a00
51514                         if (((instr & 0xd) == 0xd) ||
51515                             ((instr & 0xe20) == 0x620) ||
51516                             ((instr & 0xf30) == 0xa30)) {
51517                           UnallocatedA32(instr);
51518                           return;
51519                         }
51520                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
51521                         if (dt.Is(kDataTypeValueInvalid)) {
51522                           UnallocatedA32(instr);
51523                           return;
51524                         }
51525                         Alignment align =
51526                             Align_align_5_Decode((instr >> 4) & 0x3);
51527                         if (dt.Is(kDataTypeValueInvalid) ||
51528                             align.Is(kBadAlignment)) {
51529                           UnallocatedA32(instr);
51530                           return;
51531                         }
51532                         unsigned first = ExtractDRegister(instr, 22, 12);
51533                         unsigned length;
51534                         SpacingType spacing = kSingle;
51535                         switch ((instr >> 8) & 0xf) {
51536                           default:
51537                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
51538                           case 0x7:
51539                             length = 1;
51540                             break;
51541                           case 0xa:
51542                             length = 2;
51543                             break;
51544                           case 0x6:
51545                             length = 3;
51546                             break;
51547                           case 0x2:
51548                             length = 4;
51549                             break;
51550                         }
51551                         unsigned last = first + length - 1;
51552                         TransferType transfer = kMultipleLanes;
51553                         unsigned rn = (instr >> 16) & 0xf;
51554                         unsigned rm = instr & 0xf;
51555                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51556                         vst1(al,
51557                              dt,
51558                              NeonRegisterList(DRegister(first),
51559                                               DRegister(last),
51560                                               spacing,
51561                                               transfer),
51562                              AlignedMemOperand(Register(rn),
51563                                                align,
51564                                                Register(rm),
51565                                                PostIndex));
51566                         break;
51567                       }
51568                       default:
51569                         UnallocatedA32(instr);
51570                         break;
51571                     }
51572                     break;
51573                   }
51574                 }
51575                 break;
51576               }
51577               case 0x00800000: {
51578                 // 0xf4800000
51579                 switch (instr & 0x00000300) {
51580                   case 0x00000000: {
51581                     // 0xf4800000
51582                     switch (instr & 0x00000c00) {
51583                       case 0x00000c00: {
51584                         // 0xf4800c00
51585                         UnallocatedA32(instr);
51586                         break;
51587                       }
51588                       default: {
51589                         switch (instr & 0x0000000d) {
51590                           case 0x0000000d: {
51591                             // 0xf480000d
51592                             switch (instr & 0x00000002) {
51593                               case 0x00000000: {
51594                                 // 0xf480000d
51595                                 if (((instr & 0xc00) == 0xc00)) {
51596                                   UnallocatedA32(instr);
51597                                   return;
51598                                 }
51599                                 DataType dt =
51600                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51601                                 if (dt.Is(kDataTypeValueInvalid)) {
51602                                   UnallocatedA32(instr);
51603                                   return;
51604                                 }
51605                                 DecodeNeonAndAlign decode_neon =
51606                                     Align_index_align_1_Decode((instr >> 4) &
51607                                                                    0xf,
51608                                                                dt);
51609                                 if (!decode_neon.IsValid()) {
51610                                   UnallocatedA32(instr);
51611                                   return;
51612                                 }
51613                                 Alignment align = decode_neon.GetAlign();
51614                                 int lane = decode_neon.GetLane();
51615                                 SpacingType spacing = decode_neon.GetSpacing();
51616                                 unsigned first =
51617                                     ExtractDRegister(instr, 22, 12);
51618                                 unsigned length = 1;
51619                                 unsigned last = first + length - 1;
51620                                 unsigned rn = (instr >> 16) & 0xf;
51621                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51622                                 vst1(al,
51623                                      dt,
51624                                      NeonRegisterList(DRegister(first),
51625                                                       DRegister(last),
51626                                                       spacing,
51627                                                       lane),
51628                                      AlignedMemOperand(Register(rn),
51629                                                        align,
51630                                                        PostIndex));
51631                                 break;
51632                               }
51633                               case 0x00000002: {
51634                                 // 0xf480000f
51635                                 if (((instr & 0xc00) == 0xc00)) {
51636                                   UnallocatedA32(instr);
51637                                   return;
51638                                 }
51639                                 DataType dt =
51640                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51641                                 if (dt.Is(kDataTypeValueInvalid)) {
51642                                   UnallocatedA32(instr);
51643                                   return;
51644                                 }
51645                                 DecodeNeonAndAlign decode_neon =
51646                                     Align_index_align_1_Decode((instr >> 4) &
51647                                                                    0xf,
51648                                                                dt);
51649                                 if (!decode_neon.IsValid()) {
51650                                   UnallocatedA32(instr);
51651                                   return;
51652                                 }
51653                                 Alignment align = decode_neon.GetAlign();
51654                                 int lane = decode_neon.GetLane();
51655                                 SpacingType spacing = decode_neon.GetSpacing();
51656                                 unsigned first =
51657                                     ExtractDRegister(instr, 22, 12);
51658                                 unsigned length = 1;
51659                                 unsigned last = first + length - 1;
51660                                 unsigned rn = (instr >> 16) & 0xf;
51661                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51662                                 vst1(al,
51663                                      dt,
51664                                      NeonRegisterList(DRegister(first),
51665                                                       DRegister(last),
51666                                                       spacing,
51667                                                       lane),
51668                                      AlignedMemOperand(Register(rn),
51669                                                        align,
51670                                                        Offset));
51671                                 break;
51672                               }
51673                             }
51674                             break;
51675                           }
51676                           default: {
51677                             if (((instr & 0xc00) == 0xc00) ||
51678                                 ((instr & 0xd) == 0xd)) {
51679                               UnallocatedA32(instr);
51680                               return;
51681                             }
51682                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51683                             if (dt.Is(kDataTypeValueInvalid)) {
51684                               UnallocatedA32(instr);
51685                               return;
51686                             }
51687                             DecodeNeonAndAlign decode_neon =
51688                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
51689                                                            dt);
51690                             if (!decode_neon.IsValid()) {
51691                               UnallocatedA32(instr);
51692                               return;
51693                             }
51694                             Alignment align = decode_neon.GetAlign();
51695                             int lane = decode_neon.GetLane();
51696                             SpacingType spacing = decode_neon.GetSpacing();
51697                             unsigned first = ExtractDRegister(instr, 22, 12);
51698                             unsigned length = 1;
51699                             unsigned last = first + length - 1;
51700                             unsigned rn = (instr >> 16) & 0xf;
51701                             unsigned rm = instr & 0xf;
51702                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51703                             vst1(al,
51704                                  dt,
51705                                  NeonRegisterList(DRegister(first),
51706                                                   DRegister(last),
51707                                                   spacing,
51708                                                   lane),
51709                                  AlignedMemOperand(Register(rn),
51710                                                    align,
51711                                                    Register(rm),
51712                                                    PostIndex));
51713                             break;
51714                           }
51715                         }
51716                         break;
51717                       }
51718                     }
51719                     break;
51720                   }
51721                   case 0x00000100: {
51722                     // 0xf4800100
51723                     switch (instr & 0x00000c00) {
51724                       case 0x00000c00: {
51725                         // 0xf4800d00
51726                         UnallocatedA32(instr);
51727                         break;
51728                       }
51729                       default: {
51730                         switch (instr & 0x0000000d) {
51731                           case 0x0000000d: {
51732                             // 0xf480010d
51733                             switch (instr & 0x00000002) {
51734                               case 0x00000000: {
51735                                 // 0xf480010d
51736                                 if (((instr & 0xc00) == 0xc00)) {
51737                                   UnallocatedA32(instr);
51738                                   return;
51739                                 }
51740                                 DataType dt =
51741                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51742                                 if (dt.Is(kDataTypeValueInvalid)) {
51743                                   UnallocatedA32(instr);
51744                                   return;
51745                                 }
51746                                 DecodeNeonAndAlign decode_neon =
51747                                     Align_index_align_2_Decode((instr >> 4) &
51748                                                                    0xf,
51749                                                                dt);
51750                                 if (!decode_neon.IsValid()) {
51751                                   UnallocatedA32(instr);
51752                                   return;
51753                                 }
51754                                 Alignment align = decode_neon.GetAlign();
51755                                 int lane = decode_neon.GetLane();
51756                                 SpacingType spacing = decode_neon.GetSpacing();
51757                                 unsigned first =
51758                                     ExtractDRegister(instr, 22, 12);
51759                                 unsigned length = 2;
51760                                 unsigned last =
51761                                     first +
51762                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51763                                 unsigned rn = (instr >> 16) & 0xf;
51764                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
51765                                 vst2(al,
51766                                      dt,
51767                                      NeonRegisterList(DRegister(first),
51768                                                       DRegister(last),
51769                                                       spacing,
51770                                                       lane),
51771                                      AlignedMemOperand(Register(rn),
51772                                                        align,
51773                                                        PostIndex));
51774                                 break;
51775                               }
51776                               case 0x00000002: {
51777                                 // 0xf480010f
51778                                 if (((instr & 0xc00) == 0xc00)) {
51779                                   UnallocatedA32(instr);
51780                                   return;
51781                                 }
51782                                 DataType dt =
51783                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51784                                 if (dt.Is(kDataTypeValueInvalid)) {
51785                                   UnallocatedA32(instr);
51786                                   return;
51787                                 }
51788                                 DecodeNeonAndAlign decode_neon =
51789                                     Align_index_align_2_Decode((instr >> 4) &
51790                                                                    0xf,
51791                                                                dt);
51792                                 if (!decode_neon.IsValid()) {
51793                                   UnallocatedA32(instr);
51794                                   return;
51795                                 }
51796                                 Alignment align = decode_neon.GetAlign();
51797                                 int lane = decode_neon.GetLane();
51798                                 SpacingType spacing = decode_neon.GetSpacing();
51799                                 unsigned first =
51800                                     ExtractDRegister(instr, 22, 12);
51801                                 unsigned length = 2;
51802                                 unsigned last =
51803                                     first +
51804                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51805                                 unsigned rn = (instr >> 16) & 0xf;
51806                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
51807                                 vst2(al,
51808                                      dt,
51809                                      NeonRegisterList(DRegister(first),
51810                                                       DRegister(last),
51811                                                       spacing,
51812                                                       lane),
51813                                      AlignedMemOperand(Register(rn),
51814                                                        align,
51815                                                        Offset));
51816                                 break;
51817                               }
51818                             }
51819                             break;
51820                           }
51821                           default: {
51822                             if (((instr & 0xc00) == 0xc00) ||
51823                                 ((instr & 0xd) == 0xd)) {
51824                               UnallocatedA32(instr);
51825                               return;
51826                             }
51827                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
51828                             if (dt.Is(kDataTypeValueInvalid)) {
51829                               UnallocatedA32(instr);
51830                               return;
51831                             }
51832                             DecodeNeonAndAlign decode_neon =
51833                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
51834                                                            dt);
51835                             if (!decode_neon.IsValid()) {
51836                               UnallocatedA32(instr);
51837                               return;
51838                             }
51839                             Alignment align = decode_neon.GetAlign();
51840                             int lane = decode_neon.GetLane();
51841                             SpacingType spacing = decode_neon.GetSpacing();
51842                             unsigned first = ExtractDRegister(instr, 22, 12);
51843                             unsigned length = 2;
51844                             unsigned last =
51845                                 first +
51846                                 (length - 1) * (spacing == kSingle ? 1 : 2);
51847                             unsigned rn = (instr >> 16) & 0xf;
51848                             unsigned rm = instr & 0xf;
51849                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
51850                             vst2(al,
51851                                  dt,
51852                                  NeonRegisterList(DRegister(first),
51853                                                   DRegister(last),
51854                                                   spacing,
51855                                                   lane),
51856                                  AlignedMemOperand(Register(rn),
51857                                                    align,
51858                                                    Register(rm),
51859                                                    PostIndex));
51860                             break;
51861                           }
51862                         }
51863                         break;
51864                       }
51865                     }
51866                     break;
51867                   }
51868                   case 0x00000200: {
51869                     // 0xf4800200
51870                     switch (instr & 0x00000c30) {
51871                       case 0x00000010: {
51872                         // 0xf4800210
51873                         UnallocatedA32(instr);
51874                         break;
51875                       }
51876                       case 0x00000030: {
51877                         // 0xf4800230
51878                         UnallocatedA32(instr);
51879                         break;
51880                       }
51881                       case 0x00000410: {
51882                         // 0xf4800610
51883                         UnallocatedA32(instr);
51884                         break;
51885                       }
51886                       case 0x00000430: {
51887                         // 0xf4800630
51888                         UnallocatedA32(instr);
51889                         break;
51890                       }
51891                       case 0x00000810: {
51892                         // 0xf4800a10
51893                         UnallocatedA32(instr);
51894                         break;
51895                       }
51896                       case 0x00000820: {
51897                         // 0xf4800a20
51898                         UnallocatedA32(instr);
51899                         break;
51900                       }
51901                       case 0x00000830: {
51902                         // 0xf4800a30
51903                         UnallocatedA32(instr);
51904                         break;
51905                       }
51906                       case 0x00000c00: {
51907                         // 0xf4800e00
51908                         UnallocatedA32(instr);
51909                         break;
51910                       }
51911                       case 0x00000c10: {
51912                         // 0xf4800e10
51913                         UnallocatedA32(instr);
51914                         break;
51915                       }
51916                       case 0x00000c20: {
51917                         // 0xf4800e20
51918                         UnallocatedA32(instr);
51919                         break;
51920                       }
51921                       case 0x00000c30: {
51922                         // 0xf4800e30
51923                         UnallocatedA32(instr);
51924                         break;
51925                       }
51926                       default: {
51927                         switch (instr & 0x0000000d) {
51928                           case 0x0000000d: {
51929                             // 0xf480020d
51930                             switch (instr & 0x00000002) {
51931                               case 0x00000000: {
51932                                 // 0xf480020d
51933                                 if (((instr & 0xc00) == 0xc00) ||
51934                                     ((instr & 0x810) == 0x10) ||
51935                                     ((instr & 0xc30) == 0x810) ||
51936                                     ((instr & 0xc30) == 0x820) ||
51937                                     ((instr & 0xc30) == 0x830)) {
51938                                   UnallocatedA32(instr);
51939                                   return;
51940                                 }
51941                                 DataType dt =
51942                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51943                                 if (dt.Is(kDataTypeValueInvalid)) {
51944                                   UnallocatedA32(instr);
51945                                   return;
51946                                 }
51947                                 DecodeNeon decode_neon =
51948                                     Index_1_Decode((instr >> 4) & 0xf, dt);
51949                                 if (!decode_neon.IsValid()) {
51950                                   UnallocatedA32(instr);
51951                                   return;
51952                                 }
51953                                 int lane = decode_neon.GetLane();
51954                                 SpacingType spacing = decode_neon.GetSpacing();
51955                                 unsigned first =
51956                                     ExtractDRegister(instr, 22, 12);
51957                                 unsigned length = 3;
51958                                 unsigned last =
51959                                     first +
51960                                     (length - 1) * (spacing == kSingle ? 1 : 2);
51961                                 unsigned rn = (instr >> 16) & 0xf;
51962                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
51963                                 vst3(al,
51964                                      dt,
51965                                      NeonRegisterList(DRegister(first),
51966                                                       DRegister(last),
51967                                                       spacing,
51968                                                       lane),
51969                                      MemOperand(Register(rn), PreIndex));
51970                                 break;
51971                               }
51972                               case 0x00000002: {
51973                                 // 0xf480020f
51974                                 if (((instr & 0xc00) == 0xc00) ||
51975                                     ((instr & 0x810) == 0x10) ||
51976                                     ((instr & 0xc30) == 0x810) ||
51977                                     ((instr & 0xc30) == 0x820) ||
51978                                     ((instr & 0xc30) == 0x830)) {
51979                                   UnallocatedA32(instr);
51980                                   return;
51981                                 }
51982                                 DataType dt =
51983                                     Dt_size_7_Decode((instr >> 10) & 0x3);
51984                                 if (dt.Is(kDataTypeValueInvalid)) {
51985                                   UnallocatedA32(instr);
51986                                   return;
51987                                 }
51988                                 DecodeNeon decode_neon =
51989                                     Index_1_Decode((instr >> 4) & 0xf, dt);
51990                                 if (!decode_neon.IsValid()) {
51991                                   UnallocatedA32(instr);
51992                                   return;
51993                                 }
51994                                 int lane = decode_neon.GetLane();
51995                                 SpacingType spacing = decode_neon.GetSpacing();
51996                                 unsigned first =
51997                                     ExtractDRegister(instr, 22, 12);
51998                                 unsigned length = 3;
51999                                 unsigned last =
52000                                     first +
52001                                     (length - 1) * (spacing == kSingle ? 1 : 2);
52002                                 unsigned rn = (instr >> 16) & 0xf;
52003                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
52004                                 vst3(al,
52005                                      dt,
52006                                      NeonRegisterList(DRegister(first),
52007                                                       DRegister(last),
52008                                                       spacing,
52009                                                       lane),
52010                                      MemOperand(Register(rn), Offset));
52011                                 break;
52012                               }
52013                             }
52014                             break;
52015                           }
52016                           default: {
52017                             if (((instr & 0xc00) == 0xc00) ||
52018                                 ((instr & 0xd) == 0xd) ||
52019                                 ((instr & 0x810) == 0x10) ||
52020                                 ((instr & 0xc30) == 0x810) ||
52021                                 ((instr & 0xc30) == 0x820) ||
52022                                 ((instr & 0xc30) == 0x830)) {
52023                               UnallocatedA32(instr);
52024                               return;
52025                             }
52026                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
52027                             if (dt.Is(kDataTypeValueInvalid)) {
52028                               UnallocatedA32(instr);
52029                               return;
52030                             }
52031                             DecodeNeon decode_neon =
52032                                 Index_1_Decode((instr >> 4) & 0xf, dt);
52033                             if (!decode_neon.IsValid()) {
52034                               UnallocatedA32(instr);
52035                               return;
52036                             }
52037                             int lane = decode_neon.GetLane();
52038                             SpacingType spacing = decode_neon.GetSpacing();
52039                             unsigned first = ExtractDRegister(instr, 22, 12);
52040                             unsigned length = 3;
52041                             unsigned last =
52042                                 first +
52043                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52044                             unsigned rn = (instr >> 16) & 0xf;
52045                             Sign sign(plus);
52046                             unsigned rm = instr & 0xf;
52047                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
52048                             vst3(al,
52049                                  dt,
52050                                  NeonRegisterList(DRegister(first),
52051                                                   DRegister(last),
52052                                                   spacing,
52053                                                   lane),
52054                                  MemOperand(Register(rn),
52055                                             sign,
52056                                             Register(rm),
52057                                             PostIndex));
52058                             break;
52059                           }
52060                         }
52061                         break;
52062                       }
52063                     }
52064                     break;
52065                   }
52066                   case 0x00000300: {
52067                     // 0xf4800300
52068                     switch (instr & 0x00000c00) {
52069                       case 0x00000c00: {
52070                         // 0xf4800f00
52071                         UnallocatedA32(instr);
52072                         break;
52073                       }
52074                       default: {
52075                         switch (instr & 0x0000000d) {
52076                           case 0x0000000d: {
52077                             // 0xf480030d
52078                             switch (instr & 0x00000002) {
52079                               case 0x00000000: {
52080                                 // 0xf480030d
52081                                 if (((instr & 0xc00) == 0xc00)) {
52082                                   UnallocatedA32(instr);
52083                                   return;
52084                                 }
52085                                 DataType dt =
52086                                     Dt_size_7_Decode((instr >> 10) & 0x3);
52087                                 if (dt.Is(kDataTypeValueInvalid)) {
52088                                   UnallocatedA32(instr);
52089                                   return;
52090                                 }
52091                                 DecodeNeonAndAlign decode_neon =
52092                                     Align_index_align_3_Decode((instr >> 4) &
52093                                                                    0xf,
52094                                                                dt);
52095                                 if (!decode_neon.IsValid()) {
52096                                   UnallocatedA32(instr);
52097                                   return;
52098                                 }
52099                                 Alignment align = decode_neon.GetAlign();
52100                                 int lane = decode_neon.GetLane();
52101                                 SpacingType spacing = decode_neon.GetSpacing();
52102                                 unsigned first =
52103                                     ExtractDRegister(instr, 22, 12);
52104                                 unsigned length = 4;
52105                                 unsigned last =
52106                                     first +
52107                                     (length - 1) * (spacing == kSingle ? 1 : 2);
52108                                 unsigned rn = (instr >> 16) & 0xf;
52109                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52110                                 vst4(al,
52111                                      dt,
52112                                      NeonRegisterList(DRegister(first),
52113                                                       DRegister(last),
52114                                                       spacing,
52115                                                       lane),
52116                                      AlignedMemOperand(Register(rn),
52117                                                        align,
52118                                                        PostIndex));
52119                                 break;
52120                               }
52121                               case 0x00000002: {
52122                                 // 0xf480030f
52123                                 if (((instr & 0xc00) == 0xc00)) {
52124                                   UnallocatedA32(instr);
52125                                   return;
52126                                 }
52127                                 DataType dt =
52128                                     Dt_size_7_Decode((instr >> 10) & 0x3);
52129                                 if (dt.Is(kDataTypeValueInvalid)) {
52130                                   UnallocatedA32(instr);
52131                                   return;
52132                                 }
52133                                 DecodeNeonAndAlign decode_neon =
52134                                     Align_index_align_3_Decode((instr >> 4) &
52135                                                                    0xf,
52136                                                                dt);
52137                                 if (!decode_neon.IsValid()) {
52138                                   UnallocatedA32(instr);
52139                                   return;
52140                                 }
52141                                 Alignment align = decode_neon.GetAlign();
52142                                 int lane = decode_neon.GetLane();
52143                                 SpacingType spacing = decode_neon.GetSpacing();
52144                                 unsigned first =
52145                                     ExtractDRegister(instr, 22, 12);
52146                                 unsigned length = 4;
52147                                 unsigned last =
52148                                     first +
52149                                     (length - 1) * (spacing == kSingle ? 1 : 2);
52150                                 unsigned rn = (instr >> 16) & 0xf;
52151                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
52152                                 vst4(al,
52153                                      dt,
52154                                      NeonRegisterList(DRegister(first),
52155                                                       DRegister(last),
52156                                                       spacing,
52157                                                       lane),
52158                                      AlignedMemOperand(Register(rn),
52159                                                        align,
52160                                                        Offset));
52161                                 break;
52162                               }
52163                             }
52164                             break;
52165                           }
52166                           default: {
52167                             if (((instr & 0xc00) == 0xc00) ||
52168                                 ((instr & 0xd) == 0xd)) {
52169                               UnallocatedA32(instr);
52170                               return;
52171                             }
52172                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
52173                             if (dt.Is(kDataTypeValueInvalid)) {
52174                               UnallocatedA32(instr);
52175                               return;
52176                             }
52177                             DecodeNeonAndAlign decode_neon =
52178                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
52179                                                            dt);
52180                             if (!decode_neon.IsValid()) {
52181                               UnallocatedA32(instr);
52182                               return;
52183                             }
52184                             Alignment align = decode_neon.GetAlign();
52185                             int lane = decode_neon.GetLane();
52186                             SpacingType spacing = decode_neon.GetSpacing();
52187                             unsigned first = ExtractDRegister(instr, 22, 12);
52188                             unsigned length = 4;
52189                             unsigned last =
52190                                 first +
52191                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52192                             unsigned rn = (instr >> 16) & 0xf;
52193                             unsigned rm = instr & 0xf;
52194                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
52195                             vst4(al,
52196                                  dt,
52197                                  NeonRegisterList(DRegister(first),
52198                                                   DRegister(last),
52199                                                   spacing,
52200                                                   lane),
52201                                  AlignedMemOperand(Register(rn),
52202                                                    align,
52203                                                    Register(rm),
52204                                                    PostIndex));
52205                             break;
52206                           }
52207                         }
52208                         break;
52209                       }
52210                     }
52211                     break;
52212                   }
52213                 }
52214                 break;
52215               }
52216             }
52217             break;
52218           }
52219           case 0x00100000: {
52220             // 0xf4100000
52221             switch (instr & 0x00400000) {
52222               case 0x00400000: {
52223                 // 0xf4500000
52224                 switch (instr & 0x000f0000) {
52225                   case 0x000f0000: {
52226                     // 0xf45f0000
52227                     uint32_t U = (instr >> 23) & 0x1;
52228                     int32_t imm = instr & 0xfff;
52229                     if (U == 0) imm = -imm;
52230                     bool minus_zero = (imm == 0) && (U == 0);
52231                     Label label(imm, kA32PcDelta, minus_zero);
52232                     // PLI{<c>}{<q>} <label> ; A1
52233                     pli(al, &label);
52234                     if (((instr & 0xff7ff000) != 0xf45ff000)) {
52235                       UnpredictableA32(instr);
52236                     }
52237                     break;
52238                   }
52239                   default: {
52240                     if (((instr & 0xf0000) == 0xf0000)) {
52241                       UnallocatedA32(instr);
52242                       return;
52243                     }
52244                     unsigned rn = (instr >> 16) & 0xf;
52245                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
52246                     int32_t offset = instr & 0xfff;
52247                     // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
52248                     pli(al, MemOperand(Register(rn), sign, offset, Offset));
52249                     if (((instr & 0xff70f000) != 0xf450f000)) {
52250                       UnpredictableA32(instr);
52251                     }
52252                     break;
52253                   }
52254                 }
52255                 break;
52256               }
52257               default:
52258                 UnallocatedA32(instr);
52259                 break;
52260             }
52261             break;
52262           }
52263           case 0x00200000: {
52264             // 0xf4200000
52265             switch (instr & 0x00800000) {
52266               case 0x00000000: {
52267                 // 0xf4200000
52268                 switch (instr & 0x0000000d) {
52269                   case 0x0000000d: {
52270                     // 0xf420000d
52271                     switch (instr & 0x00000002) {
52272                       case 0x00000000: {
52273                         // 0xf420000d
52274                         switch (instr & 0x00000f00) {
52275                           case 0x00000000: {
52276                             // 0xf420000d
52277                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52278                             if (dt.Is(kDataTypeValueInvalid)) {
52279                               UnallocatedA32(instr);
52280                               return;
52281                             }
52282                             Alignment align =
52283                                 Align_align_4_Decode((instr >> 4) & 0x3);
52284                             if (dt.Is(kDataTypeValueInvalid) ||
52285                                 align.Is(kBadAlignment)) {
52286                               UnallocatedA32(instr);
52287                               return;
52288                             }
52289                             unsigned first = ExtractDRegister(instr, 22, 12);
52290                             unsigned length;
52291                             SpacingType spacing;
52292                             switch ((instr >> 8) & 0xf) {
52293                               default:
52294                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52295                               case 0x0:
52296                                 length = 4;
52297                                 spacing = kSingle;
52298                                 break;
52299                               case 0x1:
52300                                 length = 4;
52301                                 spacing = kDouble;
52302                                 break;
52303                             }
52304                             unsigned last =
52305                                 first +
52306                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52307                             TransferType transfer = kMultipleLanes;
52308                             unsigned rn = (instr >> 16) & 0xf;
52309                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52310                             vld4(al,
52311                                  dt,
52312                                  NeonRegisterList(DRegister(first),
52313                                                   DRegister(last),
52314                                                   spacing,
52315                                                   transfer),
52316                                  AlignedMemOperand(Register(rn),
52317                                                    align,
52318                                                    PostIndex));
52319                             break;
52320                           }
52321                           case 0x00000100: {
52322                             // 0xf420010d
52323                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52324                             if (dt.Is(kDataTypeValueInvalid)) {
52325                               UnallocatedA32(instr);
52326                               return;
52327                             }
52328                             Alignment align =
52329                                 Align_align_4_Decode((instr >> 4) & 0x3);
52330                             if (dt.Is(kDataTypeValueInvalid) ||
52331                                 align.Is(kBadAlignment)) {
52332                               UnallocatedA32(instr);
52333                               return;
52334                             }
52335                             unsigned first = ExtractDRegister(instr, 22, 12);
52336                             unsigned length;
52337                             SpacingType spacing;
52338                             switch ((instr >> 8) & 0xf) {
52339                               default:
52340                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52341                               case 0x0:
52342                                 length = 4;
52343                                 spacing = kSingle;
52344                                 break;
52345                               case 0x1:
52346                                 length = 4;
52347                                 spacing = kDouble;
52348                                 break;
52349                             }
52350                             unsigned last =
52351                                 first +
52352                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52353                             TransferType transfer = kMultipleLanes;
52354                             unsigned rn = (instr >> 16) & 0xf;
52355                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52356                             vld4(al,
52357                                  dt,
52358                                  NeonRegisterList(DRegister(first),
52359                                                   DRegister(last),
52360                                                   spacing,
52361                                                   transfer),
52362                                  AlignedMemOperand(Register(rn),
52363                                                    align,
52364                                                    PostIndex));
52365                             break;
52366                           }
52367                           case 0x00000200: {
52368                             // 0xf420020d
52369                             if (((instr & 0xe20) == 0x620) ||
52370                                 ((instr & 0xf30) == 0xa30)) {
52371                               UnallocatedA32(instr);
52372                               return;
52373                             }
52374                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52375                             if (dt.Is(kDataTypeValueInvalid)) {
52376                               UnallocatedA32(instr);
52377                               return;
52378                             }
52379                             Alignment align =
52380                                 Align_align_1_Decode((instr >> 4) & 0x3);
52381                             if (dt.Is(kDataTypeValueInvalid) ||
52382                                 align.Is(kBadAlignment)) {
52383                               UnallocatedA32(instr);
52384                               return;
52385                             }
52386                             unsigned first = ExtractDRegister(instr, 22, 12);
52387                             unsigned length;
52388                             SpacingType spacing = kSingle;
52389                             switch ((instr >> 8) & 0xf) {
52390                               default:
52391                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52392                               case 0x7:
52393                                 length = 1;
52394                                 break;
52395                               case 0xa:
52396                                 length = 2;
52397                                 break;
52398                               case 0x6:
52399                                 length = 3;
52400                                 break;
52401                               case 0x2:
52402                                 length = 4;
52403                                 break;
52404                             }
52405                             unsigned last = first + length - 1;
52406                             TransferType transfer = kMultipleLanes;
52407                             unsigned rn = (instr >> 16) & 0xf;
52408                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52409                             vld1(al,
52410                                  dt,
52411                                  NeonRegisterList(DRegister(first),
52412                                                   DRegister(last),
52413                                                   spacing,
52414                                                   transfer),
52415                                  AlignedMemOperand(Register(rn),
52416                                                    align,
52417                                                    PostIndex));
52418                             break;
52419                           }
52420                           case 0x00000300: {
52421                             // 0xf420030d
52422                             if (((instr & 0xe30) == 0x830)) {
52423                               UnallocatedA32(instr);
52424                               return;
52425                             }
52426                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52427                             if (dt.Is(kDataTypeValueInvalid)) {
52428                               UnallocatedA32(instr);
52429                               return;
52430                             }
52431                             Alignment align =
52432                                 Align_align_2_Decode((instr >> 4) & 0x3);
52433                             if (dt.Is(kDataTypeValueInvalid) ||
52434                                 align.Is(kBadAlignment)) {
52435                               UnallocatedA32(instr);
52436                               return;
52437                             }
52438                             unsigned first = ExtractDRegister(instr, 22, 12);
52439                             unsigned length;
52440                             SpacingType spacing;
52441                             switch ((instr >> 8) & 0xf) {
52442                               default:
52443                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52444                               case 0x8:
52445                                 length = 2;
52446                                 spacing = kSingle;
52447                                 break;
52448                               case 0x9:
52449                                 length = 2;
52450                                 spacing = kDouble;
52451                                 break;
52452                               case 0x3:
52453                                 length = 4;
52454                                 spacing = kSingle;
52455                                 break;
52456                             }
52457                             unsigned last =
52458                                 first +
52459                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52460                             TransferType transfer = kMultipleLanes;
52461                             unsigned rn = (instr >> 16) & 0xf;
52462                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52463                             vld2(al,
52464                                  dt,
52465                                  NeonRegisterList(DRegister(first),
52466                                                   DRegister(last),
52467                                                   spacing,
52468                                                   transfer),
52469                                  AlignedMemOperand(Register(rn),
52470                                                    align,
52471                                                    PostIndex));
52472                             break;
52473                           }
52474                           case 0x00000400: {
52475                             // 0xf420040d
52476                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52477                             if (dt.Is(kDataTypeValueInvalid)) {
52478                               UnallocatedA32(instr);
52479                               return;
52480                             }
52481                             Alignment align =
52482                                 Align_align_3_Decode((instr >> 4) & 0x3);
52483                             if (dt.Is(kDataTypeValueInvalid) ||
52484                                 align.Is(kBadAlignment)) {
52485                               UnallocatedA32(instr);
52486                               return;
52487                             }
52488                             unsigned first = ExtractDRegister(instr, 22, 12);
52489                             unsigned length;
52490                             SpacingType spacing;
52491                             switch ((instr >> 8) & 0xf) {
52492                               default:
52493                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52494                               case 0x4:
52495                                 length = 3;
52496                                 spacing = kSingle;
52497                                 break;
52498                               case 0x5:
52499                                 length = 3;
52500                                 spacing = kDouble;
52501                                 break;
52502                             }
52503                             unsigned last =
52504                                 first +
52505                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52506                             TransferType transfer = kMultipleLanes;
52507                             unsigned rn = (instr >> 16) & 0xf;
52508                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52509                             vld3(al,
52510                                  dt,
52511                                  NeonRegisterList(DRegister(first),
52512                                                   DRegister(last),
52513                                                   spacing,
52514                                                   transfer),
52515                                  AlignedMemOperand(Register(rn),
52516                                                    align,
52517                                                    PostIndex));
52518                             break;
52519                           }
52520                           case 0x00000500: {
52521                             // 0xf420050d
52522                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52523                             if (dt.Is(kDataTypeValueInvalid)) {
52524                               UnallocatedA32(instr);
52525                               return;
52526                             }
52527                             Alignment align =
52528                                 Align_align_3_Decode((instr >> 4) & 0x3);
52529                             if (dt.Is(kDataTypeValueInvalid) ||
52530                                 align.Is(kBadAlignment)) {
52531                               UnallocatedA32(instr);
52532                               return;
52533                             }
52534                             unsigned first = ExtractDRegister(instr, 22, 12);
52535                             unsigned length;
52536                             SpacingType spacing;
52537                             switch ((instr >> 8) & 0xf) {
52538                               default:
52539                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52540                               case 0x4:
52541                                 length = 3;
52542                                 spacing = kSingle;
52543                                 break;
52544                               case 0x5:
52545                                 length = 3;
52546                                 spacing = kDouble;
52547                                 break;
52548                             }
52549                             unsigned last =
52550                                 first +
52551                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52552                             TransferType transfer = kMultipleLanes;
52553                             unsigned rn = (instr >> 16) & 0xf;
52554                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52555                             vld3(al,
52556                                  dt,
52557                                  NeonRegisterList(DRegister(first),
52558                                                   DRegister(last),
52559                                                   spacing,
52560                                                   transfer),
52561                                  AlignedMemOperand(Register(rn),
52562                                                    align,
52563                                                    PostIndex));
52564                             break;
52565                           }
52566                           case 0x00000600: {
52567                             // 0xf420060d
52568                             if (((instr & 0xe20) == 0x620) ||
52569                                 ((instr & 0xf30) == 0xa30)) {
52570                               UnallocatedA32(instr);
52571                               return;
52572                             }
52573                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52574                             if (dt.Is(kDataTypeValueInvalid)) {
52575                               UnallocatedA32(instr);
52576                               return;
52577                             }
52578                             Alignment align =
52579                                 Align_align_1_Decode((instr >> 4) & 0x3);
52580                             if (dt.Is(kDataTypeValueInvalid) ||
52581                                 align.Is(kBadAlignment)) {
52582                               UnallocatedA32(instr);
52583                               return;
52584                             }
52585                             unsigned first = ExtractDRegister(instr, 22, 12);
52586                             unsigned length;
52587                             SpacingType spacing = kSingle;
52588                             switch ((instr >> 8) & 0xf) {
52589                               default:
52590                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52591                               case 0x7:
52592                                 length = 1;
52593                                 break;
52594                               case 0xa:
52595                                 length = 2;
52596                                 break;
52597                               case 0x6:
52598                                 length = 3;
52599                                 break;
52600                               case 0x2:
52601                                 length = 4;
52602                                 break;
52603                             }
52604                             unsigned last = first + length - 1;
52605                             TransferType transfer = kMultipleLanes;
52606                             unsigned rn = (instr >> 16) & 0xf;
52607                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52608                             vld1(al,
52609                                  dt,
52610                                  NeonRegisterList(DRegister(first),
52611                                                   DRegister(last),
52612                                                   spacing,
52613                                                   transfer),
52614                                  AlignedMemOperand(Register(rn),
52615                                                    align,
52616                                                    PostIndex));
52617                             break;
52618                           }
52619                           case 0x00000700: {
52620                             // 0xf420070d
52621                             if (((instr & 0xe20) == 0x620) ||
52622                                 ((instr & 0xf30) == 0xa30)) {
52623                               UnallocatedA32(instr);
52624                               return;
52625                             }
52626                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52627                             if (dt.Is(kDataTypeValueInvalid)) {
52628                               UnallocatedA32(instr);
52629                               return;
52630                             }
52631                             Alignment align =
52632                                 Align_align_1_Decode((instr >> 4) & 0x3);
52633                             if (dt.Is(kDataTypeValueInvalid) ||
52634                                 align.Is(kBadAlignment)) {
52635                               UnallocatedA32(instr);
52636                               return;
52637                             }
52638                             unsigned first = ExtractDRegister(instr, 22, 12);
52639                             unsigned length;
52640                             SpacingType spacing = kSingle;
52641                             switch ((instr >> 8) & 0xf) {
52642                               default:
52643                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52644                               case 0x7:
52645                                 length = 1;
52646                                 break;
52647                               case 0xa:
52648                                 length = 2;
52649                                 break;
52650                               case 0x6:
52651                                 length = 3;
52652                                 break;
52653                               case 0x2:
52654                                 length = 4;
52655                                 break;
52656                             }
52657                             unsigned last = first + length - 1;
52658                             TransferType transfer = kMultipleLanes;
52659                             unsigned rn = (instr >> 16) & 0xf;
52660                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52661                             vld1(al,
52662                                  dt,
52663                                  NeonRegisterList(DRegister(first),
52664                                                   DRegister(last),
52665                                                   spacing,
52666                                                   transfer),
52667                                  AlignedMemOperand(Register(rn),
52668                                                    align,
52669                                                    PostIndex));
52670                             break;
52671                           }
52672                           case 0x00000800: {
52673                             // 0xf420080d
52674                             if (((instr & 0xe30) == 0x830)) {
52675                               UnallocatedA32(instr);
52676                               return;
52677                             }
52678                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52679                             if (dt.Is(kDataTypeValueInvalid)) {
52680                               UnallocatedA32(instr);
52681                               return;
52682                             }
52683                             Alignment align =
52684                                 Align_align_2_Decode((instr >> 4) & 0x3);
52685                             if (dt.Is(kDataTypeValueInvalid) ||
52686                                 align.Is(kBadAlignment)) {
52687                               UnallocatedA32(instr);
52688                               return;
52689                             }
52690                             unsigned first = ExtractDRegister(instr, 22, 12);
52691                             unsigned length;
52692                             SpacingType spacing;
52693                             switch ((instr >> 8) & 0xf) {
52694                               default:
52695                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52696                               case 0x8:
52697                                 length = 2;
52698                                 spacing = kSingle;
52699                                 break;
52700                               case 0x9:
52701                                 length = 2;
52702                                 spacing = kDouble;
52703                                 break;
52704                               case 0x3:
52705                                 length = 4;
52706                                 spacing = kSingle;
52707                                 break;
52708                             }
52709                             unsigned last =
52710                                 first +
52711                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52712                             TransferType transfer = kMultipleLanes;
52713                             unsigned rn = (instr >> 16) & 0xf;
52714                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52715                             vld2(al,
52716                                  dt,
52717                                  NeonRegisterList(DRegister(first),
52718                                                   DRegister(last),
52719                                                   spacing,
52720                                                   transfer),
52721                                  AlignedMemOperand(Register(rn),
52722                                                    align,
52723                                                    PostIndex));
52724                             break;
52725                           }
52726                           case 0x00000900: {
52727                             // 0xf420090d
52728                             if (((instr & 0xe30) == 0x830)) {
52729                               UnallocatedA32(instr);
52730                               return;
52731                             }
52732                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52733                             if (dt.Is(kDataTypeValueInvalid)) {
52734                               UnallocatedA32(instr);
52735                               return;
52736                             }
52737                             Alignment align =
52738                                 Align_align_2_Decode((instr >> 4) & 0x3);
52739                             if (dt.Is(kDataTypeValueInvalid) ||
52740                                 align.Is(kBadAlignment)) {
52741                               UnallocatedA32(instr);
52742                               return;
52743                             }
52744                             unsigned first = ExtractDRegister(instr, 22, 12);
52745                             unsigned length;
52746                             SpacingType spacing;
52747                             switch ((instr >> 8) & 0xf) {
52748                               default:
52749                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52750                               case 0x8:
52751                                 length = 2;
52752                                 spacing = kSingle;
52753                                 break;
52754                               case 0x9:
52755                                 length = 2;
52756                                 spacing = kDouble;
52757                                 break;
52758                               case 0x3:
52759                                 length = 4;
52760                                 spacing = kSingle;
52761                                 break;
52762                             }
52763                             unsigned last =
52764                                 first +
52765                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52766                             TransferType transfer = kMultipleLanes;
52767                             unsigned rn = (instr >> 16) & 0xf;
52768                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52769                             vld2(al,
52770                                  dt,
52771                                  NeonRegisterList(DRegister(first),
52772                                                   DRegister(last),
52773                                                   spacing,
52774                                                   transfer),
52775                                  AlignedMemOperand(Register(rn),
52776                                                    align,
52777                                                    PostIndex));
52778                             break;
52779                           }
52780                           case 0x00000a00: {
52781                             // 0xf4200a0d
52782                             if (((instr & 0xe20) == 0x620) ||
52783                                 ((instr & 0xf30) == 0xa30)) {
52784                               UnallocatedA32(instr);
52785                               return;
52786                             }
52787                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52788                             if (dt.Is(kDataTypeValueInvalid)) {
52789                               UnallocatedA32(instr);
52790                               return;
52791                             }
52792                             Alignment align =
52793                                 Align_align_1_Decode((instr >> 4) & 0x3);
52794                             if (dt.Is(kDataTypeValueInvalid) ||
52795                                 align.Is(kBadAlignment)) {
52796                               UnallocatedA32(instr);
52797                               return;
52798                             }
52799                             unsigned first = ExtractDRegister(instr, 22, 12);
52800                             unsigned length;
52801                             SpacingType spacing = kSingle;
52802                             switch ((instr >> 8) & 0xf) {
52803                               default:
52804                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52805                               case 0x7:
52806                                 length = 1;
52807                                 break;
52808                               case 0xa:
52809                                 length = 2;
52810                                 break;
52811                               case 0x6:
52812                                 length = 3;
52813                                 break;
52814                               case 0x2:
52815                                 length = 4;
52816                                 break;
52817                             }
52818                             unsigned last = first + length - 1;
52819                             TransferType transfer = kMultipleLanes;
52820                             unsigned rn = (instr >> 16) & 0xf;
52821                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
52822                             vld1(al,
52823                                  dt,
52824                                  NeonRegisterList(DRegister(first),
52825                                                   DRegister(last),
52826                                                   spacing,
52827                                                   transfer),
52828                                  AlignedMemOperand(Register(rn),
52829                                                    align,
52830                                                    PostIndex));
52831                             break;
52832                           }
52833                           default:
52834                             UnallocatedA32(instr);
52835                             break;
52836                         }
52837                         break;
52838                       }
52839                       case 0x00000002: {
52840                         // 0xf420000f
52841                         switch (instr & 0x00000f00) {
52842                           case 0x00000000: {
52843                             // 0xf420000d
52844                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52845                             if (dt.Is(kDataTypeValueInvalid)) {
52846                               UnallocatedA32(instr);
52847                               return;
52848                             }
52849                             Alignment align =
52850                                 Align_align_4_Decode((instr >> 4) & 0x3);
52851                             if (dt.Is(kDataTypeValueInvalid) ||
52852                                 align.Is(kBadAlignment)) {
52853                               UnallocatedA32(instr);
52854                               return;
52855                             }
52856                             unsigned first = ExtractDRegister(instr, 22, 12);
52857                             unsigned length;
52858                             SpacingType spacing;
52859                             switch ((instr >> 8) & 0xf) {
52860                               default:
52861                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52862                               case 0x0:
52863                                 length = 4;
52864                                 spacing = kSingle;
52865                                 break;
52866                               case 0x1:
52867                                 length = 4;
52868                                 spacing = kDouble;
52869                                 break;
52870                             }
52871                             unsigned last =
52872                                 first +
52873                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52874                             TransferType transfer = kMultipleLanes;
52875                             unsigned rn = (instr >> 16) & 0xf;
52876                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52877                             vld4(al,
52878                                  dt,
52879                                  NeonRegisterList(DRegister(first),
52880                                                   DRegister(last),
52881                                                   spacing,
52882                                                   transfer),
52883                                  AlignedMemOperand(Register(rn),
52884                                                    align,
52885                                                    Offset));
52886                             break;
52887                           }
52888                           case 0x00000100: {
52889                             // 0xf420010d
52890                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52891                             if (dt.Is(kDataTypeValueInvalid)) {
52892                               UnallocatedA32(instr);
52893                               return;
52894                             }
52895                             Alignment align =
52896                                 Align_align_4_Decode((instr >> 4) & 0x3);
52897                             if (dt.Is(kDataTypeValueInvalid) ||
52898                                 align.Is(kBadAlignment)) {
52899                               UnallocatedA32(instr);
52900                               return;
52901                             }
52902                             unsigned first = ExtractDRegister(instr, 22, 12);
52903                             unsigned length;
52904                             SpacingType spacing;
52905                             switch ((instr >> 8) & 0xf) {
52906                               default:
52907                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52908                               case 0x0:
52909                                 length = 4;
52910                                 spacing = kSingle;
52911                                 break;
52912                               case 0x1:
52913                                 length = 4;
52914                                 spacing = kDouble;
52915                                 break;
52916                             }
52917                             unsigned last =
52918                                 first +
52919                                 (length - 1) * (spacing == kSingle ? 1 : 2);
52920                             TransferType transfer = kMultipleLanes;
52921                             unsigned rn = (instr >> 16) & 0xf;
52922                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52923                             vld4(al,
52924                                  dt,
52925                                  NeonRegisterList(DRegister(first),
52926                                                   DRegister(last),
52927                                                   spacing,
52928                                                   transfer),
52929                                  AlignedMemOperand(Register(rn),
52930                                                    align,
52931                                                    Offset));
52932                             break;
52933                           }
52934                           case 0x00000200: {
52935                             // 0xf420020d
52936                             if (((instr & 0xe20) == 0x620) ||
52937                                 ((instr & 0xf30) == 0xa30)) {
52938                               UnallocatedA32(instr);
52939                               return;
52940                             }
52941                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
52942                             if (dt.Is(kDataTypeValueInvalid)) {
52943                               UnallocatedA32(instr);
52944                               return;
52945                             }
52946                             Alignment align =
52947                                 Align_align_1_Decode((instr >> 4) & 0x3);
52948                             if (dt.Is(kDataTypeValueInvalid) ||
52949                                 align.Is(kBadAlignment)) {
52950                               UnallocatedA32(instr);
52951                               return;
52952                             }
52953                             unsigned first = ExtractDRegister(instr, 22, 12);
52954                             unsigned length;
52955                             SpacingType spacing = kSingle;
52956                             switch ((instr >> 8) & 0xf) {
52957                               default:
52958                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
52959                               case 0x7:
52960                                 length = 1;
52961                                 break;
52962                               case 0xa:
52963                                 length = 2;
52964                                 break;
52965                               case 0x6:
52966                                 length = 3;
52967                                 break;
52968                               case 0x2:
52969                                 length = 4;
52970                                 break;
52971                             }
52972                             unsigned last = first + length - 1;
52973                             TransferType transfer = kMultipleLanes;
52974                             unsigned rn = (instr >> 16) & 0xf;
52975                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
52976                             vld1(al,
52977                                  dt,
52978                                  NeonRegisterList(DRegister(first),
52979                                                   DRegister(last),
52980                                                   spacing,
52981                                                   transfer),
52982                                  AlignedMemOperand(Register(rn),
52983                                                    align,
52984                                                    Offset));
52985                             break;
52986                           }
52987                           case 0x00000300: {
52988                             // 0xf420030d
52989                             if (((instr & 0xe30) == 0x830)) {
52990                               UnallocatedA32(instr);
52991                               return;
52992                             }
52993                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
52994                             if (dt.Is(kDataTypeValueInvalid)) {
52995                               UnallocatedA32(instr);
52996                               return;
52997                             }
52998                             Alignment align =
52999                                 Align_align_2_Decode((instr >> 4) & 0x3);
53000                             if (dt.Is(kDataTypeValueInvalid) ||
53001                                 align.Is(kBadAlignment)) {
53002                               UnallocatedA32(instr);
53003                               return;
53004                             }
53005                             unsigned first = ExtractDRegister(instr, 22, 12);
53006                             unsigned length;
53007                             SpacingType spacing;
53008                             switch ((instr >> 8) & 0xf) {
53009                               default:
53010                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53011                               case 0x8:
53012                                 length = 2;
53013                                 spacing = kSingle;
53014                                 break;
53015                               case 0x9:
53016                                 length = 2;
53017                                 spacing = kDouble;
53018                                 break;
53019                               case 0x3:
53020                                 length = 4;
53021                                 spacing = kSingle;
53022                                 break;
53023                             }
53024                             unsigned last =
53025                                 first +
53026                                 (length - 1) * (spacing == kSingle ? 1 : 2);
53027                             TransferType transfer = kMultipleLanes;
53028                             unsigned rn = (instr >> 16) & 0xf;
53029                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53030                             vld2(al,
53031                                  dt,
53032                                  NeonRegisterList(DRegister(first),
53033                                                   DRegister(last),
53034                                                   spacing,
53035                                                   transfer),
53036                                  AlignedMemOperand(Register(rn),
53037                                                    align,
53038                                                    Offset));
53039                             break;
53040                           }
53041                           case 0x00000400: {
53042                             // 0xf420040d
53043                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53044                             if (dt.Is(kDataTypeValueInvalid)) {
53045                               UnallocatedA32(instr);
53046                               return;
53047                             }
53048                             Alignment align =
53049                                 Align_align_3_Decode((instr >> 4) & 0x3);
53050                             if (dt.Is(kDataTypeValueInvalid) ||
53051                                 align.Is(kBadAlignment)) {
53052                               UnallocatedA32(instr);
53053                               return;
53054                             }
53055                             unsigned first = ExtractDRegister(instr, 22, 12);
53056                             unsigned length;
53057                             SpacingType spacing;
53058                             switch ((instr >> 8) & 0xf) {
53059                               default:
53060                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53061                               case 0x4:
53062                                 length = 3;
53063                                 spacing = kSingle;
53064                                 break;
53065                               case 0x5:
53066                                 length = 3;
53067                                 spacing = kDouble;
53068                                 break;
53069                             }
53070                             unsigned last =
53071                                 first +
53072                                 (length - 1) * (spacing == kSingle ? 1 : 2);
53073                             TransferType transfer = kMultipleLanes;
53074                             unsigned rn = (instr >> 16) & 0xf;
53075                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53076                             vld3(al,
53077                                  dt,
53078                                  NeonRegisterList(DRegister(first),
53079                                                   DRegister(last),
53080                                                   spacing,
53081                                                   transfer),
53082                                  AlignedMemOperand(Register(rn),
53083                                                    align,
53084                                                    Offset));
53085                             break;
53086                           }
53087                           case 0x00000500: {
53088                             // 0xf420050d
53089                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53090                             if (dt.Is(kDataTypeValueInvalid)) {
53091                               UnallocatedA32(instr);
53092                               return;
53093                             }
53094                             Alignment align =
53095                                 Align_align_3_Decode((instr >> 4) & 0x3);
53096                             if (dt.Is(kDataTypeValueInvalid) ||
53097                                 align.Is(kBadAlignment)) {
53098                               UnallocatedA32(instr);
53099                               return;
53100                             }
53101                             unsigned first = ExtractDRegister(instr, 22, 12);
53102                             unsigned length;
53103                             SpacingType spacing;
53104                             switch ((instr >> 8) & 0xf) {
53105                               default:
53106                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53107                               case 0x4:
53108                                 length = 3;
53109                                 spacing = kSingle;
53110                                 break;
53111                               case 0x5:
53112                                 length = 3;
53113                                 spacing = kDouble;
53114                                 break;
53115                             }
53116                             unsigned last =
53117                                 first +
53118                                 (length - 1) * (spacing == kSingle ? 1 : 2);
53119                             TransferType transfer = kMultipleLanes;
53120                             unsigned rn = (instr >> 16) & 0xf;
53121                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53122                             vld3(al,
53123                                  dt,
53124                                  NeonRegisterList(DRegister(first),
53125                                                   DRegister(last),
53126                                                   spacing,
53127                                                   transfer),
53128                                  AlignedMemOperand(Register(rn),
53129                                                    align,
53130                                                    Offset));
53131                             break;
53132                           }
53133                           case 0x00000600: {
53134                             // 0xf420060d
53135                             if (((instr & 0xe20) == 0x620) ||
53136                                 ((instr & 0xf30) == 0xa30)) {
53137                               UnallocatedA32(instr);
53138                               return;
53139                             }
53140                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53141                             if (dt.Is(kDataTypeValueInvalid)) {
53142                               UnallocatedA32(instr);
53143                               return;
53144                             }
53145                             Alignment align =
53146                                 Align_align_1_Decode((instr >> 4) & 0x3);
53147                             if (dt.Is(kDataTypeValueInvalid) ||
53148                                 align.Is(kBadAlignment)) {
53149                               UnallocatedA32(instr);
53150                               return;
53151                             }
53152                             unsigned first = ExtractDRegister(instr, 22, 12);
53153                             unsigned length;
53154                             SpacingType spacing = kSingle;
53155                             switch ((instr >> 8) & 0xf) {
53156                               default:
53157                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53158                               case 0x7:
53159                                 length = 1;
53160                                 break;
53161                               case 0xa:
53162                                 length = 2;
53163                                 break;
53164                               case 0x6:
53165                                 length = 3;
53166                                 break;
53167                               case 0x2:
53168                                 length = 4;
53169                                 break;
53170                             }
53171                             unsigned last = first + length - 1;
53172                             TransferType transfer = kMultipleLanes;
53173                             unsigned rn = (instr >> 16) & 0xf;
53174                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53175                             vld1(al,
53176                                  dt,
53177                                  NeonRegisterList(DRegister(first),
53178                                                   DRegister(last),
53179                                                   spacing,
53180                                                   transfer),
53181                                  AlignedMemOperand(Register(rn),
53182                                                    align,
53183                                                    Offset));
53184                             break;
53185                           }
53186                           case 0x00000700: {
53187                             // 0xf420070d
53188                             if (((instr & 0xe20) == 0x620) ||
53189                                 ((instr & 0xf30) == 0xa30)) {
53190                               UnallocatedA32(instr);
53191                               return;
53192                             }
53193                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53194                             if (dt.Is(kDataTypeValueInvalid)) {
53195                               UnallocatedA32(instr);
53196                               return;
53197                             }
53198                             Alignment align =
53199                                 Align_align_1_Decode((instr >> 4) & 0x3);
53200                             if (dt.Is(kDataTypeValueInvalid) ||
53201                                 align.Is(kBadAlignment)) {
53202                               UnallocatedA32(instr);
53203                               return;
53204                             }
53205                             unsigned first = ExtractDRegister(instr, 22, 12);
53206                             unsigned length;
53207                             SpacingType spacing = kSingle;
53208                             switch ((instr >> 8) & 0xf) {
53209                               default:
53210                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53211                               case 0x7:
53212                                 length = 1;
53213                                 break;
53214                               case 0xa:
53215                                 length = 2;
53216                                 break;
53217                               case 0x6:
53218                                 length = 3;
53219                                 break;
53220                               case 0x2:
53221                                 length = 4;
53222                                 break;
53223                             }
53224                             unsigned last = first + length - 1;
53225                             TransferType transfer = kMultipleLanes;
53226                             unsigned rn = (instr >> 16) & 0xf;
53227                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53228                             vld1(al,
53229                                  dt,
53230                                  NeonRegisterList(DRegister(first),
53231                                                   DRegister(last),
53232                                                   spacing,
53233                                                   transfer),
53234                                  AlignedMemOperand(Register(rn),
53235                                                    align,
53236                                                    Offset));
53237                             break;
53238                           }
53239                           case 0x00000800: {
53240                             // 0xf420080d
53241                             if (((instr & 0xe30) == 0x830)) {
53242                               UnallocatedA32(instr);
53243                               return;
53244                             }
53245                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53246                             if (dt.Is(kDataTypeValueInvalid)) {
53247                               UnallocatedA32(instr);
53248                               return;
53249                             }
53250                             Alignment align =
53251                                 Align_align_2_Decode((instr >> 4) & 0x3);
53252                             if (dt.Is(kDataTypeValueInvalid) ||
53253                                 align.Is(kBadAlignment)) {
53254                               UnallocatedA32(instr);
53255                               return;
53256                             }
53257                             unsigned first = ExtractDRegister(instr, 22, 12);
53258                             unsigned length;
53259                             SpacingType spacing;
53260                             switch ((instr >> 8) & 0xf) {
53261                               default:
53262                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53263                               case 0x8:
53264                                 length = 2;
53265                                 spacing = kSingle;
53266                                 break;
53267                               case 0x9:
53268                                 length = 2;
53269                                 spacing = kDouble;
53270                                 break;
53271                               case 0x3:
53272                                 length = 4;
53273                                 spacing = kSingle;
53274                                 break;
53275                             }
53276                             unsigned last =
53277                                 first +
53278                                 (length - 1) * (spacing == kSingle ? 1 : 2);
53279                             TransferType transfer = kMultipleLanes;
53280                             unsigned rn = (instr >> 16) & 0xf;
53281                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53282                             vld2(al,
53283                                  dt,
53284                                  NeonRegisterList(DRegister(first),
53285                                                   DRegister(last),
53286                                                   spacing,
53287                                                   transfer),
53288                                  AlignedMemOperand(Register(rn),
53289                                                    align,
53290                                                    Offset));
53291                             break;
53292                           }
53293                           case 0x00000900: {
53294                             // 0xf420090d
53295                             if (((instr & 0xe30) == 0x830)) {
53296                               UnallocatedA32(instr);
53297                               return;
53298                             }
53299                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53300                             if (dt.Is(kDataTypeValueInvalid)) {
53301                               UnallocatedA32(instr);
53302                               return;
53303                             }
53304                             Alignment align =
53305                                 Align_align_2_Decode((instr >> 4) & 0x3);
53306                             if (dt.Is(kDataTypeValueInvalid) ||
53307                                 align.Is(kBadAlignment)) {
53308                               UnallocatedA32(instr);
53309                               return;
53310                             }
53311                             unsigned first = ExtractDRegister(instr, 22, 12);
53312                             unsigned length;
53313                             SpacingType spacing;
53314                             switch ((instr >> 8) & 0xf) {
53315                               default:
53316                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53317                               case 0x8:
53318                                 length = 2;
53319                                 spacing = kSingle;
53320                                 break;
53321                               case 0x9:
53322                                 length = 2;
53323                                 spacing = kDouble;
53324                                 break;
53325                               case 0x3:
53326                                 length = 4;
53327                                 spacing = kSingle;
53328                                 break;
53329                             }
53330                             unsigned last =
53331                                 first +
53332                                 (length - 1) * (spacing == kSingle ? 1 : 2);
53333                             TransferType transfer = kMultipleLanes;
53334                             unsigned rn = (instr >> 16) & 0xf;
53335                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53336                             vld2(al,
53337                                  dt,
53338                                  NeonRegisterList(DRegister(first),
53339                                                   DRegister(last),
53340                                                   spacing,
53341                                                   transfer),
53342                                  AlignedMemOperand(Register(rn),
53343                                                    align,
53344                                                    Offset));
53345                             break;
53346                           }
53347                           case 0x00000a00: {
53348                             // 0xf4200a0d
53349                             if (((instr & 0xe20) == 0x620) ||
53350                                 ((instr & 0xf30) == 0xa30)) {
53351                               UnallocatedA32(instr);
53352                               return;
53353                             }
53354                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53355                             if (dt.Is(kDataTypeValueInvalid)) {
53356                               UnallocatedA32(instr);
53357                               return;
53358                             }
53359                             Alignment align =
53360                                 Align_align_1_Decode((instr >> 4) & 0x3);
53361                             if (dt.Is(kDataTypeValueInvalid) ||
53362                                 align.Is(kBadAlignment)) {
53363                               UnallocatedA32(instr);
53364                               return;
53365                             }
53366                             unsigned first = ExtractDRegister(instr, 22, 12);
53367                             unsigned length;
53368                             SpacingType spacing = kSingle;
53369                             switch ((instr >> 8) & 0xf) {
53370                               default:
53371                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
53372                               case 0x7:
53373                                 length = 1;
53374                                 break;
53375                               case 0xa:
53376                                 length = 2;
53377                                 break;
53378                               case 0x6:
53379                                 length = 3;
53380                                 break;
53381                               case 0x2:
53382                                 length = 4;
53383                                 break;
53384                             }
53385                             unsigned last = first + length - 1;
53386                             TransferType transfer = kMultipleLanes;
53387                             unsigned rn = (instr >> 16) & 0xf;
53388                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
53389                             vld1(al,
53390                                  dt,
53391                                  NeonRegisterList(DRegister(first),
53392                                                   DRegister(last),
53393                                                   spacing,
53394                                                   transfer),
53395                                  AlignedMemOperand(Register(rn),
53396                                                    align,
53397                                                    Offset));
53398                             break;
53399                           }
53400                           default:
53401                             UnallocatedA32(instr);
53402                             break;
53403                         }
53404                         break;
53405                       }
53406                     }
53407                     break;
53408                   }
53409                   default: {
53410                     switch (instr & 0x00000f00) {
53411                       case 0x00000000: {
53412                         // 0xf4200000
53413                         if (((instr & 0xd) == 0xd)) {
53414                           UnallocatedA32(instr);
53415                           return;
53416                         }
53417                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53418                         if (dt.Is(kDataTypeValueInvalid)) {
53419                           UnallocatedA32(instr);
53420                           return;
53421                         }
53422                         Alignment align =
53423                             Align_align_4_Decode((instr >> 4) & 0x3);
53424                         if (dt.Is(kDataTypeValueInvalid) ||
53425                             align.Is(kBadAlignment)) {
53426                           UnallocatedA32(instr);
53427                           return;
53428                         }
53429                         unsigned first = ExtractDRegister(instr, 22, 12);
53430                         unsigned length;
53431                         SpacingType spacing;
53432                         switch ((instr >> 8) & 0xf) {
53433                           default:
53434                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53435                           case 0x0:
53436                             length = 4;
53437                             spacing = kSingle;
53438                             break;
53439                           case 0x1:
53440                             length = 4;
53441                             spacing = kDouble;
53442                             break;
53443                         }
53444                         unsigned last =
53445                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53446                         TransferType transfer = kMultipleLanes;
53447                         unsigned rn = (instr >> 16) & 0xf;
53448                         unsigned rm = instr & 0xf;
53449                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53450                         vld4(al,
53451                              dt,
53452                              NeonRegisterList(DRegister(first),
53453                                               DRegister(last),
53454                                               spacing,
53455                                               transfer),
53456                              AlignedMemOperand(Register(rn),
53457                                                align,
53458                                                Register(rm),
53459                                                PostIndex));
53460                         break;
53461                       }
53462                       case 0x00000100: {
53463                         // 0xf4200100
53464                         if (((instr & 0xd) == 0xd)) {
53465                           UnallocatedA32(instr);
53466                           return;
53467                         }
53468                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53469                         if (dt.Is(kDataTypeValueInvalid)) {
53470                           UnallocatedA32(instr);
53471                           return;
53472                         }
53473                         Alignment align =
53474                             Align_align_4_Decode((instr >> 4) & 0x3);
53475                         if (dt.Is(kDataTypeValueInvalid) ||
53476                             align.Is(kBadAlignment)) {
53477                           UnallocatedA32(instr);
53478                           return;
53479                         }
53480                         unsigned first = ExtractDRegister(instr, 22, 12);
53481                         unsigned length;
53482                         SpacingType spacing;
53483                         switch ((instr >> 8) & 0xf) {
53484                           default:
53485                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53486                           case 0x0:
53487                             length = 4;
53488                             spacing = kSingle;
53489                             break;
53490                           case 0x1:
53491                             length = 4;
53492                             spacing = kDouble;
53493                             break;
53494                         }
53495                         unsigned last =
53496                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53497                         TransferType transfer = kMultipleLanes;
53498                         unsigned rn = (instr >> 16) & 0xf;
53499                         unsigned rm = instr & 0xf;
53500                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53501                         vld4(al,
53502                              dt,
53503                              NeonRegisterList(DRegister(first),
53504                                               DRegister(last),
53505                                               spacing,
53506                                               transfer),
53507                              AlignedMemOperand(Register(rn),
53508                                                align,
53509                                                Register(rm),
53510                                                PostIndex));
53511                         break;
53512                       }
53513                       case 0x00000200: {
53514                         // 0xf4200200
53515                         if (((instr & 0xd) == 0xd) ||
53516                             ((instr & 0xe20) == 0x620) ||
53517                             ((instr & 0xf30) == 0xa30)) {
53518                           UnallocatedA32(instr);
53519                           return;
53520                         }
53521                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53522                         if (dt.Is(kDataTypeValueInvalid)) {
53523                           UnallocatedA32(instr);
53524                           return;
53525                         }
53526                         Alignment align =
53527                             Align_align_1_Decode((instr >> 4) & 0x3);
53528                         if (dt.Is(kDataTypeValueInvalid) ||
53529                             align.Is(kBadAlignment)) {
53530                           UnallocatedA32(instr);
53531                           return;
53532                         }
53533                         unsigned first = ExtractDRegister(instr, 22, 12);
53534                         unsigned length;
53535                         SpacingType spacing = kSingle;
53536                         switch ((instr >> 8) & 0xf) {
53537                           default:
53538                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53539                           case 0x7:
53540                             length = 1;
53541                             break;
53542                           case 0xa:
53543                             length = 2;
53544                             break;
53545                           case 0x6:
53546                             length = 3;
53547                             break;
53548                           case 0x2:
53549                             length = 4;
53550                             break;
53551                         }
53552                         unsigned last = first + length - 1;
53553                         TransferType transfer = kMultipleLanes;
53554                         unsigned rn = (instr >> 16) & 0xf;
53555                         unsigned rm = instr & 0xf;
53556                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53557                         vld1(al,
53558                              dt,
53559                              NeonRegisterList(DRegister(first),
53560                                               DRegister(last),
53561                                               spacing,
53562                                               transfer),
53563                              AlignedMemOperand(Register(rn),
53564                                                align,
53565                                                Register(rm),
53566                                                PostIndex));
53567                         break;
53568                       }
53569                       case 0x00000300: {
53570                         // 0xf4200300
53571                         if (((instr & 0xd) == 0xd) ||
53572                             ((instr & 0xe30) == 0x830)) {
53573                           UnallocatedA32(instr);
53574                           return;
53575                         }
53576                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53577                         if (dt.Is(kDataTypeValueInvalid)) {
53578                           UnallocatedA32(instr);
53579                           return;
53580                         }
53581                         Alignment align =
53582                             Align_align_2_Decode((instr >> 4) & 0x3);
53583                         if (dt.Is(kDataTypeValueInvalid) ||
53584                             align.Is(kBadAlignment)) {
53585                           UnallocatedA32(instr);
53586                           return;
53587                         }
53588                         unsigned first = ExtractDRegister(instr, 22, 12);
53589                         unsigned length;
53590                         SpacingType spacing;
53591                         switch ((instr >> 8) & 0xf) {
53592                           default:
53593                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53594                           case 0x8:
53595                             length = 2;
53596                             spacing = kSingle;
53597                             break;
53598                           case 0x9:
53599                             length = 2;
53600                             spacing = kDouble;
53601                             break;
53602                           case 0x3:
53603                             length = 4;
53604                             spacing = kSingle;
53605                             break;
53606                         }
53607                         unsigned last =
53608                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53609                         TransferType transfer = kMultipleLanes;
53610                         unsigned rn = (instr >> 16) & 0xf;
53611                         unsigned rm = instr & 0xf;
53612                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53613                         vld2(al,
53614                              dt,
53615                              NeonRegisterList(DRegister(first),
53616                                               DRegister(last),
53617                                               spacing,
53618                                               transfer),
53619                              AlignedMemOperand(Register(rn),
53620                                                align,
53621                                                Register(rm),
53622                                                PostIndex));
53623                         break;
53624                       }
53625                       case 0x00000400: {
53626                         // 0xf4200400
53627                         if (((instr & 0xd) == 0xd)) {
53628                           UnallocatedA32(instr);
53629                           return;
53630                         }
53631                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53632                         if (dt.Is(kDataTypeValueInvalid)) {
53633                           UnallocatedA32(instr);
53634                           return;
53635                         }
53636                         Alignment align =
53637                             Align_align_3_Decode((instr >> 4) & 0x3);
53638                         if (dt.Is(kDataTypeValueInvalid) ||
53639                             align.Is(kBadAlignment)) {
53640                           UnallocatedA32(instr);
53641                           return;
53642                         }
53643                         unsigned first = ExtractDRegister(instr, 22, 12);
53644                         unsigned length;
53645                         SpacingType spacing;
53646                         switch ((instr >> 8) & 0xf) {
53647                           default:
53648                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53649                           case 0x4:
53650                             length = 3;
53651                             spacing = kSingle;
53652                             break;
53653                           case 0x5:
53654                             length = 3;
53655                             spacing = kDouble;
53656                             break;
53657                         }
53658                         unsigned last =
53659                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53660                         TransferType transfer = kMultipleLanes;
53661                         unsigned rn = (instr >> 16) & 0xf;
53662                         unsigned rm = instr & 0xf;
53663                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53664                         vld3(al,
53665                              dt,
53666                              NeonRegisterList(DRegister(first),
53667                                               DRegister(last),
53668                                               spacing,
53669                                               transfer),
53670                              AlignedMemOperand(Register(rn),
53671                                                align,
53672                                                Register(rm),
53673                                                PostIndex));
53674                         break;
53675                       }
53676                       case 0x00000500: {
53677                         // 0xf4200500
53678                         if (((instr & 0xd) == 0xd)) {
53679                           UnallocatedA32(instr);
53680                           return;
53681                         }
53682                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53683                         if (dt.Is(kDataTypeValueInvalid)) {
53684                           UnallocatedA32(instr);
53685                           return;
53686                         }
53687                         Alignment align =
53688                             Align_align_3_Decode((instr >> 4) & 0x3);
53689                         if (dt.Is(kDataTypeValueInvalid) ||
53690                             align.Is(kBadAlignment)) {
53691                           UnallocatedA32(instr);
53692                           return;
53693                         }
53694                         unsigned first = ExtractDRegister(instr, 22, 12);
53695                         unsigned length;
53696                         SpacingType spacing;
53697                         switch ((instr >> 8) & 0xf) {
53698                           default:
53699                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53700                           case 0x4:
53701                             length = 3;
53702                             spacing = kSingle;
53703                             break;
53704                           case 0x5:
53705                             length = 3;
53706                             spacing = kDouble;
53707                             break;
53708                         }
53709                         unsigned last =
53710                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53711                         TransferType transfer = kMultipleLanes;
53712                         unsigned rn = (instr >> 16) & 0xf;
53713                         unsigned rm = instr & 0xf;
53714                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53715                         vld3(al,
53716                              dt,
53717                              NeonRegisterList(DRegister(first),
53718                                               DRegister(last),
53719                                               spacing,
53720                                               transfer),
53721                              AlignedMemOperand(Register(rn),
53722                                                align,
53723                                                Register(rm),
53724                                                PostIndex));
53725                         break;
53726                       }
53727                       case 0x00000600: {
53728                         // 0xf4200600
53729                         if (((instr & 0xd) == 0xd) ||
53730                             ((instr & 0xe20) == 0x620) ||
53731                             ((instr & 0xf30) == 0xa30)) {
53732                           UnallocatedA32(instr);
53733                           return;
53734                         }
53735                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53736                         if (dt.Is(kDataTypeValueInvalid)) {
53737                           UnallocatedA32(instr);
53738                           return;
53739                         }
53740                         Alignment align =
53741                             Align_align_1_Decode((instr >> 4) & 0x3);
53742                         if (dt.Is(kDataTypeValueInvalid) ||
53743                             align.Is(kBadAlignment)) {
53744                           UnallocatedA32(instr);
53745                           return;
53746                         }
53747                         unsigned first = ExtractDRegister(instr, 22, 12);
53748                         unsigned length;
53749                         SpacingType spacing = kSingle;
53750                         switch ((instr >> 8) & 0xf) {
53751                           default:
53752                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53753                           case 0x7:
53754                             length = 1;
53755                             break;
53756                           case 0xa:
53757                             length = 2;
53758                             break;
53759                           case 0x6:
53760                             length = 3;
53761                             break;
53762                           case 0x2:
53763                             length = 4;
53764                             break;
53765                         }
53766                         unsigned last = first + length - 1;
53767                         TransferType transfer = kMultipleLanes;
53768                         unsigned rn = (instr >> 16) & 0xf;
53769                         unsigned rm = instr & 0xf;
53770                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53771                         vld1(al,
53772                              dt,
53773                              NeonRegisterList(DRegister(first),
53774                                               DRegister(last),
53775                                               spacing,
53776                                               transfer),
53777                              AlignedMemOperand(Register(rn),
53778                                                align,
53779                                                Register(rm),
53780                                                PostIndex));
53781                         break;
53782                       }
53783                       case 0x00000700: {
53784                         // 0xf4200700
53785                         if (((instr & 0xd) == 0xd) ||
53786                             ((instr & 0xe20) == 0x620) ||
53787                             ((instr & 0xf30) == 0xa30)) {
53788                           UnallocatedA32(instr);
53789                           return;
53790                         }
53791                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53792                         if (dt.Is(kDataTypeValueInvalid)) {
53793                           UnallocatedA32(instr);
53794                           return;
53795                         }
53796                         Alignment align =
53797                             Align_align_1_Decode((instr >> 4) & 0x3);
53798                         if (dt.Is(kDataTypeValueInvalid) ||
53799                             align.Is(kBadAlignment)) {
53800                           UnallocatedA32(instr);
53801                           return;
53802                         }
53803                         unsigned first = ExtractDRegister(instr, 22, 12);
53804                         unsigned length;
53805                         SpacingType spacing = kSingle;
53806                         switch ((instr >> 8) & 0xf) {
53807                           default:
53808                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53809                           case 0x7:
53810                             length = 1;
53811                             break;
53812                           case 0xa:
53813                             length = 2;
53814                             break;
53815                           case 0x6:
53816                             length = 3;
53817                             break;
53818                           case 0x2:
53819                             length = 4;
53820                             break;
53821                         }
53822                         unsigned last = first + length - 1;
53823                         TransferType transfer = kMultipleLanes;
53824                         unsigned rn = (instr >> 16) & 0xf;
53825                         unsigned rm = instr & 0xf;
53826                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53827                         vld1(al,
53828                              dt,
53829                              NeonRegisterList(DRegister(first),
53830                                               DRegister(last),
53831                                               spacing,
53832                                               transfer),
53833                              AlignedMemOperand(Register(rn),
53834                                                align,
53835                                                Register(rm),
53836                                                PostIndex));
53837                         break;
53838                       }
53839                       case 0x00000800: {
53840                         // 0xf4200800
53841                         if (((instr & 0xd) == 0xd) ||
53842                             ((instr & 0xe30) == 0x830)) {
53843                           UnallocatedA32(instr);
53844                           return;
53845                         }
53846                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53847                         if (dt.Is(kDataTypeValueInvalid)) {
53848                           UnallocatedA32(instr);
53849                           return;
53850                         }
53851                         Alignment align =
53852                             Align_align_2_Decode((instr >> 4) & 0x3);
53853                         if (dt.Is(kDataTypeValueInvalid) ||
53854                             align.Is(kBadAlignment)) {
53855                           UnallocatedA32(instr);
53856                           return;
53857                         }
53858                         unsigned first = ExtractDRegister(instr, 22, 12);
53859                         unsigned length;
53860                         SpacingType spacing;
53861                         switch ((instr >> 8) & 0xf) {
53862                           default:
53863                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53864                           case 0x8:
53865                             length = 2;
53866                             spacing = kSingle;
53867                             break;
53868                           case 0x9:
53869                             length = 2;
53870                             spacing = kDouble;
53871                             break;
53872                           case 0x3:
53873                             length = 4;
53874                             spacing = kSingle;
53875                             break;
53876                         }
53877                         unsigned last =
53878                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53879                         TransferType transfer = kMultipleLanes;
53880                         unsigned rn = (instr >> 16) & 0xf;
53881                         unsigned rm = instr & 0xf;
53882                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53883                         vld2(al,
53884                              dt,
53885                              NeonRegisterList(DRegister(first),
53886                                               DRegister(last),
53887                                               spacing,
53888                                               transfer),
53889                              AlignedMemOperand(Register(rn),
53890                                                align,
53891                                                Register(rm),
53892                                                PostIndex));
53893                         break;
53894                       }
53895                       case 0x00000900: {
53896                         // 0xf4200900
53897                         if (((instr & 0xd) == 0xd) ||
53898                             ((instr & 0xe30) == 0x830)) {
53899                           UnallocatedA32(instr);
53900                           return;
53901                         }
53902                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
53903                         if (dt.Is(kDataTypeValueInvalid)) {
53904                           UnallocatedA32(instr);
53905                           return;
53906                         }
53907                         Alignment align =
53908                             Align_align_2_Decode((instr >> 4) & 0x3);
53909                         if (dt.Is(kDataTypeValueInvalid) ||
53910                             align.Is(kBadAlignment)) {
53911                           UnallocatedA32(instr);
53912                           return;
53913                         }
53914                         unsigned first = ExtractDRegister(instr, 22, 12);
53915                         unsigned length;
53916                         SpacingType spacing;
53917                         switch ((instr >> 8) & 0xf) {
53918                           default:
53919                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53920                           case 0x8:
53921                             length = 2;
53922                             spacing = kSingle;
53923                             break;
53924                           case 0x9:
53925                             length = 2;
53926                             spacing = kDouble;
53927                             break;
53928                           case 0x3:
53929                             length = 4;
53930                             spacing = kSingle;
53931                             break;
53932                         }
53933                         unsigned last =
53934                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
53935                         TransferType transfer = kMultipleLanes;
53936                         unsigned rn = (instr >> 16) & 0xf;
53937                         unsigned rm = instr & 0xf;
53938                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53939                         vld2(al,
53940                              dt,
53941                              NeonRegisterList(DRegister(first),
53942                                               DRegister(last),
53943                                               spacing,
53944                                               transfer),
53945                              AlignedMemOperand(Register(rn),
53946                                                align,
53947                                                Register(rm),
53948                                                PostIndex));
53949                         break;
53950                       }
53951                       case 0x00000a00: {
53952                         // 0xf4200a00
53953                         if (((instr & 0xd) == 0xd) ||
53954                             ((instr & 0xe20) == 0x620) ||
53955                             ((instr & 0xf30) == 0xa30)) {
53956                           UnallocatedA32(instr);
53957                           return;
53958                         }
53959                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
53960                         if (dt.Is(kDataTypeValueInvalid)) {
53961                           UnallocatedA32(instr);
53962                           return;
53963                         }
53964                         Alignment align =
53965                             Align_align_1_Decode((instr >> 4) & 0x3);
53966                         if (dt.Is(kDataTypeValueInvalid) ||
53967                             align.Is(kBadAlignment)) {
53968                           UnallocatedA32(instr);
53969                           return;
53970                         }
53971                         unsigned first = ExtractDRegister(instr, 22, 12);
53972                         unsigned length;
53973                         SpacingType spacing = kSingle;
53974                         switch ((instr >> 8) & 0xf) {
53975                           default:
53976                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
53977                           case 0x7:
53978                             length = 1;
53979                             break;
53980                           case 0xa:
53981                             length = 2;
53982                             break;
53983                           case 0x6:
53984                             length = 3;
53985                             break;
53986                           case 0x2:
53987                             length = 4;
53988                             break;
53989                         }
53990                         unsigned last = first + length - 1;
53991                         TransferType transfer = kMultipleLanes;
53992                         unsigned rn = (instr >> 16) & 0xf;
53993                         unsigned rm = instr & 0xf;
53994                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
53995                         vld1(al,
53996                              dt,
53997                              NeonRegisterList(DRegister(first),
53998                                               DRegister(last),
53999                                               spacing,
54000                                               transfer),
54001                              AlignedMemOperand(Register(rn),
54002                                                align,
54003                                                Register(rm),
54004                                                PostIndex));
54005                         break;
54006                       }
54007                       default:
54008                         UnallocatedA32(instr);
54009                         break;
54010                     }
54011                     break;
54012                   }
54013                 }
54014                 break;
54015               }
54016               case 0x00800000: {
54017                 // 0xf4a00000
54018                 switch (instr & 0x00000300) {
54019                   case 0x00000000: {
54020                     // 0xf4a00000
54021                     switch (instr & 0x00000c00) {
54022                       case 0x00000c00: {
54023                         // 0xf4a00c00
54024                         switch (instr & 0x0000000d) {
54025                           case 0x0000000d: {
54026                             // 0xf4a00c0d
54027                             switch (instr & 0x00000002) {
54028                               case 0x00000000: {
54029                                 // 0xf4a00c0d
54030                                 DataType dt =
54031                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54032                                 if (dt.Is(kDataTypeValueInvalid)) {
54033                                   UnallocatedA32(instr);
54034                                   return;
54035                                 }
54036                                 Alignment align =
54037                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
54038                                 if (dt.Is(kDataTypeValueInvalid) ||
54039                                     align.Is(kBadAlignment)) {
54040                                   UnallocatedA32(instr);
54041                                   return;
54042                                 }
54043                                 unsigned first =
54044                                     ExtractDRegister(instr, 22, 12);
54045                                 unsigned length;
54046                                 SpacingType spacing = kSingle;
54047                                 switch ((instr >> 5) & 0x1) {
54048                                   default:
54049                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54050                                   case 0x0:
54051                                     length = 1;
54052                                     break;
54053                                   case 0x1:
54054                                     length = 2;
54055                                     break;
54056                                 }
54057                                 unsigned last = first + length - 1;
54058                                 TransferType transfer = kAllLanes;
54059                                 unsigned rn = (instr >> 16) & 0xf;
54060                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54061                                 vld1(al,
54062                                      dt,
54063                                      NeonRegisterList(DRegister(first),
54064                                                       DRegister(last),
54065                                                       spacing,
54066                                                       transfer),
54067                                      AlignedMemOperand(Register(rn),
54068                                                        align,
54069                                                        PostIndex));
54070                                 break;
54071                               }
54072                               case 0x00000002: {
54073                                 // 0xf4a00c0f
54074                                 DataType dt =
54075                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54076                                 if (dt.Is(kDataTypeValueInvalid)) {
54077                                   UnallocatedA32(instr);
54078                                   return;
54079                                 }
54080                                 Alignment align =
54081                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
54082                                 if (dt.Is(kDataTypeValueInvalid) ||
54083                                     align.Is(kBadAlignment)) {
54084                                   UnallocatedA32(instr);
54085                                   return;
54086                                 }
54087                                 unsigned first =
54088                                     ExtractDRegister(instr, 22, 12);
54089                                 unsigned length;
54090                                 SpacingType spacing = kSingle;
54091                                 switch ((instr >> 5) & 0x1) {
54092                                   default:
54093                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54094                                   case 0x0:
54095                                     length = 1;
54096                                     break;
54097                                   case 0x1:
54098                                     length = 2;
54099                                     break;
54100                                 }
54101                                 unsigned last = first + length - 1;
54102                                 TransferType transfer = kAllLanes;
54103                                 unsigned rn = (instr >> 16) & 0xf;
54104                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54105                                 vld1(al,
54106                                      dt,
54107                                      NeonRegisterList(DRegister(first),
54108                                                       DRegister(last),
54109                                                       spacing,
54110                                                       transfer),
54111                                      AlignedMemOperand(Register(rn),
54112                                                        align,
54113                                                        Offset));
54114                                 break;
54115                               }
54116                             }
54117                             break;
54118                           }
54119                           default: {
54120                             if (((instr & 0xd) == 0xd)) {
54121                               UnallocatedA32(instr);
54122                               return;
54123                             }
54124                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54125                             if (dt.Is(kDataTypeValueInvalid)) {
54126                               UnallocatedA32(instr);
54127                               return;
54128                             }
54129                             Alignment align =
54130                                 Align_a_1_Decode((instr >> 4) & 0x1, dt);
54131                             if (dt.Is(kDataTypeValueInvalid) ||
54132                                 align.Is(kBadAlignment)) {
54133                               UnallocatedA32(instr);
54134                               return;
54135                             }
54136                             unsigned first = ExtractDRegister(instr, 22, 12);
54137                             unsigned length;
54138                             SpacingType spacing = kSingle;
54139                             switch ((instr >> 5) & 0x1) {
54140                               default:
54141                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
54142                               case 0x0:
54143                                 length = 1;
54144                                 break;
54145                               case 0x1:
54146                                 length = 2;
54147                                 break;
54148                             }
54149                             unsigned last = first + length - 1;
54150                             TransferType transfer = kAllLanes;
54151                             unsigned rn = (instr >> 16) & 0xf;
54152                             unsigned rm = instr & 0xf;
54153                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54154                             vld1(al,
54155                                  dt,
54156                                  NeonRegisterList(DRegister(first),
54157                                                   DRegister(last),
54158                                                   spacing,
54159                                                   transfer),
54160                                  AlignedMemOperand(Register(rn),
54161                                                    align,
54162                                                    Register(rm),
54163                                                    PostIndex));
54164                             break;
54165                           }
54166                         }
54167                         break;
54168                       }
54169                       default: {
54170                         switch (instr & 0x0000000d) {
54171                           case 0x0000000d: {
54172                             // 0xf4a0000d
54173                             switch (instr & 0x00000002) {
54174                               case 0x00000000: {
54175                                 // 0xf4a0000d
54176                                 if (((instr & 0xc00) == 0xc00)) {
54177                                   UnallocatedA32(instr);
54178                                   return;
54179                                 }
54180                                 DataType dt =
54181                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54182                                 if (dt.Is(kDataTypeValueInvalid)) {
54183                                   UnallocatedA32(instr);
54184                                   return;
54185                                 }
54186                                 DecodeNeonAndAlign decode_neon =
54187                                     Align_index_align_1_Decode((instr >> 4) &
54188                                                                    0xf,
54189                                                                dt);
54190                                 if (!decode_neon.IsValid()) {
54191                                   UnallocatedA32(instr);
54192                                   return;
54193                                 }
54194                                 Alignment align = decode_neon.GetAlign();
54195                                 int lane = decode_neon.GetLane();
54196                                 SpacingType spacing = decode_neon.GetSpacing();
54197                                 unsigned first =
54198                                     ExtractDRegister(instr, 22, 12);
54199                                 unsigned length = 1;
54200                                 unsigned last = first + length - 1;
54201                                 unsigned rn = (instr >> 16) & 0xf;
54202                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54203                                 vld1(al,
54204                                      dt,
54205                                      NeonRegisterList(DRegister(first),
54206                                                       DRegister(last),
54207                                                       spacing,
54208                                                       lane),
54209                                      AlignedMemOperand(Register(rn),
54210                                                        align,
54211                                                        PostIndex));
54212                                 break;
54213                               }
54214                               case 0x00000002: {
54215                                 // 0xf4a0000f
54216                                 if (((instr & 0xc00) == 0xc00)) {
54217                                   UnallocatedA32(instr);
54218                                   return;
54219                                 }
54220                                 DataType dt =
54221                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54222                                 if (dt.Is(kDataTypeValueInvalid)) {
54223                                   UnallocatedA32(instr);
54224                                   return;
54225                                 }
54226                                 DecodeNeonAndAlign decode_neon =
54227                                     Align_index_align_1_Decode((instr >> 4) &
54228                                                                    0xf,
54229                                                                dt);
54230                                 if (!decode_neon.IsValid()) {
54231                                   UnallocatedA32(instr);
54232                                   return;
54233                                 }
54234                                 Alignment align = decode_neon.GetAlign();
54235                                 int lane = decode_neon.GetLane();
54236                                 SpacingType spacing = decode_neon.GetSpacing();
54237                                 unsigned first =
54238                                     ExtractDRegister(instr, 22, 12);
54239                                 unsigned length = 1;
54240                                 unsigned last = first + length - 1;
54241                                 unsigned rn = (instr >> 16) & 0xf;
54242                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54243                                 vld1(al,
54244                                      dt,
54245                                      NeonRegisterList(DRegister(first),
54246                                                       DRegister(last),
54247                                                       spacing,
54248                                                       lane),
54249                                      AlignedMemOperand(Register(rn),
54250                                                        align,
54251                                                        Offset));
54252                                 break;
54253                               }
54254                             }
54255                             break;
54256                           }
54257                           default: {
54258                             if (((instr & 0xc00) == 0xc00) ||
54259                                 ((instr & 0xd) == 0xd)) {
54260                               UnallocatedA32(instr);
54261                               return;
54262                             }
54263                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54264                             if (dt.Is(kDataTypeValueInvalid)) {
54265                               UnallocatedA32(instr);
54266                               return;
54267                             }
54268                             DecodeNeonAndAlign decode_neon =
54269                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
54270                                                            dt);
54271                             if (!decode_neon.IsValid()) {
54272                               UnallocatedA32(instr);
54273                               return;
54274                             }
54275                             Alignment align = decode_neon.GetAlign();
54276                             int lane = decode_neon.GetLane();
54277                             SpacingType spacing = decode_neon.GetSpacing();
54278                             unsigned first = ExtractDRegister(instr, 22, 12);
54279                             unsigned length = 1;
54280                             unsigned last = first + length - 1;
54281                             unsigned rn = (instr >> 16) & 0xf;
54282                             unsigned rm = instr & 0xf;
54283                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54284                             vld1(al,
54285                                  dt,
54286                                  NeonRegisterList(DRegister(first),
54287                                                   DRegister(last),
54288                                                   spacing,
54289                                                   lane),
54290                                  AlignedMemOperand(Register(rn),
54291                                                    align,
54292                                                    Register(rm),
54293                                                    PostIndex));
54294                             break;
54295                           }
54296                         }
54297                         break;
54298                       }
54299                     }
54300                     break;
54301                   }
54302                   case 0x00000100: {
54303                     // 0xf4a00100
54304                     switch (instr & 0x00000c00) {
54305                       case 0x00000c00: {
54306                         // 0xf4a00d00
54307                         switch (instr & 0x0000000d) {
54308                           case 0x0000000d: {
54309                             // 0xf4a00d0d
54310                             switch (instr & 0x00000002) {
54311                               case 0x00000000: {
54312                                 // 0xf4a00d0d
54313                                 DataType dt =
54314                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54315                                 if (dt.Is(kDataTypeValueInvalid)) {
54316                                   UnallocatedA32(instr);
54317                                   return;
54318                                 }
54319                                 Alignment align =
54320                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
54321                                 if (dt.Is(kDataTypeValueInvalid) ||
54322                                     align.Is(kBadAlignment)) {
54323                                   UnallocatedA32(instr);
54324                                   return;
54325                                 }
54326                                 unsigned first =
54327                                     ExtractDRegister(instr, 22, 12);
54328                                 unsigned length;
54329                                 SpacingType spacing;
54330                                 switch ((instr >> 5) & 0x1) {
54331                                   default:
54332                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54333                                   case 0x0:
54334                                     length = 2;
54335                                     spacing = kSingle;
54336                                     break;
54337                                   case 0x1:
54338                                     length = 2;
54339                                     spacing = kDouble;
54340                                     break;
54341                                 }
54342                                 unsigned last =
54343                                     first +
54344                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54345                                 TransferType transfer = kAllLanes;
54346                                 unsigned rn = (instr >> 16) & 0xf;
54347                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54348                                 vld2(al,
54349                                      dt,
54350                                      NeonRegisterList(DRegister(first),
54351                                                       DRegister(last),
54352                                                       spacing,
54353                                                       transfer),
54354                                      AlignedMemOperand(Register(rn),
54355                                                        align,
54356                                                        PostIndex));
54357                                 break;
54358                               }
54359                               case 0x00000002: {
54360                                 // 0xf4a00d0f
54361                                 DataType dt =
54362                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54363                                 if (dt.Is(kDataTypeValueInvalid)) {
54364                                   UnallocatedA32(instr);
54365                                   return;
54366                                 }
54367                                 Alignment align =
54368                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
54369                                 if (dt.Is(kDataTypeValueInvalid) ||
54370                                     align.Is(kBadAlignment)) {
54371                                   UnallocatedA32(instr);
54372                                   return;
54373                                 }
54374                                 unsigned first =
54375                                     ExtractDRegister(instr, 22, 12);
54376                                 unsigned length;
54377                                 SpacingType spacing;
54378                                 switch ((instr >> 5) & 0x1) {
54379                                   default:
54380                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54381                                   case 0x0:
54382                                     length = 2;
54383                                     spacing = kSingle;
54384                                     break;
54385                                   case 0x1:
54386                                     length = 2;
54387                                     spacing = kDouble;
54388                                     break;
54389                                 }
54390                                 unsigned last =
54391                                     first +
54392                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54393                                 TransferType transfer = kAllLanes;
54394                                 unsigned rn = (instr >> 16) & 0xf;
54395                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54396                                 vld2(al,
54397                                      dt,
54398                                      NeonRegisterList(DRegister(first),
54399                                                       DRegister(last),
54400                                                       spacing,
54401                                                       transfer),
54402                                      AlignedMemOperand(Register(rn),
54403                                                        align,
54404                                                        Offset));
54405                                 break;
54406                               }
54407                             }
54408                             break;
54409                           }
54410                           default: {
54411                             if (((instr & 0xd) == 0xd)) {
54412                               UnallocatedA32(instr);
54413                               return;
54414                             }
54415                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
54416                             if (dt.Is(kDataTypeValueInvalid)) {
54417                               UnallocatedA32(instr);
54418                               return;
54419                             }
54420                             Alignment align =
54421                                 Align_a_2_Decode((instr >> 4) & 0x1, dt);
54422                             if (dt.Is(kDataTypeValueInvalid) ||
54423                                 align.Is(kBadAlignment)) {
54424                               UnallocatedA32(instr);
54425                               return;
54426                             }
54427                             unsigned first = ExtractDRegister(instr, 22, 12);
54428                             unsigned length;
54429                             SpacingType spacing;
54430                             switch ((instr >> 5) & 0x1) {
54431                               default:
54432                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
54433                               case 0x0:
54434                                 length = 2;
54435                                 spacing = kSingle;
54436                                 break;
54437                               case 0x1:
54438                                 length = 2;
54439                                 spacing = kDouble;
54440                                 break;
54441                             }
54442                             unsigned last =
54443                                 first +
54444                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54445                             TransferType transfer = kAllLanes;
54446                             unsigned rn = (instr >> 16) & 0xf;
54447                             unsigned rm = instr & 0xf;
54448                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54449                             vld2(al,
54450                                  dt,
54451                                  NeonRegisterList(DRegister(first),
54452                                                   DRegister(last),
54453                                                   spacing,
54454                                                   transfer),
54455                                  AlignedMemOperand(Register(rn),
54456                                                    align,
54457                                                    Register(rm),
54458                                                    PostIndex));
54459                             break;
54460                           }
54461                         }
54462                         break;
54463                       }
54464                       default: {
54465                         switch (instr & 0x0000000d) {
54466                           case 0x0000000d: {
54467                             // 0xf4a0010d
54468                             switch (instr & 0x00000002) {
54469                               case 0x00000000: {
54470                                 // 0xf4a0010d
54471                                 if (((instr & 0xc00) == 0xc00)) {
54472                                   UnallocatedA32(instr);
54473                                   return;
54474                                 }
54475                                 DataType dt =
54476                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54477                                 if (dt.Is(kDataTypeValueInvalid)) {
54478                                   UnallocatedA32(instr);
54479                                   return;
54480                                 }
54481                                 DecodeNeonAndAlign decode_neon =
54482                                     Align_index_align_2_Decode((instr >> 4) &
54483                                                                    0xf,
54484                                                                dt);
54485                                 if (!decode_neon.IsValid()) {
54486                                   UnallocatedA32(instr);
54487                                   return;
54488                                 }
54489                                 Alignment align = decode_neon.GetAlign();
54490                                 int lane = decode_neon.GetLane();
54491                                 SpacingType spacing = decode_neon.GetSpacing();
54492                                 unsigned first =
54493                                     ExtractDRegister(instr, 22, 12);
54494                                 unsigned length = 2;
54495                                 unsigned last =
54496                                     first +
54497                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54498                                 unsigned rn = (instr >> 16) & 0xf;
54499                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54500                                 vld2(al,
54501                                      dt,
54502                                      NeonRegisterList(DRegister(first),
54503                                                       DRegister(last),
54504                                                       spacing,
54505                                                       lane),
54506                                      AlignedMemOperand(Register(rn),
54507                                                        align,
54508                                                        PostIndex));
54509                                 break;
54510                               }
54511                               case 0x00000002: {
54512                                 // 0xf4a0010f
54513                                 if (((instr & 0xc00) == 0xc00)) {
54514                                   UnallocatedA32(instr);
54515                                   return;
54516                                 }
54517                                 DataType dt =
54518                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54519                                 if (dt.Is(kDataTypeValueInvalid)) {
54520                                   UnallocatedA32(instr);
54521                                   return;
54522                                 }
54523                                 DecodeNeonAndAlign decode_neon =
54524                                     Align_index_align_2_Decode((instr >> 4) &
54525                                                                    0xf,
54526                                                                dt);
54527                                 if (!decode_neon.IsValid()) {
54528                                   UnallocatedA32(instr);
54529                                   return;
54530                                 }
54531                                 Alignment align = decode_neon.GetAlign();
54532                                 int lane = decode_neon.GetLane();
54533                                 SpacingType spacing = decode_neon.GetSpacing();
54534                                 unsigned first =
54535                                     ExtractDRegister(instr, 22, 12);
54536                                 unsigned length = 2;
54537                                 unsigned last =
54538                                     first +
54539                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54540                                 unsigned rn = (instr >> 16) & 0xf;
54541                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54542                                 vld2(al,
54543                                      dt,
54544                                      NeonRegisterList(DRegister(first),
54545                                                       DRegister(last),
54546                                                       spacing,
54547                                                       lane),
54548                                      AlignedMemOperand(Register(rn),
54549                                                        align,
54550                                                        Offset));
54551                                 break;
54552                               }
54553                             }
54554                             break;
54555                           }
54556                           default: {
54557                             if (((instr & 0xc00) == 0xc00) ||
54558                                 ((instr & 0xd) == 0xd)) {
54559                               UnallocatedA32(instr);
54560                               return;
54561                             }
54562                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54563                             if (dt.Is(kDataTypeValueInvalid)) {
54564                               UnallocatedA32(instr);
54565                               return;
54566                             }
54567                             DecodeNeonAndAlign decode_neon =
54568                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
54569                                                            dt);
54570                             if (!decode_neon.IsValid()) {
54571                               UnallocatedA32(instr);
54572                               return;
54573                             }
54574                             Alignment align = decode_neon.GetAlign();
54575                             int lane = decode_neon.GetLane();
54576                             SpacingType spacing = decode_neon.GetSpacing();
54577                             unsigned first = ExtractDRegister(instr, 22, 12);
54578                             unsigned length = 2;
54579                             unsigned last =
54580                                 first +
54581                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54582                             unsigned rn = (instr >> 16) & 0xf;
54583                             unsigned rm = instr & 0xf;
54584                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
54585                             vld2(al,
54586                                  dt,
54587                                  NeonRegisterList(DRegister(first),
54588                                                   DRegister(last),
54589                                                   spacing,
54590                                                   lane),
54591                                  AlignedMemOperand(Register(rn),
54592                                                    align,
54593                                                    Register(rm),
54594                                                    PostIndex));
54595                             break;
54596                           }
54597                         }
54598                         break;
54599                       }
54600                     }
54601                     break;
54602                   }
54603                   case 0x00000200: {
54604                     // 0xf4a00200
54605                     switch (instr & 0x00000c00) {
54606                       case 0x00000c00: {
54607                         // 0xf4a00e00
54608                         switch (instr & 0x00000010) {
54609                           case 0x00000000: {
54610                             // 0xf4a00e00
54611                             switch (instr & 0x0000000d) {
54612                               case 0x0000000d: {
54613                                 // 0xf4a00e0d
54614                                 switch (instr & 0x00000002) {
54615                                   case 0x00000000: {
54616                                     // 0xf4a00e0d
54617                                     DataType dt =
54618                                         Dt_size_7_Decode((instr >> 6) & 0x3);
54619                                     if (dt.Is(kDataTypeValueInvalid)) {
54620                                       UnallocatedA32(instr);
54621                                       return;
54622                                     }
54623                                     unsigned first =
54624                                         ExtractDRegister(instr, 22, 12);
54625                                     unsigned length;
54626                                     SpacingType spacing;
54627                                     switch ((instr >> 5) & 0x1) {
54628                                       default:
54629                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
54630                                       case 0x0:
54631                                         length = 3;
54632                                         spacing = kSingle;
54633                                         break;
54634                                       case 0x1:
54635                                         length = 3;
54636                                         spacing = kDouble;
54637                                         break;
54638                                     }
54639                                     unsigned last =
54640                                         first +
54641                                         (length - 1) *
54642                                             (spacing == kSingle ? 1 : 2);
54643                                     TransferType transfer = kAllLanes;
54644                                     unsigned rn = (instr >> 16) & 0xf;
54645                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54646                                     vld3(al,
54647                                          dt,
54648                                          NeonRegisterList(DRegister(first),
54649                                                           DRegister(last),
54650                                                           spacing,
54651                                                           transfer),
54652                                          MemOperand(Register(rn), PreIndex));
54653                                     break;
54654                                   }
54655                                   case 0x00000002: {
54656                                     // 0xf4a00e0f
54657                                     DataType dt =
54658                                         Dt_size_7_Decode((instr >> 6) & 0x3);
54659                                     if (dt.Is(kDataTypeValueInvalid)) {
54660                                       UnallocatedA32(instr);
54661                                       return;
54662                                     }
54663                                     unsigned first =
54664                                         ExtractDRegister(instr, 22, 12);
54665                                     unsigned length;
54666                                     SpacingType spacing;
54667                                     switch ((instr >> 5) & 0x1) {
54668                                       default:
54669                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
54670                                       case 0x0:
54671                                         length = 3;
54672                                         spacing = kSingle;
54673                                         break;
54674                                       case 0x1:
54675                                         length = 3;
54676                                         spacing = kDouble;
54677                                         break;
54678                                     }
54679                                     unsigned last =
54680                                         first +
54681                                         (length - 1) *
54682                                             (spacing == kSingle ? 1 : 2);
54683                                     TransferType transfer = kAllLanes;
54684                                     unsigned rn = (instr >> 16) & 0xf;
54685                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54686                                     vld3(al,
54687                                          dt,
54688                                          NeonRegisterList(DRegister(first),
54689                                                           DRegister(last),
54690                                                           spacing,
54691                                                           transfer),
54692                                          MemOperand(Register(rn), Offset));
54693                                     break;
54694                                   }
54695                                 }
54696                                 break;
54697                               }
54698                               default: {
54699                                 if (((instr & 0xd) == 0xd)) {
54700                                   UnallocatedA32(instr);
54701                                   return;
54702                                 }
54703                                 DataType dt =
54704                                     Dt_size_7_Decode((instr >> 6) & 0x3);
54705                                 if (dt.Is(kDataTypeValueInvalid)) {
54706                                   UnallocatedA32(instr);
54707                                   return;
54708                                 }
54709                                 unsigned first =
54710                                     ExtractDRegister(instr, 22, 12);
54711                                 unsigned length;
54712                                 SpacingType spacing;
54713                                 switch ((instr >> 5) & 0x1) {
54714                                   default:
54715                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54716                                   case 0x0:
54717                                     length = 3;
54718                                     spacing = kSingle;
54719                                     break;
54720                                   case 0x1:
54721                                     length = 3;
54722                                     spacing = kDouble;
54723                                     break;
54724                                 }
54725                                 unsigned last =
54726                                     first +
54727                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54728                                 TransferType transfer = kAllLanes;
54729                                 unsigned rn = (instr >> 16) & 0xf;
54730                                 Sign sign(plus);
54731                                 unsigned rm = instr & 0xf;
54732                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
54733                                 vld3(al,
54734                                      dt,
54735                                      NeonRegisterList(DRegister(first),
54736                                                       DRegister(last),
54737                                                       spacing,
54738                                                       transfer),
54739                                      MemOperand(Register(rn),
54740                                                 sign,
54741                                                 Register(rm),
54742                                                 PostIndex));
54743                                 break;
54744                               }
54745                             }
54746                             break;
54747                           }
54748                           default:
54749                             UnallocatedA32(instr);
54750                             break;
54751                         }
54752                         break;
54753                       }
54754                       default: {
54755                         switch (instr & 0x0000000d) {
54756                           case 0x0000000d: {
54757                             // 0xf4a0020d
54758                             switch (instr & 0x00000002) {
54759                               case 0x00000000: {
54760                                 // 0xf4a0020d
54761                                 if (((instr & 0xc00) == 0xc00)) {
54762                                   UnallocatedA32(instr);
54763                                   return;
54764                                 }
54765                                 DataType dt =
54766                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54767                                 if (dt.Is(kDataTypeValueInvalid)) {
54768                                   UnallocatedA32(instr);
54769                                   return;
54770                                 }
54771                                 DecodeNeon decode_neon =
54772                                     Index_1_Decode((instr >> 4) & 0xf, dt);
54773                                 if (!decode_neon.IsValid()) {
54774                                   UnallocatedA32(instr);
54775                                   return;
54776                                 }
54777                                 int lane = decode_neon.GetLane();
54778                                 SpacingType spacing = decode_neon.GetSpacing();
54779                                 unsigned first =
54780                                     ExtractDRegister(instr, 22, 12);
54781                                 unsigned length = 3;
54782                                 unsigned last =
54783                                     first +
54784                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54785                                 unsigned rn = (instr >> 16) & 0xf;
54786                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
54787                                 vld3(al,
54788                                      dt,
54789                                      NeonRegisterList(DRegister(first),
54790                                                       DRegister(last),
54791                                                       spacing,
54792                                                       lane),
54793                                      MemOperand(Register(rn), PreIndex));
54794                                 break;
54795                               }
54796                               case 0x00000002: {
54797                                 // 0xf4a0020f
54798                                 if (((instr & 0xc00) == 0xc00)) {
54799                                   UnallocatedA32(instr);
54800                                   return;
54801                                 }
54802                                 DataType dt =
54803                                     Dt_size_7_Decode((instr >> 10) & 0x3);
54804                                 if (dt.Is(kDataTypeValueInvalid)) {
54805                                   UnallocatedA32(instr);
54806                                   return;
54807                                 }
54808                                 DecodeNeon decode_neon =
54809                                     Index_1_Decode((instr >> 4) & 0xf, dt);
54810                                 if (!decode_neon.IsValid()) {
54811                                   UnallocatedA32(instr);
54812                                   return;
54813                                 }
54814                                 int lane = decode_neon.GetLane();
54815                                 SpacingType spacing = decode_neon.GetSpacing();
54816                                 unsigned first =
54817                                     ExtractDRegister(instr, 22, 12);
54818                                 unsigned length = 3;
54819                                 unsigned last =
54820                                     first +
54821                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54822                                 unsigned rn = (instr >> 16) & 0xf;
54823                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
54824                                 vld3(al,
54825                                      dt,
54826                                      NeonRegisterList(DRegister(first),
54827                                                       DRegister(last),
54828                                                       spacing,
54829                                                       lane),
54830                                      MemOperand(Register(rn), Offset));
54831                                 break;
54832                               }
54833                             }
54834                             break;
54835                           }
54836                           default: {
54837                             if (((instr & 0xc00) == 0xc00) ||
54838                                 ((instr & 0xd) == 0xd)) {
54839                               UnallocatedA32(instr);
54840                               return;
54841                             }
54842                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
54843                             if (dt.Is(kDataTypeValueInvalid)) {
54844                               UnallocatedA32(instr);
54845                               return;
54846                             }
54847                             DecodeNeon decode_neon =
54848                                 Index_1_Decode((instr >> 4) & 0xf, dt);
54849                             if (!decode_neon.IsValid()) {
54850                               UnallocatedA32(instr);
54851                               return;
54852                             }
54853                             int lane = decode_neon.GetLane();
54854                             SpacingType spacing = decode_neon.GetSpacing();
54855                             unsigned first = ExtractDRegister(instr, 22, 12);
54856                             unsigned length = 3;
54857                             unsigned last =
54858                                 first +
54859                                 (length - 1) * (spacing == kSingle ? 1 : 2);
54860                             unsigned rn = (instr >> 16) & 0xf;
54861                             Sign sign(plus);
54862                             unsigned rm = instr & 0xf;
54863                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
54864                             vld3(al,
54865                                  dt,
54866                                  NeonRegisterList(DRegister(first),
54867                                                   DRegister(last),
54868                                                   spacing,
54869                                                   lane),
54870                                  MemOperand(Register(rn),
54871                                             sign,
54872                                             Register(rm),
54873                                             PostIndex));
54874                             break;
54875                           }
54876                         }
54877                         break;
54878                       }
54879                     }
54880                     break;
54881                   }
54882                   case 0x00000300: {
54883                     // 0xf4a00300
54884                     switch (instr & 0x00000c00) {
54885                       case 0x00000c00: {
54886                         // 0xf4a00f00
54887                         switch (instr & 0x0000000d) {
54888                           case 0x0000000d: {
54889                             // 0xf4a00f0d
54890                             switch (instr & 0x00000002) {
54891                               case 0x00000000: {
54892                                 // 0xf4a00f0d
54893                                 DataType dt =
54894                                     Dt_size_8_Decode((instr >> 6) & 0x3);
54895                                 if (dt.Is(kDataTypeValueInvalid)) {
54896                                   UnallocatedA32(instr);
54897                                   return;
54898                                 }
54899                                 Alignment align =
54900                                     Align_a_3_Decode((instr >> 4) & 0x1,
54901                                                      dt,
54902                                                      (instr >> 6) & 0x3);
54903                                 if (dt.Is(kDataTypeValueInvalid) ||
54904                                     align.Is(kBadAlignment)) {
54905                                   UnallocatedA32(instr);
54906                                   return;
54907                                 }
54908                                 unsigned first =
54909                                     ExtractDRegister(instr, 22, 12);
54910                                 unsigned length;
54911                                 SpacingType spacing;
54912                                 switch ((instr >> 5) & 0x1) {
54913                                   default:
54914                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54915                                   case 0x0:
54916                                     length = 4;
54917                                     spacing = kSingle;
54918                                     break;
54919                                   case 0x1:
54920                                     length = 4;
54921                                     spacing = kDouble;
54922                                     break;
54923                                 }
54924                                 unsigned last =
54925                                     first +
54926                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54927                                 TransferType transfer = kAllLanes;
54928                                 unsigned rn = (instr >> 16) & 0xf;
54929                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
54930                                 vld4(al,
54931                                      dt,
54932                                      NeonRegisterList(DRegister(first),
54933                                                       DRegister(last),
54934                                                       spacing,
54935                                                       transfer),
54936                                      AlignedMemOperand(Register(rn),
54937                                                        align,
54938                                                        PostIndex));
54939                                 break;
54940                               }
54941                               case 0x00000002: {
54942                                 // 0xf4a00f0f
54943                                 DataType dt =
54944                                     Dt_size_8_Decode((instr >> 6) & 0x3);
54945                                 if (dt.Is(kDataTypeValueInvalid)) {
54946                                   UnallocatedA32(instr);
54947                                   return;
54948                                 }
54949                                 Alignment align =
54950                                     Align_a_3_Decode((instr >> 4) & 0x1,
54951                                                      dt,
54952                                                      (instr >> 6) & 0x3);
54953                                 if (dt.Is(kDataTypeValueInvalid) ||
54954                                     align.Is(kBadAlignment)) {
54955                                   UnallocatedA32(instr);
54956                                   return;
54957                                 }
54958                                 unsigned first =
54959                                     ExtractDRegister(instr, 22, 12);
54960                                 unsigned length;
54961                                 SpacingType spacing;
54962                                 switch ((instr >> 5) & 0x1) {
54963                                   default:
54964                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
54965                                   case 0x0:
54966                                     length = 4;
54967                                     spacing = kSingle;
54968                                     break;
54969                                   case 0x1:
54970                                     length = 4;
54971                                     spacing = kDouble;
54972                                     break;
54973                                 }
54974                                 unsigned last =
54975                                     first +
54976                                     (length - 1) * (spacing == kSingle ? 1 : 2);
54977                                 TransferType transfer = kAllLanes;
54978                                 unsigned rn = (instr >> 16) & 0xf;
54979                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
54980                                 vld4(al,
54981                                      dt,
54982                                      NeonRegisterList(DRegister(first),
54983                                                       DRegister(last),
54984                                                       spacing,
54985                                                       transfer),
54986                                      AlignedMemOperand(Register(rn),
54987                                                        align,
54988                                                        Offset));
54989                                 break;
54990                               }
54991                             }
54992                             break;
54993                           }
54994                           default: {
54995                             if (((instr & 0xd) == 0xd)) {
54996                               UnallocatedA32(instr);
54997                               return;
54998                             }
54999                             DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
55000                             if (dt.Is(kDataTypeValueInvalid)) {
55001                               UnallocatedA32(instr);
55002                               return;
55003                             }
55004                             Alignment align =
55005                                 Align_a_3_Decode((instr >> 4) & 0x1,
55006                                                  dt,
55007                                                  (instr >> 6) & 0x3);
55008                             if (dt.Is(kDataTypeValueInvalid) ||
55009                                 align.Is(kBadAlignment)) {
55010                               UnallocatedA32(instr);
55011                               return;
55012                             }
55013                             unsigned first = ExtractDRegister(instr, 22, 12);
55014                             unsigned length;
55015                             SpacingType spacing;
55016                             switch ((instr >> 5) & 0x1) {
55017                               default:
55018                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
55019                               case 0x0:
55020                                 length = 4;
55021                                 spacing = kSingle;
55022                                 break;
55023                               case 0x1:
55024                                 length = 4;
55025                                 spacing = kDouble;
55026                                 break;
55027                             }
55028                             unsigned last =
55029                                 first +
55030                                 (length - 1) * (spacing == kSingle ? 1 : 2);
55031                             TransferType transfer = kAllLanes;
55032                             unsigned rn = (instr >> 16) & 0xf;
55033                             unsigned rm = instr & 0xf;
55034                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
55035                             vld4(al,
55036                                  dt,
55037                                  NeonRegisterList(DRegister(first),
55038                                                   DRegister(last),
55039                                                   spacing,
55040                                                   transfer),
55041                                  AlignedMemOperand(Register(rn),
55042                                                    align,
55043                                                    Register(rm),
55044                                                    PostIndex));
55045                             break;
55046                           }
55047                         }
55048                         break;
55049                       }
55050                       default: {
55051                         switch (instr & 0x0000000d) {
55052                           case 0x0000000d: {
55053                             // 0xf4a0030d
55054                             switch (instr & 0x00000002) {
55055                               case 0x00000000: {
55056                                 // 0xf4a0030d
55057                                 if (((instr & 0xc00) == 0xc00)) {
55058                                   UnallocatedA32(instr);
55059                                   return;
55060                                 }
55061                                 DataType dt =
55062                                     Dt_size_7_Decode((instr >> 10) & 0x3);
55063                                 if (dt.Is(kDataTypeValueInvalid)) {
55064                                   UnallocatedA32(instr);
55065                                   return;
55066                                 }
55067                                 DecodeNeonAndAlign decode_neon =
55068                                     Align_index_align_3_Decode((instr >> 4) &
55069                                                                    0xf,
55070                                                                dt);
55071                                 if (!decode_neon.IsValid()) {
55072                                   UnallocatedA32(instr);
55073                                   return;
55074                                 }
55075                                 Alignment align = decode_neon.GetAlign();
55076                                 int lane = decode_neon.GetLane();
55077                                 SpacingType spacing = decode_neon.GetSpacing();
55078                                 unsigned first =
55079                                     ExtractDRegister(instr, 22, 12);
55080                                 unsigned length = 4;
55081                                 unsigned last =
55082                                     first +
55083                                     (length - 1) * (spacing == kSingle ? 1 : 2);
55084                                 unsigned rn = (instr >> 16) & 0xf;
55085                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
55086                                 vld4(al,
55087                                      dt,
55088                                      NeonRegisterList(DRegister(first),
55089                                                       DRegister(last),
55090                                                       spacing,
55091                                                       lane),
55092                                      AlignedMemOperand(Register(rn),
55093                                                        align,
55094                                                        PostIndex));
55095                                 break;
55096                               }
55097                               case 0x00000002: {
55098                                 // 0xf4a0030f
55099                                 if (((instr & 0xc00) == 0xc00)) {
55100                                   UnallocatedA32(instr);
55101                                   return;
55102                                 }
55103                                 DataType dt =
55104                                     Dt_size_7_Decode((instr >> 10) & 0x3);
55105                                 if (dt.Is(kDataTypeValueInvalid)) {
55106                                   UnallocatedA32(instr);
55107                                   return;
55108                                 }
55109                                 DecodeNeonAndAlign decode_neon =
55110                                     Align_index_align_3_Decode((instr >> 4) &
55111                                                                    0xf,
55112                                                                dt);
55113                                 if (!decode_neon.IsValid()) {
55114                                   UnallocatedA32(instr);
55115                                   return;
55116                                 }
55117                                 Alignment align = decode_neon.GetAlign();
55118                                 int lane = decode_neon.GetLane();
55119                                 SpacingType spacing = decode_neon.GetSpacing();
55120                                 unsigned first =
55121                                     ExtractDRegister(instr, 22, 12);
55122                                 unsigned length = 4;
55123                                 unsigned last =
55124                                     first +
55125                                     (length - 1) * (spacing == kSingle ? 1 : 2);
55126                                 unsigned rn = (instr >> 16) & 0xf;
55127                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
55128                                 vld4(al,
55129                                      dt,
55130                                      NeonRegisterList(DRegister(first),
55131                                                       DRegister(last),
55132                                                       spacing,
55133                                                       lane),
55134                                      AlignedMemOperand(Register(rn),
55135                                                        align,
55136                                                        Offset));
55137                                 break;
55138                               }
55139                             }
55140                             break;
55141                           }
55142                           default: {
55143                             if (((instr & 0xc00) == 0xc00) ||
55144                                 ((instr & 0xd) == 0xd)) {
55145                               UnallocatedA32(instr);
55146                               return;
55147                             }
55148                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
55149                             if (dt.Is(kDataTypeValueInvalid)) {
55150                               UnallocatedA32(instr);
55151                               return;
55152                             }
55153                             DecodeNeonAndAlign decode_neon =
55154                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
55155                                                            dt);
55156                             if (!decode_neon.IsValid()) {
55157                               UnallocatedA32(instr);
55158                               return;
55159                             }
55160                             Alignment align = decode_neon.GetAlign();
55161                             int lane = decode_neon.GetLane();
55162                             SpacingType spacing = decode_neon.GetSpacing();
55163                             unsigned first = ExtractDRegister(instr, 22, 12);
55164                             unsigned length = 4;
55165                             unsigned last =
55166                                 first +
55167                                 (length - 1) * (spacing == kSingle ? 1 : 2);
55168                             unsigned rn = (instr >> 16) & 0xf;
55169                             unsigned rm = instr & 0xf;
55170                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
55171                             vld4(al,
55172                                  dt,
55173                                  NeonRegisterList(DRegister(first),
55174                                                   DRegister(last),
55175                                                   spacing,
55176                                                   lane),
55177                                  AlignedMemOperand(Register(rn),
55178                                                    align,
55179                                                    Register(rm),
55180                                                    PostIndex));
55181                             break;
55182                           }
55183                         }
55184                         break;
55185                       }
55186                     }
55187                     break;
55188                   }
55189                 }
55190                 break;
55191               }
55192             }
55193             break;
55194           }
55195           case 0x01100000: {
55196             // 0xf5100000
55197             switch (instr & 0x000f0000) {
55198               case 0x000f0000: {
55199                 // 0xf51f0000
55200                 uint32_t U = (instr >> 23) & 0x1;
55201                 int32_t imm = instr & 0xfff;
55202                 if (U == 0) imm = -imm;
55203                 bool minus_zero = (imm == 0) && (U == 0);
55204                 Label label(imm, kA32PcDelta, minus_zero);
55205                 // PLD{<c>}{<q>} <label> ; A1
55206                 pld(al, &label);
55207                 if (((instr & 0xff7ff000) != 0xf55ff000)) {
55208                   UnpredictableA32(instr);
55209                 }
55210                 break;
55211               }
55212               default: {
55213                 switch (instr & 0x00400000) {
55214                   case 0x00000000: {
55215                     // 0xf5100000
55216                     if (((instr & 0xf0000) == 0xf0000)) {
55217                       UnallocatedA32(instr);
55218                       return;
55219                     }
55220                     unsigned rn = (instr >> 16) & 0xf;
55221                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
55222                     int32_t offset = instr & 0xfff;
55223                     // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
55224                     pldw(al, MemOperand(Register(rn), sign, offset, Offset));
55225                     if (((instr & 0xff70f000) != 0xf510f000)) {
55226                       UnpredictableA32(instr);
55227                     }
55228                     break;
55229                   }
55230                   case 0x00400000: {
55231                     // 0xf5500000
55232                     if (((instr & 0xf0000) == 0xf0000)) {
55233                       UnallocatedA32(instr);
55234                       return;
55235                     }
55236                     unsigned rn = (instr >> 16) & 0xf;
55237                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
55238                     int32_t offset = instr & 0xfff;
55239                     // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
55240                     pld(al, MemOperand(Register(rn), sign, offset, Offset));
55241                     if (((instr & 0xff70f000) != 0xf550f000)) {
55242                       UnpredictableA32(instr);
55243                     }
55244                     break;
55245                   }
55246                 }
55247                 break;
55248               }
55249             }
55250             break;
55251           }
55252           case 0x01300000: {
55253             // 0xf5300000
55254             switch (instr & 0x00c000f0) {
55255               case 0x00400010: {
55256                 // 0xf5700010
55257                 // CLREX{<c>}{<q>} ; A1
55258                 clrex(al);
55259                 if (((instr & 0xffffffff) != 0xf57ff01f)) {
55260                   UnpredictableA32(instr);
55261                 }
55262                 break;
55263               }
55264               case 0x00400040: {
55265                 // 0xf5700040
55266                 MemoryBarrier option(instr & 0xf);
55267                 // DSB{<c>}{<q>} {<option>} ; A1
55268                 dsb(al, option);
55269                 if (((instr & 0xfffffff0) != 0xf57ff040)) {
55270                   UnpredictableA32(instr);
55271                 }
55272                 break;
55273               }
55274               case 0x00400050: {
55275                 // 0xf5700050
55276                 MemoryBarrier option(instr & 0xf);
55277                 // DMB{<c>}{<q>} {<option>} ; A1
55278                 dmb(al, option);
55279                 if (((instr & 0xfffffff0) != 0xf57ff050)) {
55280                   UnpredictableA32(instr);
55281                 }
55282                 break;
55283               }
55284               case 0x00400060: {
55285                 // 0xf5700060
55286                 MemoryBarrier option(instr & 0xf);
55287                 // ISB{<c>}{<q>} {<option>} ; A1
55288                 isb(al, option);
55289                 if (((instr & 0xfffffff0) != 0xf57ff060)) {
55290                   UnpredictableA32(instr);
55291                 }
55292                 break;
55293               }
55294               default:
55295                 UnallocatedA32(instr);
55296                 break;
55297             }
55298             break;
55299           }
55300           default:
55301             UnallocatedA32(instr);
55302             break;
55303         }
55304         break;
55305       }
55306       case 0x06000000: {
55307         // 0xf6000000
55308         switch (instr & 0x01700010) {
55309           case 0x00500000: {
55310             // 0xf6500000
55311             switch (instr & 0x00000fe0) {
55312               case 0x00000060: {
55313                 // 0xf6500060
55314                 unsigned rn = (instr >> 16) & 0xf;
55315                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55316                 unsigned rm = instr & 0xf;
55317                 Shift shift = RRX;
55318                 uint32_t amount = 0;
55319                 AddrMode addrmode = Offset;
55320                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55321                 pli(al,
55322                     MemOperand(Register(rn),
55323                                sign,
55324                                Register(rm),
55325                                shift,
55326                                amount,
55327                                addrmode));
55328                 if (((instr & 0xff70fff0) != 0xf650f060)) {
55329                   UnpredictableA32(instr);
55330                 }
55331                 break;
55332               }
55333               default: {
55334                 if (((instr & 0xfe0) == 0x60)) {
55335                   UnallocatedA32(instr);
55336                   return;
55337                 }
55338                 unsigned rn = (instr >> 16) & 0xf;
55339                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55340                 unsigned rm = instr & 0xf;
55341                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55342                                                     (instr >> 7) & 0x1f);
55343                 Shift shift = shift_operand.GetShift();
55344                 uint32_t amount = shift_operand.GetAmount();
55345                 AddrMode addrmode = Offset;
55346                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55347                 pli(al,
55348                     MemOperand(Register(rn),
55349                                sign,
55350                                Register(rm),
55351                                shift,
55352                                amount,
55353                                addrmode));
55354                 if (((instr & 0xff70f010) != 0xf650f000)) {
55355                   UnpredictableA32(instr);
55356                 }
55357                 break;
55358               }
55359             }
55360             break;
55361           }
55362           case 0x01100000: {
55363             // 0xf7100000
55364             switch (instr & 0x00000fe0) {
55365               case 0x00000060: {
55366                 // 0xf7100060
55367                 unsigned rn = (instr >> 16) & 0xf;
55368                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55369                 unsigned rm = instr & 0xf;
55370                 Shift shift = RRX;
55371                 uint32_t amount = 0;
55372                 AddrMode addrmode = Offset;
55373                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55374                 pldw(al,
55375                      MemOperand(Register(rn),
55376                                 sign,
55377                                 Register(rm),
55378                                 shift,
55379                                 amount,
55380                                 addrmode));
55381                 if (((instr & 0xff70fff0) != 0xf710f060)) {
55382                   UnpredictableA32(instr);
55383                 }
55384                 break;
55385               }
55386               default: {
55387                 if (((instr & 0xfe0) == 0x60)) {
55388                   UnallocatedA32(instr);
55389                   return;
55390                 }
55391                 unsigned rn = (instr >> 16) & 0xf;
55392                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55393                 unsigned rm = instr & 0xf;
55394                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55395                                                     (instr >> 7) & 0x1f);
55396                 Shift shift = shift_operand.GetShift();
55397                 uint32_t amount = shift_operand.GetAmount();
55398                 AddrMode addrmode = Offset;
55399                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55400                 pldw(al,
55401                      MemOperand(Register(rn),
55402                                 sign,
55403                                 Register(rm),
55404                                 shift,
55405                                 amount,
55406                                 addrmode));
55407                 if (((instr & 0xff70f010) != 0xf710f000)) {
55408                   UnpredictableA32(instr);
55409                 }
55410                 break;
55411               }
55412             }
55413             break;
55414           }
55415           case 0x01500000: {
55416             // 0xf7500000
55417             switch (instr & 0x00000fe0) {
55418               case 0x00000060: {
55419                 // 0xf7500060
55420                 unsigned rn = (instr >> 16) & 0xf;
55421                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55422                 unsigned rm = instr & 0xf;
55423                 Shift shift = RRX;
55424                 uint32_t amount = 0;
55425                 AddrMode addrmode = Offset;
55426                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
55427                 pld(al,
55428                     MemOperand(Register(rn),
55429                                sign,
55430                                Register(rm),
55431                                shift,
55432                                amount,
55433                                addrmode));
55434                 if (((instr & 0xff70fff0) != 0xf750f060)) {
55435                   UnpredictableA32(instr);
55436                 }
55437                 break;
55438               }
55439               default: {
55440                 if (((instr & 0xfe0) == 0x60)) {
55441                   UnallocatedA32(instr);
55442                   return;
55443                 }
55444                 unsigned rn = (instr >> 16) & 0xf;
55445                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
55446                 unsigned rm = instr & 0xf;
55447                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
55448                                                     (instr >> 7) & 0x1f);
55449                 Shift shift = shift_operand.GetShift();
55450                 uint32_t amount = shift_operand.GetAmount();
55451                 AddrMode addrmode = Offset;
55452                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
55453                 pld(al,
55454                     MemOperand(Register(rn),
55455                                sign,
55456                                Register(rm),
55457                                shift,
55458                                amount,
55459                                addrmode));
55460                 if (((instr & 0xff70f010) != 0xf750f000)) {
55461                   UnpredictableA32(instr);
55462                 }
55463                 break;
55464               }
55465             }
55466             break;
55467           }
55468           default:
55469             UnallocatedA32(instr);
55470             break;
55471         }
55472         break;
55473       }
55474       case 0x08000000: {
55475         // 0xf8000000
55476         switch (instr & 0x01d00000) {
55477           case 0x00100000: {
55478             // 0xf8100000
55479             UnimplementedA32("RFEDA", instr);
55480             break;
55481           }
55482           case 0x00400000: {
55483             // 0xf8400000
55484             UnimplementedA32("SRSDA", instr);
55485             break;
55486           }
55487           case 0x00900000: {
55488             // 0xf8900000
55489             UnimplementedA32("RFE{IA}", instr);
55490             break;
55491           }
55492           case 0x00c00000: {
55493             // 0xf8c00000
55494             UnimplementedA32("SRS{IA}", instr);
55495             break;
55496           }
55497           case 0x01100000: {
55498             // 0xf9100000
55499             UnimplementedA32("RFEDB", instr);
55500             break;
55501           }
55502           case 0x01400000: {
55503             // 0xf9400000
55504             UnimplementedA32("SRSDB", instr);
55505             break;
55506           }
55507           case 0x01900000: {
55508             // 0xf9900000
55509             UnimplementedA32("RFEIB", instr);
55510             break;
55511           }
55512           case 0x01c00000: {
55513             // 0xf9c00000
55514             UnimplementedA32("SRSIB", instr);
55515             break;
55516           }
55517           default:
55518             UnallocatedA32(instr);
55519             break;
55520         }
55521         break;
55522       }
55523       case 0x0a000000: {
55524         // 0xfa000000
55525         int32_t imm = SignExtend<int32_t>(((instr >> 24) & 0x1) |
55526                                               ((instr << 1) & 0x1fffffe),
55527                                           25)
55528                       << 1;
55529         Label label(imm, kA32PcDelta);
55530         // BLX{<c>}{<q>} <label> ; A2
55531         blx(al, &label);
55532         break;
55533       }
55534       case 0x0c000000: {
55535         // 0xfc000000
55536         switch (instr & 0x01300000) {
55537           case 0x00000000: {
55538             // 0xfc000000
55539             switch (instr & 0x00800000) {
55540               case 0x00000000: {
55541                 // 0xfc000000
55542                 if ((instr & 0x00400000) == 0x00400000) {
55543                   if (((instr & 0xe00) == 0xa00)) {
55544                     UnallocatedA32(instr);
55545                     return;
55546                   }
55547                   UnimplementedA32("MCRR2", instr);
55548                 } else {
55549                   UnallocatedA32(instr);
55550                 }
55551                 break;
55552               }
55553               case 0x00800000: {
55554                 // 0xfc800000
55555                 if (((instr & 0xe00) == 0xa00)) {
55556                   UnallocatedA32(instr);
55557                   return;
55558                 }
55559                 UnimplementedA32("STC2", instr);
55560                 break;
55561               }
55562             }
55563             break;
55564           }
55565           case 0x00100000: {
55566             // 0xfc100000
55567             switch (instr & 0x00800000) {
55568               case 0x00000000: {
55569                 // 0xfc100000
55570                 if ((instr & 0x00400000) == 0x00400000) {
55571                   if (((instr & 0xe00) == 0xa00)) {
55572                     UnallocatedA32(instr);
55573                     return;
55574                   }
55575                   UnimplementedA32("MRRC2", instr);
55576                 } else {
55577                   UnallocatedA32(instr);
55578                 }
55579                 break;
55580               }
55581               case 0x00800000: {
55582                 // 0xfc900000
55583                 switch (instr & 0x00000e00) {
55584                   case 0x00000a00: {
55585                     // 0xfc900a00
55586                     UnallocatedA32(instr);
55587                     break;
55588                   }
55589                   default: {
55590                     switch (instr & 0x000f0000) {
55591                       case 0x000f0000: {
55592                         // 0xfc9f0000
55593                         if (((instr & 0xe00) == 0xa00)) {
55594                           UnallocatedA32(instr);
55595                           return;
55596                         }
55597                         UnimplementedA32("LDC2", instr);
55598                         break;
55599                       }
55600                       default: {
55601                         if (((instr & 0xf0000) == 0xf0000) ||
55602                             ((instr & 0xe00) == 0xa00)) {
55603                           UnallocatedA32(instr);
55604                           return;
55605                         }
55606                         UnimplementedA32("LDC2", instr);
55607                         break;
55608                       }
55609                     }
55610                     break;
55611                   }
55612                 }
55613                 break;
55614               }
55615             }
55616             break;
55617           }
55618           case 0x00200000: {
55619             // 0xfc200000
55620             if (((instr & 0xe00) == 0xa00)) {
55621               UnallocatedA32(instr);
55622               return;
55623             }
55624             UnimplementedA32("STC2", instr);
55625             break;
55626           }
55627           case 0x00300000: {
55628             // 0xfc300000
55629             if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
55630               UnallocatedA32(instr);
55631               return;
55632             }
55633             UnimplementedA32("LDC2", instr);
55634             break;
55635           }
55636           case 0x01000000: {
55637             // 0xfd000000
55638             if (((instr & 0xe00) == 0xa00)) {
55639               UnallocatedA32(instr);
55640               return;
55641             }
55642             UnimplementedA32("STC2", instr);
55643             break;
55644           }
55645           case 0x01100000: {
55646             // 0xfd100000
55647             switch (instr & 0x00000e00) {
55648               case 0x00000a00: {
55649                 // 0xfd100a00
55650                 UnallocatedA32(instr);
55651                 break;
55652               }
55653               default: {
55654                 switch (instr & 0x000f0000) {
55655                   case 0x000f0000: {
55656                     // 0xfd1f0000
55657                     if (((instr & 0xe00) == 0xa00)) {
55658                       UnallocatedA32(instr);
55659                       return;
55660                     }
55661                     UnimplementedA32("LDC2", instr);
55662                     break;
55663                   }
55664                   default: {
55665                     if (((instr & 0xf0000) == 0xf0000) ||
55666                         ((instr & 0xe00) == 0xa00)) {
55667                       UnallocatedA32(instr);
55668                       return;
55669                     }
55670                     UnimplementedA32("LDC2", instr);
55671                     break;
55672                   }
55673                 }
55674                 break;
55675               }
55676             }
55677             break;
55678           }
55679           case 0x01200000: {
55680             // 0xfd200000
55681             if (((instr & 0xe00) == 0xa00)) {
55682               UnallocatedA32(instr);
55683               return;
55684             }
55685             UnimplementedA32("STC2", instr);
55686             break;
55687           }
55688           case 0x01300000: {
55689             // 0xfd300000
55690             if (((instr & 0xf0000) == 0xf0000) || ((instr & 0xe00) == 0xa00)) {
55691               UnallocatedA32(instr);
55692               return;
55693             }
55694             UnimplementedA32("LDC2", instr);
55695             break;
55696           }
55697         }
55698         break;
55699       }
55700       case 0x0e000000: {
55701         // 0xfe000000
55702         switch (instr & 0x01000010) {
55703           case 0x00000000: {
55704             // 0xfe000000
55705             switch (instr & 0x00000e00) {
55706               case 0x00000a00: {
55707                 // 0xfe000a00
55708                 switch (instr & 0x00b00140) {
55709                   case 0x00000000: {
55710                     // 0xfe000a00
55711                     unsigned rd = ExtractSRegister(instr, 22, 12);
55712                     unsigned rn = ExtractSRegister(instr, 7, 16);
55713                     unsigned rm = ExtractSRegister(instr, 5, 0);
55714                     // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
55715                     vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55716                     break;
55717                   }
55718                   case 0x00000100: {
55719                     // 0xfe000b00
55720                     unsigned rd = ExtractDRegister(instr, 22, 12);
55721                     unsigned rn = ExtractDRegister(instr, 7, 16);
55722                     unsigned rm = ExtractDRegister(instr, 5, 0);
55723                     // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
55724                     vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55725                     break;
55726                   }
55727                   case 0x00100000: {
55728                     // 0xfe100a00
55729                     unsigned rd = ExtractSRegister(instr, 22, 12);
55730                     unsigned rn = ExtractSRegister(instr, 7, 16);
55731                     unsigned rm = ExtractSRegister(instr, 5, 0);
55732                     // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
55733                     vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55734                     break;
55735                   }
55736                   case 0x00100100: {
55737                     // 0xfe100b00
55738                     unsigned rd = ExtractDRegister(instr, 22, 12);
55739                     unsigned rn = ExtractDRegister(instr, 7, 16);
55740                     unsigned rm = ExtractDRegister(instr, 5, 0);
55741                     // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
55742                     vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55743                     break;
55744                   }
55745                   case 0x00200000: {
55746                     // 0xfe200a00
55747                     unsigned rd = ExtractSRegister(instr, 22, 12);
55748                     unsigned rn = ExtractSRegister(instr, 7, 16);
55749                     unsigned rm = ExtractSRegister(instr, 5, 0);
55750                     // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
55751                     vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55752                     break;
55753                   }
55754                   case 0x00200100: {
55755                     // 0xfe200b00
55756                     unsigned rd = ExtractDRegister(instr, 22, 12);
55757                     unsigned rn = ExtractDRegister(instr, 7, 16);
55758                     unsigned rm = ExtractDRegister(instr, 5, 0);
55759                     // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
55760                     vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55761                     break;
55762                   }
55763                   case 0x00300000: {
55764                     // 0xfe300a00
55765                     unsigned rd = ExtractSRegister(instr, 22, 12);
55766                     unsigned rn = ExtractSRegister(instr, 7, 16);
55767                     unsigned rm = ExtractSRegister(instr, 5, 0);
55768                     // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
55769                     vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55770                     break;
55771                   }
55772                   case 0x00300100: {
55773                     // 0xfe300b00
55774                     unsigned rd = ExtractDRegister(instr, 22, 12);
55775                     unsigned rn = ExtractDRegister(instr, 7, 16);
55776                     unsigned rm = ExtractDRegister(instr, 5, 0);
55777                     // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
55778                     vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55779                     break;
55780                   }
55781                   case 0x00800000: {
55782                     // 0xfe800a00
55783                     unsigned rd = ExtractSRegister(instr, 22, 12);
55784                     unsigned rn = ExtractSRegister(instr, 7, 16);
55785                     unsigned rm = ExtractSRegister(instr, 5, 0);
55786                     // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55787                     vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55788                     break;
55789                   }
55790                   case 0x00800040: {
55791                     // 0xfe800a40
55792                     unsigned rd = ExtractSRegister(instr, 22, 12);
55793                     unsigned rn = ExtractSRegister(instr, 7, 16);
55794                     unsigned rm = ExtractSRegister(instr, 5, 0);
55795                     // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
55796                     vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
55797                     break;
55798                   }
55799                   case 0x00800100: {
55800                     // 0xfe800b00
55801                     unsigned rd = ExtractDRegister(instr, 22, 12);
55802                     unsigned rn = ExtractDRegister(instr, 7, 16);
55803                     unsigned rm = ExtractDRegister(instr, 5, 0);
55804                     // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55805                     vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55806                     break;
55807                   }
55808                   case 0x00800140: {
55809                     // 0xfe800b40
55810                     unsigned rd = ExtractDRegister(instr, 22, 12);
55811                     unsigned rn = ExtractDRegister(instr, 7, 16);
55812                     unsigned rm = ExtractDRegister(instr, 5, 0);
55813                     // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
55814                     vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
55815                     break;
55816                   }
55817                   case 0x00b00040: {
55818                     // 0xfeb00a40
55819                     switch (instr & 0x000f0000) {
55820                       case 0x00080000: {
55821                         // 0xfeb80a40
55822                         if ((instr & 0x00000080) == 0x00000000) {
55823                           unsigned rd = ExtractSRegister(instr, 22, 12);
55824                           unsigned rm = ExtractSRegister(instr, 5, 0);
55825                           // VRINTA{<q>}.F32.F32 <Sd>, <Sm> ; A1
55826                           vrinta(F32, F32, SRegister(rd), SRegister(rm));
55827                         } else {
55828                           UnallocatedA32(instr);
55829                         }
55830                         break;
55831                       }
55832                       case 0x00090000: {
55833                         // 0xfeb90a40
55834                         if ((instr & 0x00000080) == 0x00000000) {
55835                           unsigned rd = ExtractSRegister(instr, 22, 12);
55836                           unsigned rm = ExtractSRegister(instr, 5, 0);
55837                           // VRINTN{<q>}.F32.F32 <Sd>, <Sm> ; A1
55838                           vrintn(F32, F32, SRegister(rd), SRegister(rm));
55839                         } else {
55840                           UnallocatedA32(instr);
55841                         }
55842                         break;
55843                       }
55844                       case 0x000a0000: {
55845                         // 0xfeba0a40
55846                         if ((instr & 0x00000080) == 0x00000000) {
55847                           unsigned rd = ExtractSRegister(instr, 22, 12);
55848                           unsigned rm = ExtractSRegister(instr, 5, 0);
55849                           // VRINTP{<q>}.F32.F32 <Sd>, <Sm> ; A1
55850                           vrintp(F32, F32, SRegister(rd), SRegister(rm));
55851                         } else {
55852                           UnallocatedA32(instr);
55853                         }
55854                         break;
55855                       }
55856                       case 0x000b0000: {
55857                         // 0xfebb0a40
55858                         if ((instr & 0x00000080) == 0x00000000) {
55859                           unsigned rd = ExtractSRegister(instr, 22, 12);
55860                           unsigned rm = ExtractSRegister(instr, 5, 0);
55861                           // VRINTM{<q>}.F32.F32 <Sd>, <Sm> ; A1
55862                           vrintm(F32, F32, SRegister(rd), SRegister(rm));
55863                         } else {
55864                           UnallocatedA32(instr);
55865                         }
55866                         break;
55867                       }
55868                       case 0x000c0000: {
55869                         // 0xfebc0a40
55870                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55871                         if (dt.Is(kDataTypeValueInvalid)) {
55872                           UnallocatedA32(instr);
55873                           return;
55874                         }
55875                         unsigned rd = ExtractSRegister(instr, 22, 12);
55876                         unsigned rm = ExtractSRegister(instr, 5, 0);
55877                         // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55878                         vcvta(dt, F32, SRegister(rd), SRegister(rm));
55879                         break;
55880                       }
55881                       case 0x000d0000: {
55882                         // 0xfebd0a40
55883                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55884                         if (dt.Is(kDataTypeValueInvalid)) {
55885                           UnallocatedA32(instr);
55886                           return;
55887                         }
55888                         unsigned rd = ExtractSRegister(instr, 22, 12);
55889                         unsigned rm = ExtractSRegister(instr, 5, 0);
55890                         // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55891                         vcvtn(dt, F32, SRegister(rd), SRegister(rm));
55892                         break;
55893                       }
55894                       case 0x000e0000: {
55895                         // 0xfebe0a40
55896                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55897                         if (dt.Is(kDataTypeValueInvalid)) {
55898                           UnallocatedA32(instr);
55899                           return;
55900                         }
55901                         unsigned rd = ExtractSRegister(instr, 22, 12);
55902                         unsigned rm = ExtractSRegister(instr, 5, 0);
55903                         // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55904                         vcvtp(dt, F32, SRegister(rd), SRegister(rm));
55905                         break;
55906                       }
55907                       case 0x000f0000: {
55908                         // 0xfebf0a40
55909                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55910                         if (dt.Is(kDataTypeValueInvalid)) {
55911                           UnallocatedA32(instr);
55912                           return;
55913                         }
55914                         unsigned rd = ExtractSRegister(instr, 22, 12);
55915                         unsigned rm = ExtractSRegister(instr, 5, 0);
55916                         // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
55917                         vcvtm(dt, F32, SRegister(rd), SRegister(rm));
55918                         break;
55919                       }
55920                       default:
55921                         UnallocatedA32(instr);
55922                         break;
55923                     }
55924                     break;
55925                   }
55926                   case 0x00b00140: {
55927                     // 0xfeb00b40
55928                     switch (instr & 0x000f0000) {
55929                       case 0x00080000: {
55930                         // 0xfeb80b40
55931                         if ((instr & 0x00000080) == 0x00000000) {
55932                           unsigned rd = ExtractDRegister(instr, 22, 12);
55933                           unsigned rm = ExtractDRegister(instr, 5, 0);
55934                           // VRINTA{<q>}.F64.F64 <Dd>, <Dm> ; A1
55935                           vrinta(F64, F64, DRegister(rd), DRegister(rm));
55936                         } else {
55937                           UnallocatedA32(instr);
55938                         }
55939                         break;
55940                       }
55941                       case 0x00090000: {
55942                         // 0xfeb90b40
55943                         if ((instr & 0x00000080) == 0x00000000) {
55944                           unsigned rd = ExtractDRegister(instr, 22, 12);
55945                           unsigned rm = ExtractDRegister(instr, 5, 0);
55946                           // VRINTN{<q>}.F64.F64 <Dd>, <Dm> ; A1
55947                           vrintn(F64, F64, DRegister(rd), DRegister(rm));
55948                         } else {
55949                           UnallocatedA32(instr);
55950                         }
55951                         break;
55952                       }
55953                       case 0x000a0000: {
55954                         // 0xfeba0b40
55955                         if ((instr & 0x00000080) == 0x00000000) {
55956                           unsigned rd = ExtractDRegister(instr, 22, 12);
55957                           unsigned rm = ExtractDRegister(instr, 5, 0);
55958                           // VRINTP{<q>}.F64.F64 <Dd>, <Dm> ; A1
55959                           vrintp(F64, F64, DRegister(rd), DRegister(rm));
55960                         } else {
55961                           UnallocatedA32(instr);
55962                         }
55963                         break;
55964                       }
55965                       case 0x000b0000: {
55966                         // 0xfebb0b40
55967                         if ((instr & 0x00000080) == 0x00000000) {
55968                           unsigned rd = ExtractDRegister(instr, 22, 12);
55969                           unsigned rm = ExtractDRegister(instr, 5, 0);
55970                           // VRINTM{<q>}.F64.F64 <Dd>, <Dm> ; A1
55971                           vrintm(F64, F64, DRegister(rd), DRegister(rm));
55972                         } else {
55973                           UnallocatedA32(instr);
55974                         }
55975                         break;
55976                       }
55977                       case 0x000c0000: {
55978                         // 0xfebc0b40
55979                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55980                         if (dt.Is(kDataTypeValueInvalid)) {
55981                           UnallocatedA32(instr);
55982                           return;
55983                         }
55984                         unsigned rd = ExtractSRegister(instr, 22, 12);
55985                         unsigned rm = ExtractDRegister(instr, 5, 0);
55986                         // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
55987                         vcvta(dt, F64, SRegister(rd), DRegister(rm));
55988                         break;
55989                       }
55990                       case 0x000d0000: {
55991                         // 0xfebd0b40
55992                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
55993                         if (dt.Is(kDataTypeValueInvalid)) {
55994                           UnallocatedA32(instr);
55995                           return;
55996                         }
55997                         unsigned rd = ExtractSRegister(instr, 22, 12);
55998                         unsigned rm = ExtractDRegister(instr, 5, 0);
55999                         // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56000                         vcvtn(dt, F64, SRegister(rd), DRegister(rm));
56001                         break;
56002                       }
56003                       case 0x000e0000: {
56004                         // 0xfebe0b40
56005                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56006                         if (dt.Is(kDataTypeValueInvalid)) {
56007                           UnallocatedA32(instr);
56008                           return;
56009                         }
56010                         unsigned rd = ExtractSRegister(instr, 22, 12);
56011                         unsigned rm = ExtractDRegister(instr, 5, 0);
56012                         // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56013                         vcvtp(dt, F64, SRegister(rd), DRegister(rm));
56014                         break;
56015                       }
56016                       case 0x000f0000: {
56017                         // 0xfebf0b40
56018                         DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
56019                         if (dt.Is(kDataTypeValueInvalid)) {
56020                           UnallocatedA32(instr);
56021                           return;
56022                         }
56023                         unsigned rd = ExtractSRegister(instr, 22, 12);
56024                         unsigned rm = ExtractDRegister(instr, 5, 0);
56025                         // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
56026                         vcvtm(dt, F64, SRegister(rd), DRegister(rm));
56027                         break;
56028                       }
56029                       default:
56030                         UnallocatedA32(instr);
56031                         break;
56032                     }
56033                     break;
56034                   }
56035                   default:
56036                     UnallocatedA32(instr);
56037                     break;
56038                 }
56039                 break;
56040               }
56041               default: {
56042                 if (((instr & 0xe00) == 0xa00)) {
56043                   UnallocatedA32(instr);
56044                   return;
56045                 }
56046                 UnimplementedA32("CDP2", instr);
56047                 break;
56048               }
56049             }
56050             break;
56051           }
56052           case 0x00000010: {
56053             // 0xfe000010
56054             switch (instr & 0x00100000) {
56055               case 0x00000000: {
56056                 // 0xfe000010
56057                 if (((instr & 0xe00) == 0xa00)) {
56058                   UnallocatedA32(instr);
56059                   return;
56060                 }
56061                 UnimplementedA32("MCR2", instr);
56062                 break;
56063               }
56064               case 0x00100000: {
56065                 // 0xfe100010
56066                 if (((instr & 0xe00) == 0xa00)) {
56067                   UnallocatedA32(instr);
56068                   return;
56069                 }
56070                 UnimplementedA32("MRC2", instr);
56071                 break;
56072               }
56073             }
56074             break;
56075           }
56076           default:
56077             UnallocatedA32(instr);
56078             break;
56079         }
56080         break;
56081       }
56082     }
56083   } else {
56084     switch (instr & 0x0e000000) {
56085       case 0x00000000: {
56086         // 0x00000000
56087         switch (instr & 0x00100010) {
56088           case 0x00000000: {
56089             // 0x00000000
56090             switch (instr & 0x01a00000) {
56091               case 0x00000000: {
56092                 // 0x00000000
56093                 switch (instr & 0x00400000) {
56094                   case 0x00000000: {
56095                     // 0x00000000
56096                     switch (instr & 0x00000fe0) {
56097                       case 0x00000060: {
56098                         // 0x00000060
56099                         if (((instr & 0xf0000000) == 0xf0000000)) {
56100                           UnallocatedA32(instr);
56101                           return;
56102                         }
56103                         Condition condition((instr >> 28) & 0xf);
56104                         unsigned rd = (instr >> 12) & 0xf;
56105                         unsigned rn = (instr >> 16) & 0xf;
56106                         unsigned rm = instr & 0xf;
56107                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56108                         and_(condition,
56109                              Best,
56110                              Register(rd),
56111                              Register(rn),
56112                              Operand(Register(rm), RRX));
56113                         break;
56114                       }
56115                       default: {
56116                         if (((instr & 0xf0000000) == 0xf0000000) ||
56117                             ((instr & 0xfe0) == 0x60)) {
56118                           UnallocatedA32(instr);
56119                           return;
56120                         }
56121                         Condition condition((instr >> 28) & 0xf);
56122                         unsigned rd = (instr >> 12) & 0xf;
56123                         unsigned rn = (instr >> 16) & 0xf;
56124                         unsigned rm = instr & 0xf;
56125                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56126                                                             (instr >> 7) &
56127                                                                 0x1f);
56128                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56129                         and_(condition,
56130                              Best,
56131                              Register(rd),
56132                              Register(rn),
56133                              Operand(Register(rm),
56134                                      shift_operand.GetType(),
56135                                      shift_operand.GetAmount()));
56136                         break;
56137                       }
56138                     }
56139                     break;
56140                   }
56141                   case 0x00400000: {
56142                     // 0x00400000
56143                     switch (instr & 0x000f0000) {
56144                       case 0x000d0000: {
56145                         // 0x004d0000
56146                         switch (instr & 0x00000fe0) {
56147                           case 0x00000060: {
56148                             // 0x004d0060
56149                             if (((instr & 0xf0000000) == 0xf0000000)) {
56150                               UnallocatedA32(instr);
56151                               return;
56152                             }
56153                             Condition condition((instr >> 28) & 0xf);
56154                             unsigned rd = (instr >> 12) & 0xf;
56155                             unsigned rm = instr & 0xf;
56156                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
56157                             sub(condition,
56158                                 Best,
56159                                 Register(rd),
56160                                 sp,
56161                                 Operand(Register(rm), RRX));
56162                             break;
56163                           }
56164                           default: {
56165                             if (((instr & 0xf0000000) == 0xf0000000) ||
56166                                 ((instr & 0xfe0) == 0x60)) {
56167                               UnallocatedA32(instr);
56168                               return;
56169                             }
56170                             Condition condition((instr >> 28) & 0xf);
56171                             unsigned rd = (instr >> 12) & 0xf;
56172                             unsigned rm = instr & 0xf;
56173                             ImmediateShiftOperand shift_operand((instr >> 5) &
56174                                                                     0x3,
56175                                                                 (instr >> 7) &
56176                                                                     0x1f);
56177                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56178                             sub(condition,
56179                                 Best,
56180                                 Register(rd),
56181                                 sp,
56182                                 Operand(Register(rm),
56183                                         shift_operand.GetType(),
56184                                         shift_operand.GetAmount()));
56185                             break;
56186                           }
56187                         }
56188                         break;
56189                       }
56190                       default: {
56191                         switch (instr & 0x00000fe0) {
56192                           case 0x00000060: {
56193                             // 0x00400060
56194                             if (((instr & 0xf0000000) == 0xf0000000) ||
56195                                 ((instr & 0xf0000) == 0xd0000)) {
56196                               UnallocatedA32(instr);
56197                               return;
56198                             }
56199                             Condition condition((instr >> 28) & 0xf);
56200                             unsigned rd = (instr >> 12) & 0xf;
56201                             unsigned rn = (instr >> 16) & 0xf;
56202                             unsigned rm = instr & 0xf;
56203                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56204                             sub(condition,
56205                                 Best,
56206                                 Register(rd),
56207                                 Register(rn),
56208                                 Operand(Register(rm), RRX));
56209                             break;
56210                           }
56211                           default: {
56212                             if (((instr & 0xf0000000) == 0xf0000000) ||
56213                                 ((instr & 0xf0000) == 0xd0000) ||
56214                                 ((instr & 0xfe0) == 0x60)) {
56215                               UnallocatedA32(instr);
56216                               return;
56217                             }
56218                             Condition condition((instr >> 28) & 0xf);
56219                             unsigned rd = (instr >> 12) & 0xf;
56220                             unsigned rn = (instr >> 16) & 0xf;
56221                             unsigned rm = instr & 0xf;
56222                             ImmediateShiftOperand shift_operand((instr >> 5) &
56223                                                                     0x3,
56224                                                                 (instr >> 7) &
56225                                                                     0x1f);
56226                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56227                             sub(condition,
56228                                 Best,
56229                                 Register(rd),
56230                                 Register(rn),
56231                                 Operand(Register(rm),
56232                                         shift_operand.GetType(),
56233                                         shift_operand.GetAmount()));
56234                             break;
56235                           }
56236                         }
56237                         break;
56238                       }
56239                     }
56240                     break;
56241                   }
56242                 }
56243                 break;
56244               }
56245               case 0x00200000: {
56246                 // 0x00200000
56247                 switch (instr & 0x00400000) {
56248                   case 0x00000000: {
56249                     // 0x00200000
56250                     switch (instr & 0x00000fe0) {
56251                       case 0x00000060: {
56252                         // 0x00200060
56253                         if (((instr & 0xf0000000) == 0xf0000000)) {
56254                           UnallocatedA32(instr);
56255                           return;
56256                         }
56257                         Condition condition((instr >> 28) & 0xf);
56258                         unsigned rd = (instr >> 12) & 0xf;
56259                         unsigned rn = (instr >> 16) & 0xf;
56260                         unsigned rm = instr & 0xf;
56261                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56262                         eor(condition,
56263                             Best,
56264                             Register(rd),
56265                             Register(rn),
56266                             Operand(Register(rm), RRX));
56267                         break;
56268                       }
56269                       default: {
56270                         if (((instr & 0xf0000000) == 0xf0000000) ||
56271                             ((instr & 0xfe0) == 0x60)) {
56272                           UnallocatedA32(instr);
56273                           return;
56274                         }
56275                         Condition condition((instr >> 28) & 0xf);
56276                         unsigned rd = (instr >> 12) & 0xf;
56277                         unsigned rn = (instr >> 16) & 0xf;
56278                         unsigned rm = instr & 0xf;
56279                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56280                                                             (instr >> 7) &
56281                                                                 0x1f);
56282                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56283                         eor(condition,
56284                             Best,
56285                             Register(rd),
56286                             Register(rn),
56287                             Operand(Register(rm),
56288                                     shift_operand.GetType(),
56289                                     shift_operand.GetAmount()));
56290                         break;
56291                       }
56292                     }
56293                     break;
56294                   }
56295                   case 0x00400000: {
56296                     // 0x00600000
56297                     switch (instr & 0x00000fe0) {
56298                       case 0x00000060: {
56299                         // 0x00600060
56300                         if (((instr & 0xf0000000) == 0xf0000000)) {
56301                           UnallocatedA32(instr);
56302                           return;
56303                         }
56304                         Condition condition((instr >> 28) & 0xf);
56305                         unsigned rd = (instr >> 12) & 0xf;
56306                         unsigned rn = (instr >> 16) & 0xf;
56307                         unsigned rm = instr & 0xf;
56308                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56309                         rsb(condition,
56310                             Best,
56311                             Register(rd),
56312                             Register(rn),
56313                             Operand(Register(rm), RRX));
56314                         break;
56315                       }
56316                       default: {
56317                         if (((instr & 0xf0000000) == 0xf0000000) ||
56318                             ((instr & 0xfe0) == 0x60)) {
56319                           UnallocatedA32(instr);
56320                           return;
56321                         }
56322                         Condition condition((instr >> 28) & 0xf);
56323                         unsigned rd = (instr >> 12) & 0xf;
56324                         unsigned rn = (instr >> 16) & 0xf;
56325                         unsigned rm = instr & 0xf;
56326                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56327                                                             (instr >> 7) &
56328                                                                 0x1f);
56329                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56330                         rsb(condition,
56331                             Best,
56332                             Register(rd),
56333                             Register(rn),
56334                             Operand(Register(rm),
56335                                     shift_operand.GetType(),
56336                                     shift_operand.GetAmount()));
56337                         break;
56338                       }
56339                     }
56340                     break;
56341                   }
56342                 }
56343                 break;
56344               }
56345               case 0x00800000: {
56346                 // 0x00800000
56347                 switch (instr & 0x00400000) {
56348                   case 0x00000000: {
56349                     // 0x00800000
56350                     switch (instr & 0x000f0000) {
56351                       case 0x000d0000: {
56352                         // 0x008d0000
56353                         switch (instr & 0x00000fe0) {
56354                           case 0x00000060: {
56355                             // 0x008d0060
56356                             if (((instr & 0xf0000000) == 0xf0000000)) {
56357                               UnallocatedA32(instr);
56358                               return;
56359                             }
56360                             Condition condition((instr >> 28) & 0xf);
56361                             unsigned rd = (instr >> 12) & 0xf;
56362                             unsigned rm = instr & 0xf;
56363                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
56364                             add(condition,
56365                                 Best,
56366                                 Register(rd),
56367                                 sp,
56368                                 Operand(Register(rm), RRX));
56369                             break;
56370                           }
56371                           default: {
56372                             if (((instr & 0xf0000000) == 0xf0000000) ||
56373                                 ((instr & 0xfe0) == 0x60)) {
56374                               UnallocatedA32(instr);
56375                               return;
56376                             }
56377                             Condition condition((instr >> 28) & 0xf);
56378                             unsigned rd = (instr >> 12) & 0xf;
56379                             unsigned rm = instr & 0xf;
56380                             ImmediateShiftOperand shift_operand((instr >> 5) &
56381                                                                     0x3,
56382                                                                 (instr >> 7) &
56383                                                                     0x1f);
56384                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56385                             add(condition,
56386                                 Best,
56387                                 Register(rd),
56388                                 sp,
56389                                 Operand(Register(rm),
56390                                         shift_operand.GetType(),
56391                                         shift_operand.GetAmount()));
56392                             break;
56393                           }
56394                         }
56395                         break;
56396                       }
56397                       default: {
56398                         switch (instr & 0x00000fe0) {
56399                           case 0x00000060: {
56400                             // 0x00800060
56401                             if (((instr & 0xf0000000) == 0xf0000000) ||
56402                                 ((instr & 0xf0000) == 0xd0000)) {
56403                               UnallocatedA32(instr);
56404                               return;
56405                             }
56406                             Condition condition((instr >> 28) & 0xf);
56407                             unsigned rd = (instr >> 12) & 0xf;
56408                             unsigned rn = (instr >> 16) & 0xf;
56409                             unsigned rm = instr & 0xf;
56410                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56411                             add(condition,
56412                                 Best,
56413                                 Register(rd),
56414                                 Register(rn),
56415                                 Operand(Register(rm), RRX));
56416                             break;
56417                           }
56418                           default: {
56419                             if (((instr & 0xf0000000) == 0xf0000000) ||
56420                                 ((instr & 0xf0000) == 0xd0000) ||
56421                                 ((instr & 0xfe0) == 0x60)) {
56422                               UnallocatedA32(instr);
56423                               return;
56424                             }
56425                             Condition condition((instr >> 28) & 0xf);
56426                             unsigned rd = (instr >> 12) & 0xf;
56427                             unsigned rn = (instr >> 16) & 0xf;
56428                             unsigned rm = instr & 0xf;
56429                             ImmediateShiftOperand shift_operand((instr >> 5) &
56430                                                                     0x3,
56431                                                                 (instr >> 7) &
56432                                                                     0x1f);
56433                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56434                             add(condition,
56435                                 Best,
56436                                 Register(rd),
56437                                 Register(rn),
56438                                 Operand(Register(rm),
56439                                         shift_operand.GetType(),
56440                                         shift_operand.GetAmount()));
56441                             break;
56442                           }
56443                         }
56444                         break;
56445                       }
56446                     }
56447                     break;
56448                   }
56449                   case 0x00400000: {
56450                     // 0x00c00000
56451                     switch (instr & 0x00000fe0) {
56452                       case 0x00000060: {
56453                         // 0x00c00060
56454                         if (((instr & 0xf0000000) == 0xf0000000)) {
56455                           UnallocatedA32(instr);
56456                           return;
56457                         }
56458                         Condition condition((instr >> 28) & 0xf);
56459                         unsigned rd = (instr >> 12) & 0xf;
56460                         unsigned rn = (instr >> 16) & 0xf;
56461                         unsigned rm = instr & 0xf;
56462                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56463                         sbc(condition,
56464                             Best,
56465                             Register(rd),
56466                             Register(rn),
56467                             Operand(Register(rm), RRX));
56468                         break;
56469                       }
56470                       default: {
56471                         if (((instr & 0xf0000000) == 0xf0000000) ||
56472                             ((instr & 0xfe0) == 0x60)) {
56473                           UnallocatedA32(instr);
56474                           return;
56475                         }
56476                         Condition condition((instr >> 28) & 0xf);
56477                         unsigned rd = (instr >> 12) & 0xf;
56478                         unsigned rn = (instr >> 16) & 0xf;
56479                         unsigned rm = instr & 0xf;
56480                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56481                                                             (instr >> 7) &
56482                                                                 0x1f);
56483                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56484                         sbc(condition,
56485                             Best,
56486                             Register(rd),
56487                             Register(rn),
56488                             Operand(Register(rm),
56489                                     shift_operand.GetType(),
56490                                     shift_operand.GetAmount()));
56491                         break;
56492                       }
56493                     }
56494                     break;
56495                   }
56496                 }
56497                 break;
56498               }
56499               case 0x00a00000: {
56500                 // 0x00a00000
56501                 switch (instr & 0x00400000) {
56502                   case 0x00000000: {
56503                     // 0x00a00000
56504                     switch (instr & 0x00000fe0) {
56505                       case 0x00000060: {
56506                         // 0x00a00060
56507                         if (((instr & 0xf0000000) == 0xf0000000)) {
56508                           UnallocatedA32(instr);
56509                           return;
56510                         }
56511                         Condition condition((instr >> 28) & 0xf);
56512                         unsigned rd = (instr >> 12) & 0xf;
56513                         unsigned rn = (instr >> 16) & 0xf;
56514                         unsigned rm = instr & 0xf;
56515                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56516                         adc(condition,
56517                             Best,
56518                             Register(rd),
56519                             Register(rn),
56520                             Operand(Register(rm), RRX));
56521                         break;
56522                       }
56523                       default: {
56524                         if (((instr & 0xf0000000) == 0xf0000000) ||
56525                             ((instr & 0xfe0) == 0x60)) {
56526                           UnallocatedA32(instr);
56527                           return;
56528                         }
56529                         Condition condition((instr >> 28) & 0xf);
56530                         unsigned rd = (instr >> 12) & 0xf;
56531                         unsigned rn = (instr >> 16) & 0xf;
56532                         unsigned rm = instr & 0xf;
56533                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56534                                                             (instr >> 7) &
56535                                                                 0x1f);
56536                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56537                         adc(condition,
56538                             Best,
56539                             Register(rd),
56540                             Register(rn),
56541                             Operand(Register(rm),
56542                                     shift_operand.GetType(),
56543                                     shift_operand.GetAmount()));
56544                         break;
56545                       }
56546                     }
56547                     break;
56548                   }
56549                   case 0x00400000: {
56550                     // 0x00e00000
56551                     switch (instr & 0x00000fe0) {
56552                       case 0x00000060: {
56553                         // 0x00e00060
56554                         if (((instr & 0xf0000000) == 0xf0000000)) {
56555                           UnallocatedA32(instr);
56556                           return;
56557                         }
56558                         Condition condition((instr >> 28) & 0xf);
56559                         unsigned rd = (instr >> 12) & 0xf;
56560                         unsigned rn = (instr >> 16) & 0xf;
56561                         unsigned rm = instr & 0xf;
56562                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
56563                         rsc(condition,
56564                             Register(rd),
56565                             Register(rn),
56566                             Operand(Register(rm), RRX));
56567                         break;
56568                       }
56569                       default: {
56570                         if (((instr & 0xf0000000) == 0xf0000000) ||
56571                             ((instr & 0xfe0) == 0x60)) {
56572                           UnallocatedA32(instr);
56573                           return;
56574                         }
56575                         Condition condition((instr >> 28) & 0xf);
56576                         unsigned rd = (instr >> 12) & 0xf;
56577                         unsigned rn = (instr >> 16) & 0xf;
56578                         unsigned rm = instr & 0xf;
56579                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
56580                                                             (instr >> 7) &
56581                                                                 0x1f);
56582                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
56583                         rsc(condition,
56584                             Register(rd),
56585                             Register(rn),
56586                             Operand(Register(rm),
56587                                     shift_operand.GetType(),
56588                                     shift_operand.GetAmount()));
56589                         break;
56590                       }
56591                     }
56592                     break;
56593                   }
56594                 }
56595                 break;
56596               }
56597               case 0x01000000: {
56598                 // 0x01000000
56599                 switch (instr & 0x000000e0) {
56600                   case 0x00000000: {
56601                     // 0x01000000
56602                     switch (instr & 0x00000200) {
56603                       case 0x00000000: {
56604                         // 0x01000000
56605                         if (((instr & 0xf0000000) == 0xf0000000)) {
56606                           UnallocatedA32(instr);
56607                           return;
56608                         }
56609                         Condition condition((instr >> 28) & 0xf);
56610                         unsigned rd = (instr >> 12) & 0xf;
56611                         unsigned spec_reg = (instr >> 22) & 0x1;
56612                         // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
56613                         mrs(condition, Register(rd), SpecialRegister(spec_reg));
56614                         if (((instr & 0xfbf0fff) != 0x10f0000)) {
56615                           UnpredictableA32(instr);
56616                         }
56617                         break;
56618                       }
56619                       case 0x00000200: {
56620                         // 0x01000200
56621                         if (((instr & 0xf0000000) == 0xf0000000)) {
56622                           UnallocatedA32(instr);
56623                           return;
56624                         }
56625                         UnimplementedA32("MRS", instr);
56626                         break;
56627                       }
56628                     }
56629                     break;
56630                   }
56631                   case 0x00000040: {
56632                     // 0x01000040
56633                     switch (instr & 0x00400200) {
56634                       case 0x00000000: {
56635                         // 0x01000040
56636                         if (((instr & 0xf0000000) == 0xf0000000)) {
56637                           UnallocatedA32(instr);
56638                           return;
56639                         }
56640                         unsigned rd = (instr >> 12) & 0xf;
56641                         unsigned rn = (instr >> 16) & 0xf;
56642                         unsigned rm = instr & 0xf;
56643                         // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
56644                         crc32b(al, Register(rd), Register(rn), Register(rm));
56645                         if (((instr & 0xff00ff0) != 0x1000040)) {
56646                           UnpredictableA32(instr);
56647                         }
56648                         break;
56649                       }
56650                       case 0x00000200: {
56651                         // 0x01000240
56652                         if (((instr & 0xf0000000) == 0xf0000000)) {
56653                           UnallocatedA32(instr);
56654                           return;
56655                         }
56656                         unsigned rd = (instr >> 12) & 0xf;
56657                         unsigned rn = (instr >> 16) & 0xf;
56658                         unsigned rm = instr & 0xf;
56659                         // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
56660                         crc32cb(al, Register(rd), Register(rn), Register(rm));
56661                         if (((instr & 0xff00ff0) != 0x1000240)) {
56662                           UnpredictableA32(instr);
56663                         }
56664                         break;
56665                       }
56666                       case 0x00400000: {
56667                         // 0x01400040
56668                         if (((instr & 0xf0000000) == 0xf0000000)) {
56669                           UnallocatedA32(instr);
56670                           return;
56671                         }
56672                         unsigned rd = (instr >> 12) & 0xf;
56673                         unsigned rn = (instr >> 16) & 0xf;
56674                         unsigned rm = instr & 0xf;
56675                         // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
56676                         crc32w(al, Register(rd), Register(rn), Register(rm));
56677                         if (((instr & 0xff00ff0) != 0x1400040)) {
56678                           UnpredictableA32(instr);
56679                         }
56680                         break;
56681                       }
56682                       case 0x00400200: {
56683                         // 0x01400240
56684                         if (((instr & 0xf0000000) == 0xf0000000)) {
56685                           UnallocatedA32(instr);
56686                           return;
56687                         }
56688                         unsigned rd = (instr >> 12) & 0xf;
56689                         unsigned rn = (instr >> 16) & 0xf;
56690                         unsigned rm = instr & 0xf;
56691                         // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
56692                         crc32cw(al, Register(rd), Register(rn), Register(rm));
56693                         if (((instr & 0xff00ff0) != 0x1400240)) {
56694                           UnpredictableA32(instr);
56695                         }
56696                         break;
56697                       }
56698                     }
56699                     break;
56700                   }
56701                   case 0x00000080: {
56702                     // 0x01000080
56703                     switch (instr & 0x00400000) {
56704                       case 0x00000000: {
56705                         // 0x01000080
56706                         if (((instr & 0xf0000000) == 0xf0000000)) {
56707                           UnallocatedA32(instr);
56708                           return;
56709                         }
56710                         Condition condition((instr >> 28) & 0xf);
56711                         unsigned rd = (instr >> 16) & 0xf;
56712                         unsigned rn = instr & 0xf;
56713                         unsigned rm = (instr >> 8) & 0xf;
56714                         unsigned ra = (instr >> 12) & 0xf;
56715                         // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56716                         smlabb(condition,
56717                                Register(rd),
56718                                Register(rn),
56719                                Register(rm),
56720                                Register(ra));
56721                         break;
56722                       }
56723                       case 0x00400000: {
56724                         // 0x01400080
56725                         if (((instr & 0xf0000000) == 0xf0000000)) {
56726                           UnallocatedA32(instr);
56727                           return;
56728                         }
56729                         Condition condition((instr >> 28) & 0xf);
56730                         unsigned rdlo = (instr >> 12) & 0xf;
56731                         unsigned rdhi = (instr >> 16) & 0xf;
56732                         unsigned rn = instr & 0xf;
56733                         unsigned rm = (instr >> 8) & 0xf;
56734                         // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56735                         smlalbb(condition,
56736                                 Register(rdlo),
56737                                 Register(rdhi),
56738                                 Register(rn),
56739                                 Register(rm));
56740                         break;
56741                       }
56742                     }
56743                     break;
56744                   }
56745                   case 0x000000a0: {
56746                     // 0x010000a0
56747                     switch (instr & 0x00400000) {
56748                       case 0x00000000: {
56749                         // 0x010000a0
56750                         if (((instr & 0xf0000000) == 0xf0000000)) {
56751                           UnallocatedA32(instr);
56752                           return;
56753                         }
56754                         Condition condition((instr >> 28) & 0xf);
56755                         unsigned rd = (instr >> 16) & 0xf;
56756                         unsigned rn = instr & 0xf;
56757                         unsigned rm = (instr >> 8) & 0xf;
56758                         unsigned ra = (instr >> 12) & 0xf;
56759                         // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56760                         smlatb(condition,
56761                                Register(rd),
56762                                Register(rn),
56763                                Register(rm),
56764                                Register(ra));
56765                         break;
56766                       }
56767                       case 0x00400000: {
56768                         // 0x014000a0
56769                         if (((instr & 0xf0000000) == 0xf0000000)) {
56770                           UnallocatedA32(instr);
56771                           return;
56772                         }
56773                         Condition condition((instr >> 28) & 0xf);
56774                         unsigned rdlo = (instr >> 12) & 0xf;
56775                         unsigned rdhi = (instr >> 16) & 0xf;
56776                         unsigned rn = instr & 0xf;
56777                         unsigned rm = (instr >> 8) & 0xf;
56778                         // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56779                         smlaltb(condition,
56780                                 Register(rdlo),
56781                                 Register(rdhi),
56782                                 Register(rn),
56783                                 Register(rm));
56784                         break;
56785                       }
56786                     }
56787                     break;
56788                   }
56789                   case 0x000000c0: {
56790                     // 0x010000c0
56791                     switch (instr & 0x00400000) {
56792                       case 0x00000000: {
56793                         // 0x010000c0
56794                         if (((instr & 0xf0000000) == 0xf0000000)) {
56795                           UnallocatedA32(instr);
56796                           return;
56797                         }
56798                         Condition condition((instr >> 28) & 0xf);
56799                         unsigned rd = (instr >> 16) & 0xf;
56800                         unsigned rn = instr & 0xf;
56801                         unsigned rm = (instr >> 8) & 0xf;
56802                         unsigned ra = (instr >> 12) & 0xf;
56803                         // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56804                         smlabt(condition,
56805                                Register(rd),
56806                                Register(rn),
56807                                Register(rm),
56808                                Register(ra));
56809                         break;
56810                       }
56811                       case 0x00400000: {
56812                         // 0x014000c0
56813                         if (((instr & 0xf0000000) == 0xf0000000)) {
56814                           UnallocatedA32(instr);
56815                           return;
56816                         }
56817                         Condition condition((instr >> 28) & 0xf);
56818                         unsigned rdlo = (instr >> 12) & 0xf;
56819                         unsigned rdhi = (instr >> 16) & 0xf;
56820                         unsigned rn = instr & 0xf;
56821                         unsigned rm = (instr >> 8) & 0xf;
56822                         // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56823                         smlalbt(condition,
56824                                 Register(rdlo),
56825                                 Register(rdhi),
56826                                 Register(rn),
56827                                 Register(rm));
56828                         break;
56829                       }
56830                     }
56831                     break;
56832                   }
56833                   case 0x000000e0: {
56834                     // 0x010000e0
56835                     switch (instr & 0x00400000) {
56836                       case 0x00000000: {
56837                         // 0x010000e0
56838                         if (((instr & 0xf0000000) == 0xf0000000)) {
56839                           UnallocatedA32(instr);
56840                           return;
56841                         }
56842                         Condition condition((instr >> 28) & 0xf);
56843                         unsigned rd = (instr >> 16) & 0xf;
56844                         unsigned rn = instr & 0xf;
56845                         unsigned rm = (instr >> 8) & 0xf;
56846                         unsigned ra = (instr >> 12) & 0xf;
56847                         // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
56848                         smlatt(condition,
56849                                Register(rd),
56850                                Register(rn),
56851                                Register(rm),
56852                                Register(ra));
56853                         break;
56854                       }
56855                       case 0x00400000: {
56856                         // 0x014000e0
56857                         if (((instr & 0xf0000000) == 0xf0000000)) {
56858                           UnallocatedA32(instr);
56859                           return;
56860                         }
56861                         Condition condition((instr >> 28) & 0xf);
56862                         unsigned rdlo = (instr >> 12) & 0xf;
56863                         unsigned rdhi = (instr >> 16) & 0xf;
56864                         unsigned rn = instr & 0xf;
56865                         unsigned rm = (instr >> 8) & 0xf;
56866                         // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
56867                         smlaltt(condition,
56868                                 Register(rdlo),
56869                                 Register(rdhi),
56870                                 Register(rn),
56871                                 Register(rm));
56872                         break;
56873                       }
56874                     }
56875                     break;
56876                   }
56877                   default:
56878                     UnallocatedA32(instr);
56879                     break;
56880                 }
56881                 break;
56882               }
56883               case 0x01200000: {
56884                 // 0x01200000
56885                 switch (instr & 0x000000e0) {
56886                   case 0x00000000: {
56887                     // 0x01200000
56888                     switch (instr & 0x00000200) {
56889                       case 0x00000000: {
56890                         // 0x01200000
56891                         if (((instr & 0xf0000000) == 0xf0000000)) {
56892                           UnallocatedA32(instr);
56893                           return;
56894                         }
56895                         Condition condition((instr >> 28) & 0xf);
56896                         unsigned spec_reg =
56897                             ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
56898                         unsigned rn = instr & 0xf;
56899                         // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
56900                         msr(condition,
56901                             MaskedSpecialRegister(spec_reg),
56902                             Register(rn));
56903                         if (((instr & 0xfb0fff0) != 0x120f000)) {
56904                           UnpredictableA32(instr);
56905                         }
56906                         break;
56907                       }
56908                       case 0x00000200: {
56909                         // 0x01200200
56910                         if (((instr & 0xf0000000) == 0xf0000000)) {
56911                           UnallocatedA32(instr);
56912                           return;
56913                         }
56914                         UnimplementedA32("MSR", instr);
56915                         break;
56916                       }
56917                     }
56918                     break;
56919                   }
56920                   case 0x00000020: {
56921                     // 0x01200020
56922                     if ((instr & 0x00400000) == 0x00000000) {
56923                       if (((instr & 0xf0000000) == 0xf0000000)) {
56924                         UnallocatedA32(instr);
56925                         return;
56926                       }
56927                       Condition condition((instr >> 28) & 0xf);
56928                       unsigned rm = instr & 0xf;
56929                       // BXJ{<c>}{<q>} <Rm> ; A1
56930                       bxj(condition, Register(rm));
56931                       if (((instr & 0xffffff0) != 0x12fff20)) {
56932                         UnpredictableA32(instr);
56933                       }
56934                     } else {
56935                       UnallocatedA32(instr);
56936                     }
56937                     break;
56938                   }
56939                   case 0x00000040: {
56940                     // 0x01200040
56941                     switch (instr & 0x00400200) {
56942                       case 0x00000000: {
56943                         // 0x01200040
56944                         if (((instr & 0xf0000000) == 0xf0000000)) {
56945                           UnallocatedA32(instr);
56946                           return;
56947                         }
56948                         unsigned rd = (instr >> 12) & 0xf;
56949                         unsigned rn = (instr >> 16) & 0xf;
56950                         unsigned rm = instr & 0xf;
56951                         // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
56952                         crc32h(al, Register(rd), Register(rn), Register(rm));
56953                         if (((instr & 0xff00ff0) != 0x1200040)) {
56954                           UnpredictableA32(instr);
56955                         }
56956                         break;
56957                       }
56958                       case 0x00000200: {
56959                         // 0x01200240
56960                         if (((instr & 0xf0000000) == 0xf0000000)) {
56961                           UnallocatedA32(instr);
56962                           return;
56963                         }
56964                         unsigned rd = (instr >> 12) & 0xf;
56965                         unsigned rn = (instr >> 16) & 0xf;
56966                         unsigned rm = instr & 0xf;
56967                         // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
56968                         crc32ch(al, Register(rd), Register(rn), Register(rm));
56969                         if (((instr & 0xff00ff0) != 0x1200240)) {
56970                           UnpredictableA32(instr);
56971                         }
56972                         break;
56973                       }
56974                       default:
56975                         UnallocatedA32(instr);
56976                         break;
56977                     }
56978                     break;
56979                   }
56980                   case 0x00000060: {
56981                     // 0x01200060
56982                     if ((instr & 0x00400000) == 0x00400000) {
56983                       if (((instr & 0xf0000000) == 0xf0000000)) {
56984                         UnallocatedA32(instr);
56985                         return;
56986                       }
56987                       UnimplementedA32("ERET", instr);
56988                     } else {
56989                       UnallocatedA32(instr);
56990                     }
56991                     break;
56992                   }
56993                   case 0x00000080: {
56994                     // 0x01200080
56995                     switch (instr & 0x00400000) {
56996                       case 0x00000000: {
56997                         // 0x01200080
56998                         if (((instr & 0xf0000000) == 0xf0000000)) {
56999                           UnallocatedA32(instr);
57000                           return;
57001                         }
57002                         Condition condition((instr >> 28) & 0xf);
57003                         unsigned rd = (instr >> 16) & 0xf;
57004                         unsigned rn = instr & 0xf;
57005                         unsigned rm = (instr >> 8) & 0xf;
57006                         unsigned ra = (instr >> 12) & 0xf;
57007                         // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57008                         smlawb(condition,
57009                                Register(rd),
57010                                Register(rn),
57011                                Register(rm),
57012                                Register(ra));
57013                         break;
57014                       }
57015                       case 0x00400000: {
57016                         // 0x01600080
57017                         if (((instr & 0xf0000000) == 0xf0000000)) {
57018                           UnallocatedA32(instr);
57019                           return;
57020                         }
57021                         Condition condition((instr >> 28) & 0xf);
57022                         unsigned rd = (instr >> 16) & 0xf;
57023                         unsigned rn = instr & 0xf;
57024                         unsigned rm = (instr >> 8) & 0xf;
57025                         // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57026                         smulbb(condition,
57027                                Register(rd),
57028                                Register(rn),
57029                                Register(rm));
57030                         if (((instr & 0xff0f0f0) != 0x1600080)) {
57031                           UnpredictableA32(instr);
57032                         }
57033                         break;
57034                       }
57035                     }
57036                     break;
57037                   }
57038                   case 0x000000a0: {
57039                     // 0x012000a0
57040                     switch (instr & 0x00400000) {
57041                       case 0x00000000: {
57042                         // 0x012000a0
57043                         if (((instr & 0xf0000000) == 0xf0000000)) {
57044                           UnallocatedA32(instr);
57045                           return;
57046                         }
57047                         Condition condition((instr >> 28) & 0xf);
57048                         unsigned rd = (instr >> 16) & 0xf;
57049                         unsigned rn = instr & 0xf;
57050                         unsigned rm = (instr >> 8) & 0xf;
57051                         // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57052                         smulwb(condition,
57053                                Register(rd),
57054                                Register(rn),
57055                                Register(rm));
57056                         if (((instr & 0xff0f0f0) != 0x12000a0)) {
57057                           UnpredictableA32(instr);
57058                         }
57059                         break;
57060                       }
57061                       case 0x00400000: {
57062                         // 0x016000a0
57063                         if (((instr & 0xf0000000) == 0xf0000000)) {
57064                           UnallocatedA32(instr);
57065                           return;
57066                         }
57067                         Condition condition((instr >> 28) & 0xf);
57068                         unsigned rd = (instr >> 16) & 0xf;
57069                         unsigned rn = instr & 0xf;
57070                         unsigned rm = (instr >> 8) & 0xf;
57071                         // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57072                         smultb(condition,
57073                                Register(rd),
57074                                Register(rn),
57075                                Register(rm));
57076                         if (((instr & 0xff0f0f0) != 0x16000a0)) {
57077                           UnpredictableA32(instr);
57078                         }
57079                         break;
57080                       }
57081                     }
57082                     break;
57083                   }
57084                   case 0x000000c0: {
57085                     // 0x012000c0
57086                     switch (instr & 0x00400000) {
57087                       case 0x00000000: {
57088                         // 0x012000c0
57089                         if (((instr & 0xf0000000) == 0xf0000000)) {
57090                           UnallocatedA32(instr);
57091                           return;
57092                         }
57093                         Condition condition((instr >> 28) & 0xf);
57094                         unsigned rd = (instr >> 16) & 0xf;
57095                         unsigned rn = instr & 0xf;
57096                         unsigned rm = (instr >> 8) & 0xf;
57097                         unsigned ra = (instr >> 12) & 0xf;
57098                         // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57099                         smlawt(condition,
57100                                Register(rd),
57101                                Register(rn),
57102                                Register(rm),
57103                                Register(ra));
57104                         break;
57105                       }
57106                       case 0x00400000: {
57107                         // 0x016000c0
57108                         if (((instr & 0xf0000000) == 0xf0000000)) {
57109                           UnallocatedA32(instr);
57110                           return;
57111                         }
57112                         Condition condition((instr >> 28) & 0xf);
57113                         unsigned rd = (instr >> 16) & 0xf;
57114                         unsigned rn = instr & 0xf;
57115                         unsigned rm = (instr >> 8) & 0xf;
57116                         // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57117                         smulbt(condition,
57118                                Register(rd),
57119                                Register(rn),
57120                                Register(rm));
57121                         if (((instr & 0xff0f0f0) != 0x16000c0)) {
57122                           UnpredictableA32(instr);
57123                         }
57124                         break;
57125                       }
57126                     }
57127                     break;
57128                   }
57129                   case 0x000000e0: {
57130                     // 0x012000e0
57131                     switch (instr & 0x00400000) {
57132                       case 0x00000000: {
57133                         // 0x012000e0
57134                         if (((instr & 0xf0000000) == 0xf0000000)) {
57135                           UnallocatedA32(instr);
57136                           return;
57137                         }
57138                         Condition condition((instr >> 28) & 0xf);
57139                         unsigned rd = (instr >> 16) & 0xf;
57140                         unsigned rn = instr & 0xf;
57141                         unsigned rm = (instr >> 8) & 0xf;
57142                         // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57143                         smulwt(condition,
57144                                Register(rd),
57145                                Register(rn),
57146                                Register(rm));
57147                         if (((instr & 0xff0f0f0) != 0x12000e0)) {
57148                           UnpredictableA32(instr);
57149                         }
57150                         break;
57151                       }
57152                       case 0x00400000: {
57153                         // 0x016000e0
57154                         if (((instr & 0xf0000000) == 0xf0000000)) {
57155                           UnallocatedA32(instr);
57156                           return;
57157                         }
57158                         Condition condition((instr >> 28) & 0xf);
57159                         unsigned rd = (instr >> 16) & 0xf;
57160                         unsigned rn = instr & 0xf;
57161                         unsigned rm = (instr >> 8) & 0xf;
57162                         // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
57163                         smultt(condition,
57164                                Register(rd),
57165                                Register(rn),
57166                                Register(rm));
57167                         if (((instr & 0xff0f0f0) != 0x16000e0)) {
57168                           UnpredictableA32(instr);
57169                         }
57170                         break;
57171                       }
57172                     }
57173                     break;
57174                   }
57175                 }
57176                 break;
57177               }
57178               case 0x01800000: {
57179                 // 0x01800000
57180                 switch (instr & 0x00400000) {
57181                   case 0x00000000: {
57182                     // 0x01800000
57183                     switch (instr & 0x00000fe0) {
57184                       case 0x00000060: {
57185                         // 0x01800060
57186                         if (((instr & 0xf0000000) == 0xf0000000)) {
57187                           UnallocatedA32(instr);
57188                           return;
57189                         }
57190                         Condition condition((instr >> 28) & 0xf);
57191                         unsigned rd = (instr >> 12) & 0xf;
57192                         unsigned rn = (instr >> 16) & 0xf;
57193                         unsigned rm = instr & 0xf;
57194                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
57195                         orr(condition,
57196                             Best,
57197                             Register(rd),
57198                             Register(rn),
57199                             Operand(Register(rm), RRX));
57200                         break;
57201                       }
57202                       default: {
57203                         if (((instr & 0xf0000000) == 0xf0000000) ||
57204                             ((instr & 0xfe0) == 0x60)) {
57205                           UnallocatedA32(instr);
57206                           return;
57207                         }
57208                         Condition condition((instr >> 28) & 0xf);
57209                         unsigned rd = (instr >> 12) & 0xf;
57210                         unsigned rn = (instr >> 16) & 0xf;
57211                         unsigned rm = instr & 0xf;
57212                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57213                                                             (instr >> 7) &
57214                                                                 0x1f);
57215                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
57216                         orr(condition,
57217                             Best,
57218                             Register(rd),
57219                             Register(rn),
57220                             Operand(Register(rm),
57221                                     shift_operand.GetType(),
57222                                     shift_operand.GetAmount()));
57223                         break;
57224                       }
57225                     }
57226                     break;
57227                   }
57228                   case 0x00400000: {
57229                     // 0x01c00000
57230                     switch (instr & 0x00000fe0) {
57231                       case 0x00000060: {
57232                         // 0x01c00060
57233                         if (((instr & 0xf0000000) == 0xf0000000)) {
57234                           UnallocatedA32(instr);
57235                           return;
57236                         }
57237                         Condition condition((instr >> 28) & 0xf);
57238                         unsigned rd = (instr >> 12) & 0xf;
57239                         unsigned rn = (instr >> 16) & 0xf;
57240                         unsigned rm = instr & 0xf;
57241                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
57242                         bic(condition,
57243                             Best,
57244                             Register(rd),
57245                             Register(rn),
57246                             Operand(Register(rm), RRX));
57247                         break;
57248                       }
57249                       default: {
57250                         if (((instr & 0xf0000000) == 0xf0000000) ||
57251                             ((instr & 0xfe0) == 0x60)) {
57252                           UnallocatedA32(instr);
57253                           return;
57254                         }
57255                         Condition condition((instr >> 28) & 0xf);
57256                         unsigned rd = (instr >> 12) & 0xf;
57257                         unsigned rn = (instr >> 16) & 0xf;
57258                         unsigned rm = instr & 0xf;
57259                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57260                                                             (instr >> 7) &
57261                                                                 0x1f);
57262                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
57263                         bic(condition,
57264                             Best,
57265                             Register(rd),
57266                             Register(rn),
57267                             Operand(Register(rm),
57268                                     shift_operand.GetType(),
57269                                     shift_operand.GetAmount()));
57270                         break;
57271                       }
57272                     }
57273                     break;
57274                   }
57275                 }
57276                 break;
57277               }
57278               case 0x01a00000: {
57279                 // 0x01a00000
57280                 switch (instr & 0x00400000) {
57281                   case 0x00000000: {
57282                     // 0x01a00000
57283                     switch (instr & 0x00000fe0) {
57284                       case 0x00000060: {
57285                         // 0x01a00060
57286                         if (((instr & 0xf0000000) == 0xf0000000)) {
57287                           UnallocatedA32(instr);
57288                           return;
57289                         }
57290                         if (((instr & 0xf0000000) != 0xf0000000)) {
57291                           Condition condition((instr >> 28) & 0xf);
57292                           unsigned rd = (instr >> 12) & 0xf;
57293                           unsigned rm = instr & 0xf;
57294                           // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
57295                           rrx(condition, Register(rd), Register(rm));
57296                           if (((instr & 0xfff0ff0) != 0x1a00060)) {
57297                             UnpredictableA32(instr);
57298                           }
57299                           return;
57300                         }
57301                         Condition condition((instr >> 28) & 0xf);
57302                         unsigned rd = (instr >> 12) & 0xf;
57303                         unsigned rm = instr & 0xf;
57304                         // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
57305                         mov(condition,
57306                             Best,
57307                             Register(rd),
57308                             Operand(Register(rm), RRX));
57309                         if (((instr & 0xfff0ff0) != 0x1a00060)) {
57310                           UnpredictableA32(instr);
57311                         }
57312                         break;
57313                       }
57314                       default: {
57315                         if (((instr & 0xf0000000) == 0xf0000000) ||
57316                             ((instr & 0xfe0) == 0x60)) {
57317                           UnallocatedA32(instr);
57318                           return;
57319                         }
57320                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57321                              Uint32(0x2)) &&
57322                             ((instr & 0xf0000000) != 0xf0000000)) {
57323                           Condition condition((instr >> 28) & 0xf);
57324                           unsigned rd = (instr >> 12) & 0xf;
57325                           unsigned rm = instr & 0xf;
57326                           uint32_t amount = (instr >> 7) & 0x1f;
57327                           if (amount == 0) amount = 32;
57328                           // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57329                           asr(condition,
57330                               Best,
57331                               Register(rd),
57332                               Register(rm),
57333                               amount);
57334                           if (((instr & 0xfff0070) != 0x1a00040)) {
57335                             UnpredictableA32(instr);
57336                           }
57337                           return;
57338                         }
57339                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57340                              Uint32(0x0)) &&
57341                             ((instr & 0xf0000000) != 0xf0000000) &&
57342                             ((instr & 0x00000f80) != 0x00000000)) {
57343                           Condition condition((instr >> 28) & 0xf);
57344                           unsigned rd = (instr >> 12) & 0xf;
57345                           unsigned rm = instr & 0xf;
57346                           uint32_t amount = (instr >> 7) & 0x1f;
57347                           // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57348                           lsl(condition,
57349                               Best,
57350                               Register(rd),
57351                               Register(rm),
57352                               amount);
57353                           if (((instr & 0xfff0070) != 0x1a00000)) {
57354                             UnpredictableA32(instr);
57355                           }
57356                           return;
57357                         }
57358                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57359                              Uint32(0x1)) &&
57360                             ((instr & 0xf0000000) != 0xf0000000)) {
57361                           Condition condition((instr >> 28) & 0xf);
57362                           unsigned rd = (instr >> 12) & 0xf;
57363                           unsigned rm = instr & 0xf;
57364                           uint32_t amount = (instr >> 7) & 0x1f;
57365                           if (amount == 0) amount = 32;
57366                           // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57367                           lsr(condition,
57368                               Best,
57369                               Register(rd),
57370                               Register(rm),
57371                               amount);
57372                           if (((instr & 0xfff0070) != 0x1a00020)) {
57373                             UnpredictableA32(instr);
57374                           }
57375                           return;
57376                         }
57377                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
57378                              Uint32(0x3)) &&
57379                             ((instr & 0xf0000000) != 0xf0000000) &&
57380                             ((instr & 0x00000f80) != 0x00000000)) {
57381                           Condition condition((instr >> 28) & 0xf);
57382                           unsigned rd = (instr >> 12) & 0xf;
57383                           unsigned rm = instr & 0xf;
57384                           uint32_t amount = (instr >> 7) & 0x1f;
57385                           // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
57386                           ror(condition,
57387                               Best,
57388                               Register(rd),
57389                               Register(rm),
57390                               amount);
57391                           if (((instr & 0xfff0070) != 0x1a00060)) {
57392                             UnpredictableA32(instr);
57393                           }
57394                           return;
57395                         }
57396                         Condition condition((instr >> 28) & 0xf);
57397                         unsigned rd = (instr >> 12) & 0xf;
57398                         unsigned rm = instr & 0xf;
57399                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57400                                                             (instr >> 7) &
57401                                                                 0x1f);
57402                         // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
57403                         mov(condition,
57404                             Best,
57405                             Register(rd),
57406                             Operand(Register(rm),
57407                                     shift_operand.GetType(),
57408                                     shift_operand.GetAmount()));
57409                         if (((instr & 0xfff0010) != 0x1a00000)) {
57410                           UnpredictableA32(instr);
57411                         }
57412                         break;
57413                       }
57414                     }
57415                     break;
57416                   }
57417                   case 0x00400000: {
57418                     // 0x01e00000
57419                     switch (instr & 0x00000fe0) {
57420                       case 0x00000060: {
57421                         // 0x01e00060
57422                         if (((instr & 0xf0000000) == 0xf0000000)) {
57423                           UnallocatedA32(instr);
57424                           return;
57425                         }
57426                         Condition condition((instr >> 28) & 0xf);
57427                         unsigned rd = (instr >> 12) & 0xf;
57428                         unsigned rm = instr & 0xf;
57429                         // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
57430                         mvn(condition,
57431                             Best,
57432                             Register(rd),
57433                             Operand(Register(rm), RRX));
57434                         if (((instr & 0xfff0ff0) != 0x1e00060)) {
57435                           UnpredictableA32(instr);
57436                         }
57437                         break;
57438                       }
57439                       default: {
57440                         if (((instr & 0xf0000000) == 0xf0000000) ||
57441                             ((instr & 0xfe0) == 0x60)) {
57442                           UnallocatedA32(instr);
57443                           return;
57444                         }
57445                         Condition condition((instr >> 28) & 0xf);
57446                         unsigned rd = (instr >> 12) & 0xf;
57447                         unsigned rm = instr & 0xf;
57448                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
57449                                                             (instr >> 7) &
57450                                                                 0x1f);
57451                         // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
57452                         mvn(condition,
57453                             Best,
57454                             Register(rd),
57455                             Operand(Register(rm),
57456                                     shift_operand.GetType(),
57457                                     shift_operand.GetAmount()));
57458                         if (((instr & 0xfff0010) != 0x1e00000)) {
57459                           UnpredictableA32(instr);
57460                         }
57461                         break;
57462                       }
57463                     }
57464                     break;
57465                   }
57466                 }
57467                 break;
57468               }
57469             }
57470             break;
57471           }
57472           case 0x00000010: {
57473             // 0x00000010
57474             switch (instr & 0x00400080) {
57475               case 0x00000000: {
57476                 // 0x00000010
57477                 switch (instr & 0x01a00000) {
57478                   case 0x00000000: {
57479                     // 0x00000010
57480                     if (((instr & 0xf0000000) == 0xf0000000)) {
57481                       UnallocatedA32(instr);
57482                       return;
57483                     }
57484                     Condition condition((instr >> 28) & 0xf);
57485                     unsigned rd = (instr >> 12) & 0xf;
57486                     unsigned rn = (instr >> 16) & 0xf;
57487                     unsigned rm = instr & 0xf;
57488                     Shift shift((instr >> 5) & 0x3);
57489                     unsigned rs = (instr >> 8) & 0xf;
57490                     // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57491                     and_(condition,
57492                          Best,
57493                          Register(rd),
57494                          Register(rn),
57495                          Operand(Register(rm), shift.GetType(), Register(rs)));
57496                     break;
57497                   }
57498                   case 0x00200000: {
57499                     // 0x00200010
57500                     if (((instr & 0xf0000000) == 0xf0000000)) {
57501                       UnallocatedA32(instr);
57502                       return;
57503                     }
57504                     Condition condition((instr >> 28) & 0xf);
57505                     unsigned rd = (instr >> 12) & 0xf;
57506                     unsigned rn = (instr >> 16) & 0xf;
57507                     unsigned rm = instr & 0xf;
57508                     Shift shift((instr >> 5) & 0x3);
57509                     unsigned rs = (instr >> 8) & 0xf;
57510                     // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57511                     eor(condition,
57512                         Best,
57513                         Register(rd),
57514                         Register(rn),
57515                         Operand(Register(rm), shift.GetType(), Register(rs)));
57516                     break;
57517                   }
57518                   case 0x00800000: {
57519                     // 0x00800010
57520                     if (((instr & 0xf0000000) == 0xf0000000)) {
57521                       UnallocatedA32(instr);
57522                       return;
57523                     }
57524                     Condition condition((instr >> 28) & 0xf);
57525                     unsigned rd = (instr >> 12) & 0xf;
57526                     unsigned rn = (instr >> 16) & 0xf;
57527                     unsigned rm = instr & 0xf;
57528                     Shift shift((instr >> 5) & 0x3);
57529                     unsigned rs = (instr >> 8) & 0xf;
57530                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57531                     add(condition,
57532                         Best,
57533                         Register(rd),
57534                         Register(rn),
57535                         Operand(Register(rm), shift.GetType(), Register(rs)));
57536                     break;
57537                   }
57538                   case 0x00a00000: {
57539                     // 0x00a00010
57540                     if (((instr & 0xf0000000) == 0xf0000000)) {
57541                       UnallocatedA32(instr);
57542                       return;
57543                     }
57544                     Condition condition((instr >> 28) & 0xf);
57545                     unsigned rd = (instr >> 12) & 0xf;
57546                     unsigned rn = (instr >> 16) & 0xf;
57547                     unsigned rm = instr & 0xf;
57548                     Shift shift((instr >> 5) & 0x3);
57549                     unsigned rs = (instr >> 8) & 0xf;
57550                     // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57551                     adc(condition,
57552                         Best,
57553                         Register(rd),
57554                         Register(rn),
57555                         Operand(Register(rm), shift.GetType(), Register(rs)));
57556                     break;
57557                   }
57558                   case 0x01000000: {
57559                     // 0x01000010
57560                     switch (instr & 0x00000060) {
57561                       case 0x00000040: {
57562                         // 0x01000050
57563                         if (((instr & 0xf0000000) == 0xf0000000)) {
57564                           UnallocatedA32(instr);
57565                           return;
57566                         }
57567                         Condition condition((instr >> 28) & 0xf);
57568                         unsigned rd = (instr >> 12) & 0xf;
57569                         unsigned rm = instr & 0xf;
57570                         unsigned rn = (instr >> 16) & 0xf;
57571                         // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57572                         qadd(condition,
57573                              Register(rd),
57574                              Register(rm),
57575                              Register(rn));
57576                         if (((instr & 0xff00ff0) != 0x1000050)) {
57577                           UnpredictableA32(instr);
57578                         }
57579                         break;
57580                       }
57581                       case 0x00000060: {
57582                         // 0x01000070
57583                         if (((instr & 0xf0000000) == 0xf0000000)) {
57584                           UnallocatedA32(instr);
57585                           return;
57586                         }
57587                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57588                         // HLT{<q>} {#}<imm> ; A1
57589                         hlt(al, imm);
57590                         break;
57591                       }
57592                       default:
57593                         UnallocatedA32(instr);
57594                         break;
57595                     }
57596                     break;
57597                   }
57598                   case 0x01200000: {
57599                     // 0x01200010
57600                     switch (instr & 0x00000060) {
57601                       case 0x00000000: {
57602                         // 0x01200010
57603                         if (((instr & 0xf0000000) == 0xf0000000)) {
57604                           UnallocatedA32(instr);
57605                           return;
57606                         }
57607                         Condition condition((instr >> 28) & 0xf);
57608                         unsigned rm = instr & 0xf;
57609                         // BX{<c>}{<q>} <Rm> ; A1
57610                         bx(condition, Register(rm));
57611                         if (((instr & 0xffffff0) != 0x12fff10)) {
57612                           UnpredictableA32(instr);
57613                         }
57614                         break;
57615                       }
57616                       case 0x00000020: {
57617                         // 0x01200030
57618                         if (((instr & 0xf0000000) == 0xf0000000)) {
57619                           UnallocatedA32(instr);
57620                           return;
57621                         }
57622                         Condition condition((instr >> 28) & 0xf);
57623                         unsigned rm = instr & 0xf;
57624                         // BLX{<c>}{<q>} <Rm> ; A1
57625                         blx(condition, Register(rm));
57626                         if (((instr & 0xffffff0) != 0x12fff30)) {
57627                           UnpredictableA32(instr);
57628                         }
57629                         break;
57630                       }
57631                       case 0x00000040: {
57632                         // 0x01200050
57633                         if (((instr & 0xf0000000) == 0xf0000000)) {
57634                           UnallocatedA32(instr);
57635                           return;
57636                         }
57637                         Condition condition((instr >> 28) & 0xf);
57638                         unsigned rd = (instr >> 12) & 0xf;
57639                         unsigned rm = instr & 0xf;
57640                         unsigned rn = (instr >> 16) & 0xf;
57641                         // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
57642                         qsub(condition,
57643                              Register(rd),
57644                              Register(rm),
57645                              Register(rn));
57646                         if (((instr & 0xff00ff0) != 0x1200050)) {
57647                           UnpredictableA32(instr);
57648                         }
57649                         break;
57650                       }
57651                       case 0x00000060: {
57652                         // 0x01200070
57653                         if (((instr & 0xf0000000) == 0xf0000000)) {
57654                           UnallocatedA32(instr);
57655                           return;
57656                         }
57657                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
57658                         // BKPT{<q>} {#}<imm> ; A1
57659                         bkpt(al, imm);
57660                         break;
57661                       }
57662                     }
57663                     break;
57664                   }
57665                   case 0x01800000: {
57666                     // 0x01800010
57667                     if (((instr & 0xf0000000) == 0xf0000000)) {
57668                       UnallocatedA32(instr);
57669                       return;
57670                     }
57671                     Condition condition((instr >> 28) & 0xf);
57672                     unsigned rd = (instr >> 12) & 0xf;
57673                     unsigned rn = (instr >> 16) & 0xf;
57674                     unsigned rm = instr & 0xf;
57675                     Shift shift((instr >> 5) & 0x3);
57676                     unsigned rs = (instr >> 8) & 0xf;
57677                     // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
57678                     orr(condition,
57679                         Best,
57680                         Register(rd),
57681                         Register(rn),
57682                         Operand(Register(rm), shift.GetType(), Register(rs)));
57683                     break;
57684                   }
57685                   case 0x01a00000: {
57686                     // 0x01a00010
57687                     if (((instr & 0xf0000000) == 0xf0000000)) {
57688                       UnallocatedA32(instr);
57689                       return;
57690                     }
57691                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
57692                         ((instr & 0xf0000000) != 0xf0000000)) {
57693                       Condition condition((instr >> 28) & 0xf);
57694                       unsigned rd = (instr >> 12) & 0xf;
57695                       unsigned rm = instr & 0xf;
57696                       unsigned rs = (instr >> 8) & 0xf;
57697                       // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57698                       asr(condition,
57699                           Best,
57700                           Register(rd),
57701                           Register(rm),
57702                           Register(rs));
57703                       if (((instr & 0xfff00f0) != 0x1a00050)) {
57704                         UnpredictableA32(instr);
57705                       }
57706                       return;
57707                     }
57708                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
57709                         ((instr & 0xf0000000) != 0xf0000000)) {
57710                       Condition condition((instr >> 28) & 0xf);
57711                       unsigned rd = (instr >> 12) & 0xf;
57712                       unsigned rm = instr & 0xf;
57713                       unsigned rs = (instr >> 8) & 0xf;
57714                       // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57715                       lsl(condition,
57716                           Best,
57717                           Register(rd),
57718                           Register(rm),
57719                           Register(rs));
57720                       if (((instr & 0xfff00f0) != 0x1a00010)) {
57721                         UnpredictableA32(instr);
57722                       }
57723                       return;
57724                     }
57725                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
57726                         ((instr & 0xf0000000) != 0xf0000000)) {
57727                       Condition condition((instr >> 28) & 0xf);
57728                       unsigned rd = (instr >> 12) & 0xf;
57729                       unsigned rm = instr & 0xf;
57730                       unsigned rs = (instr >> 8) & 0xf;
57731                       // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57732                       lsr(condition,
57733                           Best,
57734                           Register(rd),
57735                           Register(rm),
57736                           Register(rs));
57737                       if (((instr & 0xfff00f0) != 0x1a00030)) {
57738                         UnpredictableA32(instr);
57739                       }
57740                       return;
57741                     }
57742                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
57743                         ((instr & 0xf0000000) != 0xf0000000)) {
57744                       Condition condition((instr >> 28) & 0xf);
57745                       unsigned rd = (instr >> 12) & 0xf;
57746                       unsigned rm = instr & 0xf;
57747                       unsigned rs = (instr >> 8) & 0xf;
57748                       // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
57749                       ror(condition,
57750                           Best,
57751                           Register(rd),
57752                           Register(rm),
57753                           Register(rs));
57754                       if (((instr & 0xfff00f0) != 0x1a00070)) {
57755                         UnpredictableA32(instr);
57756                       }
57757                       return;
57758                     }
57759                     Condition condition((instr >> 28) & 0xf);
57760                     unsigned rd = (instr >> 12) & 0xf;
57761                     unsigned rm = instr & 0xf;
57762                     Shift shift((instr >> 5) & 0x3);
57763                     unsigned rs = (instr >> 8) & 0xf;
57764                     // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
57765                     mov(condition,
57766                         Best,
57767                         Register(rd),
57768                         Operand(Register(rm), shift.GetType(), Register(rs)));
57769                     if (((instr & 0xfff0090) != 0x1a00010)) {
57770                       UnpredictableA32(instr);
57771                     }
57772                     break;
57773                   }
57774                 }
57775                 break;
57776               }
57777               case 0x00000080: {
57778                 // 0x00000090
57779                 switch (instr & 0x01200060) {
57780                   case 0x00000000: {
57781                     // 0x00000090
57782                     switch (instr & 0x00800000) {
57783                       case 0x00000000: {
57784                         // 0x00000090
57785                         if (((instr & 0xf0000000) == 0xf0000000)) {
57786                           UnallocatedA32(instr);
57787                           return;
57788                         }
57789                         Condition condition((instr >> 28) & 0xf);
57790                         unsigned rd = (instr >> 16) & 0xf;
57791                         unsigned rn = instr & 0xf;
57792                         unsigned rm = (instr >> 8) & 0xf;
57793                         // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
57794                         mul(condition,
57795                             Best,
57796                             Register(rd),
57797                             Register(rn),
57798                             Register(rm));
57799                         if (((instr & 0xff0f0f0) != 0x90)) {
57800                           UnpredictableA32(instr);
57801                         }
57802                         break;
57803                       }
57804                       case 0x00800000: {
57805                         // 0x00800090
57806                         if (((instr & 0xf0000000) == 0xf0000000)) {
57807                           UnallocatedA32(instr);
57808                           return;
57809                         }
57810                         Condition condition((instr >> 28) & 0xf);
57811                         unsigned rdlo = (instr >> 12) & 0xf;
57812                         unsigned rdhi = (instr >> 16) & 0xf;
57813                         unsigned rn = instr & 0xf;
57814                         unsigned rm = (instr >> 8) & 0xf;
57815                         // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57816                         umull(condition,
57817                               Register(rdlo),
57818                               Register(rdhi),
57819                               Register(rn),
57820                               Register(rm));
57821                         break;
57822                       }
57823                     }
57824                     break;
57825                   }
57826                   case 0x00000020: {
57827                     // 0x000000b0
57828                     if (((instr & 0xf0000000) == 0xf0000000)) {
57829                       UnallocatedA32(instr);
57830                       return;
57831                     }
57832                     Condition condition((instr >> 28) & 0xf);
57833                     unsigned rt = (instr >> 12) & 0xf;
57834                     unsigned rn = (instr >> 16) & 0xf;
57835                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57836                     unsigned rm = instr & 0xf;
57837                     // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
57838                     strh(condition,
57839                          Best,
57840                          Register(rt),
57841                          MemOperand(Register(rn),
57842                                     sign,
57843                                     Register(rm),
57844                                     PostIndex));
57845                     if (((instr & 0xf700ff0) != 0xb0)) {
57846                       UnpredictableA32(instr);
57847                     }
57848                     break;
57849                   }
57850                   case 0x00000040: {
57851                     // 0x000000d0
57852                     if (((instr & 0xf0000000) == 0xf0000000)) {
57853                       UnallocatedA32(instr);
57854                       return;
57855                     }
57856                     Condition condition((instr >> 28) & 0xf);
57857                     unsigned rt = (instr >> 12) & 0xf;
57858                     unsigned rn = (instr >> 16) & 0xf;
57859                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57860                     unsigned rm = instr & 0xf;
57861                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
57862                     ldrd(condition,
57863                          Register(rt),
57864                          Register(rt + 1),
57865                          MemOperand(Register(rn),
57866                                     sign,
57867                                     Register(rm),
57868                                     PostIndex));
57869                     if (((instr & 0xf700ff0) != 0xd0)) {
57870                       UnpredictableA32(instr);
57871                     }
57872                     break;
57873                   }
57874                   case 0x00000060: {
57875                     // 0x000000f0
57876                     if (((instr & 0xf0000000) == 0xf0000000)) {
57877                       UnallocatedA32(instr);
57878                       return;
57879                     }
57880                     Condition condition((instr >> 28) & 0xf);
57881                     unsigned rt = (instr >> 12) & 0xf;
57882                     unsigned rn = (instr >> 16) & 0xf;
57883                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
57884                     unsigned rm = instr & 0xf;
57885                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
57886                     strd(condition,
57887                          Register(rt),
57888                          Register(rt + 1),
57889                          MemOperand(Register(rn),
57890                                     sign,
57891                                     Register(rm),
57892                                     PostIndex));
57893                     if (((instr & 0xf700ff0) != 0xf0)) {
57894                       UnpredictableA32(instr);
57895                     }
57896                     break;
57897                   }
57898                   case 0x00200000: {
57899                     // 0x00200090
57900                     switch (instr & 0x00800000) {
57901                       case 0x00000000: {
57902                         // 0x00200090
57903                         if (((instr & 0xf0000000) == 0xf0000000)) {
57904                           UnallocatedA32(instr);
57905                           return;
57906                         }
57907                         Condition condition((instr >> 28) & 0xf);
57908                         unsigned rd = (instr >> 16) & 0xf;
57909                         unsigned rn = instr & 0xf;
57910                         unsigned rm = (instr >> 8) & 0xf;
57911                         unsigned ra = (instr >> 12) & 0xf;
57912                         // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
57913                         mla(condition,
57914                             Register(rd),
57915                             Register(rn),
57916                             Register(rm),
57917                             Register(ra));
57918                         break;
57919                       }
57920                       case 0x00800000: {
57921                         // 0x00a00090
57922                         if (((instr & 0xf0000000) == 0xf0000000)) {
57923                           UnallocatedA32(instr);
57924                           return;
57925                         }
57926                         Condition condition((instr >> 28) & 0xf);
57927                         unsigned rdlo = (instr >> 12) & 0xf;
57928                         unsigned rdhi = (instr >> 16) & 0xf;
57929                         unsigned rn = instr & 0xf;
57930                         unsigned rm = (instr >> 8) & 0xf;
57931                         // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
57932                         umlal(condition,
57933                               Register(rdlo),
57934                               Register(rdhi),
57935                               Register(rn),
57936                               Register(rm));
57937                         break;
57938                       }
57939                     }
57940                     break;
57941                   }
57942                   case 0x00200020: {
57943                     // 0x002000b0
57944                     if (((instr & 0xf0000000) == 0xf0000000)) {
57945                       UnallocatedA32(instr);
57946                       return;
57947                     }
57948                     UnimplementedA32("STRHT", instr);
57949                     break;
57950                   }
57951                   case 0x01000000: {
57952                     // 0x01000090
57953                     switch (instr & 0x00800300) {
57954                       case 0x00800000: {
57955                         // 0x01800090
57956                         if (((instr & 0xf0000000) == 0xf0000000)) {
57957                           UnallocatedA32(instr);
57958                           return;
57959                         }
57960                         Condition condition((instr >> 28) & 0xf);
57961                         unsigned rt = instr & 0xf;
57962                         unsigned rn = (instr >> 16) & 0xf;
57963                         // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
57964                         stl(condition,
57965                             Register(rt),
57966                             MemOperand(Register(rn), Offset));
57967                         if (((instr & 0xff0fff0) != 0x180fc90)) {
57968                           UnpredictableA32(instr);
57969                         }
57970                         break;
57971                       }
57972                       case 0x00800200: {
57973                         // 0x01800290
57974                         if (((instr & 0xf0000000) == 0xf0000000)) {
57975                           UnallocatedA32(instr);
57976                           return;
57977                         }
57978                         Condition condition((instr >> 28) & 0xf);
57979                         unsigned rd = (instr >> 12) & 0xf;
57980                         unsigned rt = instr & 0xf;
57981                         unsigned rn = (instr >> 16) & 0xf;
57982                         // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
57983                         stlex(condition,
57984                               Register(rd),
57985                               Register(rt),
57986                               MemOperand(Register(rn), Offset));
57987                         if (((instr & 0xff00ff0) != 0x1800e90)) {
57988                           UnpredictableA32(instr);
57989                         }
57990                         break;
57991                       }
57992                       case 0x00800300: {
57993                         // 0x01800390
57994                         if (((instr & 0xf0000000) == 0xf0000000)) {
57995                           UnallocatedA32(instr);
57996                           return;
57997                         }
57998                         Condition condition((instr >> 28) & 0xf);
57999                         unsigned rd = (instr >> 12) & 0xf;
58000                         unsigned rt = instr & 0xf;
58001                         unsigned rn = (instr >> 16) & 0xf;
58002                         // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
58003                         strex(condition,
58004                               Register(rd),
58005                               Register(rt),
58006                               MemOperand(Register(rn), plus, 0, Offset));
58007                         if (((instr & 0xff00ff0) != 0x1800f90)) {
58008                           UnpredictableA32(instr);
58009                         }
58010                         break;
58011                       }
58012                       default:
58013                         UnallocatedA32(instr);
58014                         break;
58015                     }
58016                     break;
58017                   }
58018                   case 0x01000020: {
58019                     // 0x010000b0
58020                     if (((instr & 0xf0000000) == 0xf0000000)) {
58021                       UnallocatedA32(instr);
58022                       return;
58023                     }
58024                     Condition condition((instr >> 28) & 0xf);
58025                     unsigned rt = (instr >> 12) & 0xf;
58026                     unsigned rn = (instr >> 16) & 0xf;
58027                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58028                     unsigned rm = instr & 0xf;
58029                     AddrMode addrmode = Offset;
58030                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
58031                     strh(condition,
58032                          Best,
58033                          Register(rt),
58034                          MemOperand(Register(rn),
58035                                     sign,
58036                                     Register(rm),
58037                                     addrmode));
58038                     if (((instr & 0xf700ff0) != 0x10000b0)) {
58039                       UnpredictableA32(instr);
58040                     }
58041                     break;
58042                   }
58043                   case 0x01000040: {
58044                     // 0x010000d0
58045                     if (((instr & 0xf0000000) == 0xf0000000)) {
58046                       UnallocatedA32(instr);
58047                       return;
58048                     }
58049                     Condition condition((instr >> 28) & 0xf);
58050                     unsigned rt = (instr >> 12) & 0xf;
58051                     unsigned rn = (instr >> 16) & 0xf;
58052                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58053                     unsigned rm = instr & 0xf;
58054                     AddrMode addrmode = Offset;
58055                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
58056                     ldrd(condition,
58057                          Register(rt),
58058                          Register(rt + 1),
58059                          MemOperand(Register(rn),
58060                                     sign,
58061                                     Register(rm),
58062                                     addrmode));
58063                     if (((instr & 0xf700ff0) != 0x10000d0)) {
58064                       UnpredictableA32(instr);
58065                     }
58066                     break;
58067                   }
58068                   case 0x01000060: {
58069                     // 0x010000f0
58070                     if (((instr & 0xf0000000) == 0xf0000000)) {
58071                       UnallocatedA32(instr);
58072                       return;
58073                     }
58074                     Condition condition((instr >> 28) & 0xf);
58075                     unsigned rt = (instr >> 12) & 0xf;
58076                     unsigned rn = (instr >> 16) & 0xf;
58077                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58078                     unsigned rm = instr & 0xf;
58079                     AddrMode addrmode = Offset;
58080                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
58081                     strd(condition,
58082                          Register(rt),
58083                          Register(rt + 1),
58084                          MemOperand(Register(rn),
58085                                     sign,
58086                                     Register(rm),
58087                                     addrmode));
58088                     if (((instr & 0xf700ff0) != 0x10000f0)) {
58089                       UnpredictableA32(instr);
58090                     }
58091                     break;
58092                   }
58093                   case 0x01200000: {
58094                     // 0x01200090
58095                     switch (instr & 0x00800300) {
58096                       case 0x00800200: {
58097                         // 0x01a00290
58098                         if (((instr & 0xf0000000) == 0xf0000000)) {
58099                           UnallocatedA32(instr);
58100                           return;
58101                         }
58102                         Condition condition((instr >> 28) & 0xf);
58103                         unsigned rd = (instr >> 12) & 0xf;
58104                         unsigned rt = instr & 0xf;
58105                         unsigned rn = (instr >> 16) & 0xf;
58106                         // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
58107                         stlexd(condition,
58108                                Register(rd),
58109                                Register(rt),
58110                                Register(rt + 1),
58111                                MemOperand(Register(rn), Offset));
58112                         if (((instr & 0xff00ff0) != 0x1a00e90)) {
58113                           UnpredictableA32(instr);
58114                         }
58115                         break;
58116                       }
58117                       case 0x00800300: {
58118                         // 0x01a00390
58119                         if (((instr & 0xf0000000) == 0xf0000000)) {
58120                           UnallocatedA32(instr);
58121                           return;
58122                         }
58123                         Condition condition((instr >> 28) & 0xf);
58124                         unsigned rd = (instr >> 12) & 0xf;
58125                         unsigned rt = instr & 0xf;
58126                         unsigned rn = (instr >> 16) & 0xf;
58127                         // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
58128                         strexd(condition,
58129                                Register(rd),
58130                                Register(rt),
58131                                Register(rt + 1),
58132                                MemOperand(Register(rn), Offset));
58133                         if (((instr & 0xff00ff0) != 0x1a00f90)) {
58134                           UnpredictableA32(instr);
58135                         }
58136                         break;
58137                       }
58138                       default:
58139                         UnallocatedA32(instr);
58140                         break;
58141                     }
58142                     break;
58143                   }
58144                   case 0x01200020: {
58145                     // 0x012000b0
58146                     if (((instr & 0xf0000000) == 0xf0000000)) {
58147                       UnallocatedA32(instr);
58148                       return;
58149                     }
58150                     Condition condition((instr >> 28) & 0xf);
58151                     unsigned rt = (instr >> 12) & 0xf;
58152                     unsigned rn = (instr >> 16) & 0xf;
58153                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58154                     unsigned rm = instr & 0xf;
58155                     AddrMode addrmode = PreIndex;
58156                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
58157                     strh(condition,
58158                          Best,
58159                          Register(rt),
58160                          MemOperand(Register(rn),
58161                                     sign,
58162                                     Register(rm),
58163                                     addrmode));
58164                     if (((instr & 0xf700ff0) != 0x12000b0)) {
58165                       UnpredictableA32(instr);
58166                     }
58167                     break;
58168                   }
58169                   case 0x01200040: {
58170                     // 0x012000d0
58171                     if (((instr & 0xf0000000) == 0xf0000000)) {
58172                       UnallocatedA32(instr);
58173                       return;
58174                     }
58175                     Condition condition((instr >> 28) & 0xf);
58176                     unsigned rt = (instr >> 12) & 0xf;
58177                     unsigned rn = (instr >> 16) & 0xf;
58178                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58179                     unsigned rm = instr & 0xf;
58180                     AddrMode addrmode = PreIndex;
58181                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
58182                     ldrd(condition,
58183                          Register(rt),
58184                          Register(rt + 1),
58185                          MemOperand(Register(rn),
58186                                     sign,
58187                                     Register(rm),
58188                                     addrmode));
58189                     if (((instr & 0xf700ff0) != 0x12000d0)) {
58190                       UnpredictableA32(instr);
58191                     }
58192                     break;
58193                   }
58194                   case 0x01200060: {
58195                     // 0x012000f0
58196                     if (((instr & 0xf0000000) == 0xf0000000)) {
58197                       UnallocatedA32(instr);
58198                       return;
58199                     }
58200                     Condition condition((instr >> 28) & 0xf);
58201                     unsigned rt = (instr >> 12) & 0xf;
58202                     unsigned rn = (instr >> 16) & 0xf;
58203                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
58204                     unsigned rm = instr & 0xf;
58205                     AddrMode addrmode = PreIndex;
58206                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
58207                     strd(condition,
58208                          Register(rt),
58209                          Register(rt + 1),
58210                          MemOperand(Register(rn),
58211                                     sign,
58212                                     Register(rm),
58213                                     addrmode));
58214                     if (((instr & 0xf700ff0) != 0x12000f0)) {
58215                       UnpredictableA32(instr);
58216                     }
58217                     break;
58218                   }
58219                   default:
58220                     UnallocatedA32(instr);
58221                     break;
58222                 }
58223                 break;
58224               }
58225               case 0x00400000: {
58226                 // 0x00400010
58227                 switch (instr & 0x01a00000) {
58228                   case 0x00000000: {
58229                     // 0x00400010
58230                     if (((instr & 0xf0000000) == 0xf0000000)) {
58231                       UnallocatedA32(instr);
58232                       return;
58233                     }
58234                     Condition condition((instr >> 28) & 0xf);
58235                     unsigned rd = (instr >> 12) & 0xf;
58236                     unsigned rn = (instr >> 16) & 0xf;
58237                     unsigned rm = instr & 0xf;
58238                     Shift shift((instr >> 5) & 0x3);
58239                     unsigned rs = (instr >> 8) & 0xf;
58240                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58241                     sub(condition,
58242                         Best,
58243                         Register(rd),
58244                         Register(rn),
58245                         Operand(Register(rm), shift.GetType(), Register(rs)));
58246                     break;
58247                   }
58248                   case 0x00200000: {
58249                     // 0x00600010
58250                     if (((instr & 0xf0000000) == 0xf0000000)) {
58251                       UnallocatedA32(instr);
58252                       return;
58253                     }
58254                     Condition condition((instr >> 28) & 0xf);
58255                     unsigned rd = (instr >> 12) & 0xf;
58256                     unsigned rn = (instr >> 16) & 0xf;
58257                     unsigned rm = instr & 0xf;
58258                     Shift shift((instr >> 5) & 0x3);
58259                     unsigned rs = (instr >> 8) & 0xf;
58260                     // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58261                     rsb(condition,
58262                         Best,
58263                         Register(rd),
58264                         Register(rn),
58265                         Operand(Register(rm), shift.GetType(), Register(rs)));
58266                     break;
58267                   }
58268                   case 0x00800000: {
58269                     // 0x00c00010
58270                     if (((instr & 0xf0000000) == 0xf0000000)) {
58271                       UnallocatedA32(instr);
58272                       return;
58273                     }
58274                     Condition condition((instr >> 28) & 0xf);
58275                     unsigned rd = (instr >> 12) & 0xf;
58276                     unsigned rn = (instr >> 16) & 0xf;
58277                     unsigned rm = instr & 0xf;
58278                     Shift shift((instr >> 5) & 0x3);
58279                     unsigned rs = (instr >> 8) & 0xf;
58280                     // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58281                     sbc(condition,
58282                         Best,
58283                         Register(rd),
58284                         Register(rn),
58285                         Operand(Register(rm), shift.GetType(), Register(rs)));
58286                     break;
58287                   }
58288                   case 0x00a00000: {
58289                     // 0x00e00010
58290                     if (((instr & 0xf0000000) == 0xf0000000)) {
58291                       UnallocatedA32(instr);
58292                       return;
58293                     }
58294                     Condition condition((instr >> 28) & 0xf);
58295                     unsigned rd = (instr >> 12) & 0xf;
58296                     unsigned rn = (instr >> 16) & 0xf;
58297                     unsigned rm = instr & 0xf;
58298                     Shift shift((instr >> 5) & 0x3);
58299                     unsigned rs = (instr >> 8) & 0xf;
58300                     // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58301                     rsc(condition,
58302                         Register(rd),
58303                         Register(rn),
58304                         Operand(Register(rm), shift.GetType(), Register(rs)));
58305                     break;
58306                   }
58307                   case 0x01000000: {
58308                     // 0x01400010
58309                     switch (instr & 0x00000060) {
58310                       case 0x00000040: {
58311                         // 0x01400050
58312                         if (((instr & 0xf0000000) == 0xf0000000)) {
58313                           UnallocatedA32(instr);
58314                           return;
58315                         }
58316                         Condition condition((instr >> 28) & 0xf);
58317                         unsigned rd = (instr >> 12) & 0xf;
58318                         unsigned rm = instr & 0xf;
58319                         unsigned rn = (instr >> 16) & 0xf;
58320                         // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
58321                         qdadd(condition,
58322                               Register(rd),
58323                               Register(rm),
58324                               Register(rn));
58325                         if (((instr & 0xff00ff0) != 0x1400050)) {
58326                           UnpredictableA32(instr);
58327                         }
58328                         break;
58329                       }
58330                       case 0x00000060: {
58331                         // 0x01400070
58332                         if (((instr & 0xf0000000) == 0xf0000000)) {
58333                           UnallocatedA32(instr);
58334                           return;
58335                         }
58336                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
58337                         // HVC{<q>} {#}<imm16> ; A1
58338                         hvc(al, imm);
58339                         break;
58340                       }
58341                       default:
58342                         UnallocatedA32(instr);
58343                         break;
58344                     }
58345                     break;
58346                   }
58347                   case 0x01200000: {
58348                     // 0x01600010
58349                     switch (instr & 0x00000060) {
58350                       case 0x00000000: {
58351                         // 0x01600010
58352                         if (((instr & 0xf0000000) == 0xf0000000)) {
58353                           UnallocatedA32(instr);
58354                           return;
58355                         }
58356                         Condition condition((instr >> 28) & 0xf);
58357                         unsigned rd = (instr >> 12) & 0xf;
58358                         unsigned rm = instr & 0xf;
58359                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
58360                         clz(condition, Register(rd), Register(rm));
58361                         if (((instr & 0xfff0ff0) != 0x16f0f10)) {
58362                           UnpredictableA32(instr);
58363                         }
58364                         break;
58365                       }
58366                       case 0x00000040: {
58367                         // 0x01600050
58368                         if (((instr & 0xf0000000) == 0xf0000000)) {
58369                           UnallocatedA32(instr);
58370                           return;
58371                         }
58372                         Condition condition((instr >> 28) & 0xf);
58373                         unsigned rd = (instr >> 12) & 0xf;
58374                         unsigned rm = instr & 0xf;
58375                         unsigned rn = (instr >> 16) & 0xf;
58376                         // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
58377                         qdsub(condition,
58378                               Register(rd),
58379                               Register(rm),
58380                               Register(rn));
58381                         if (((instr & 0xff00ff0) != 0x1600050)) {
58382                           UnpredictableA32(instr);
58383                         }
58384                         break;
58385                       }
58386                       case 0x00000060: {
58387                         // 0x01600070
58388                         if (((instr & 0xf0000000) == 0xf0000000)) {
58389                           UnallocatedA32(instr);
58390                           return;
58391                         }
58392                         UnimplementedA32("SMC", instr);
58393                         break;
58394                       }
58395                       default:
58396                         UnallocatedA32(instr);
58397                         break;
58398                     }
58399                     break;
58400                   }
58401                   case 0x01800000: {
58402                     // 0x01c00010
58403                     if (((instr & 0xf0000000) == 0xf0000000)) {
58404                       UnallocatedA32(instr);
58405                       return;
58406                     }
58407                     Condition condition((instr >> 28) & 0xf);
58408                     unsigned rd = (instr >> 12) & 0xf;
58409                     unsigned rn = (instr >> 16) & 0xf;
58410                     unsigned rm = instr & 0xf;
58411                     Shift shift((instr >> 5) & 0x3);
58412                     unsigned rs = (instr >> 8) & 0xf;
58413                     // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
58414                     bic(condition,
58415                         Best,
58416                         Register(rd),
58417                         Register(rn),
58418                         Operand(Register(rm), shift.GetType(), Register(rs)));
58419                     break;
58420                   }
58421                   case 0x01a00000: {
58422                     // 0x01e00010
58423                     if (((instr & 0xf0000000) == 0xf0000000)) {
58424                       UnallocatedA32(instr);
58425                       return;
58426                     }
58427                     Condition condition((instr >> 28) & 0xf);
58428                     unsigned rd = (instr >> 12) & 0xf;
58429                     unsigned rm = instr & 0xf;
58430                     Shift shift((instr >> 5) & 0x3);
58431                     unsigned rs = (instr >> 8) & 0xf;
58432                     // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
58433                     mvn(condition,
58434                         Best,
58435                         Register(rd),
58436                         Operand(Register(rm), shift.GetType(), Register(rs)));
58437                     if (((instr & 0xfff0090) != 0x1e00010)) {
58438                       UnpredictableA32(instr);
58439                     }
58440                     break;
58441                   }
58442                 }
58443                 break;
58444               }
58445               case 0x00400080: {
58446                 // 0x00400090
58447                 switch (instr & 0x00000060) {
58448                   case 0x00000000: {
58449                     // 0x00400090
58450                     switch (instr & 0x01a00000) {
58451                       case 0x00000000: {
58452                         // 0x00400090
58453                         if (((instr & 0xf0000000) == 0xf0000000)) {
58454                           UnallocatedA32(instr);
58455                           return;
58456                         }
58457                         Condition condition((instr >> 28) & 0xf);
58458                         unsigned rdlo = (instr >> 12) & 0xf;
58459                         unsigned rdhi = (instr >> 16) & 0xf;
58460                         unsigned rn = instr & 0xf;
58461                         unsigned rm = (instr >> 8) & 0xf;
58462                         // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58463                         umaal(condition,
58464                               Register(rdlo),
58465                               Register(rdhi),
58466                               Register(rn),
58467                               Register(rm));
58468                         break;
58469                       }
58470                       case 0x00200000: {
58471                         // 0x00600090
58472                         if (((instr & 0xf0000000) == 0xf0000000)) {
58473                           UnallocatedA32(instr);
58474                           return;
58475                         }
58476                         Condition condition((instr >> 28) & 0xf);
58477                         unsigned rd = (instr >> 16) & 0xf;
58478                         unsigned rn = instr & 0xf;
58479                         unsigned rm = (instr >> 8) & 0xf;
58480                         unsigned ra = (instr >> 12) & 0xf;
58481                         // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
58482                         mls(condition,
58483                             Register(rd),
58484                             Register(rn),
58485                             Register(rm),
58486                             Register(ra));
58487                         break;
58488                       }
58489                       case 0x00800000: {
58490                         // 0x00c00090
58491                         if (((instr & 0xf0000000) == 0xf0000000)) {
58492                           UnallocatedA32(instr);
58493                           return;
58494                         }
58495                         Condition condition((instr >> 28) & 0xf);
58496                         unsigned rdlo = (instr >> 12) & 0xf;
58497                         unsigned rdhi = (instr >> 16) & 0xf;
58498                         unsigned rn = instr & 0xf;
58499                         unsigned rm = (instr >> 8) & 0xf;
58500                         // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58501                         smull(condition,
58502                               Register(rdlo),
58503                               Register(rdhi),
58504                               Register(rn),
58505                               Register(rm));
58506                         break;
58507                       }
58508                       case 0x00a00000: {
58509                         // 0x00e00090
58510                         if (((instr & 0xf0000000) == 0xf0000000)) {
58511                           UnallocatedA32(instr);
58512                           return;
58513                         }
58514                         Condition condition((instr >> 28) & 0xf);
58515                         unsigned rdlo = (instr >> 12) & 0xf;
58516                         unsigned rdhi = (instr >> 16) & 0xf;
58517                         unsigned rn = instr & 0xf;
58518                         unsigned rm = (instr >> 8) & 0xf;
58519                         // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
58520                         smlal(condition,
58521                               Register(rdlo),
58522                               Register(rdhi),
58523                               Register(rn),
58524                               Register(rm));
58525                         break;
58526                       }
58527                       case 0x01800000: {
58528                         // 0x01c00090
58529                         switch (instr & 0x00000300) {
58530                           case 0x00000000: {
58531                             // 0x01c00090
58532                             if (((instr & 0xf0000000) == 0xf0000000)) {
58533                               UnallocatedA32(instr);
58534                               return;
58535                             }
58536                             Condition condition((instr >> 28) & 0xf);
58537                             unsigned rt = instr & 0xf;
58538                             unsigned rn = (instr >> 16) & 0xf;
58539                             // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
58540                             stlb(condition,
58541                                  Register(rt),
58542                                  MemOperand(Register(rn), Offset));
58543                             if (((instr & 0xff0fff0) != 0x1c0fc90)) {
58544                               UnpredictableA32(instr);
58545                             }
58546                             break;
58547                           }
58548                           case 0x00000200: {
58549                             // 0x01c00290
58550                             if (((instr & 0xf0000000) == 0xf0000000)) {
58551                               UnallocatedA32(instr);
58552                               return;
58553                             }
58554                             Condition condition((instr >> 28) & 0xf);
58555                             unsigned rd = (instr >> 12) & 0xf;
58556                             unsigned rt = instr & 0xf;
58557                             unsigned rn = (instr >> 16) & 0xf;
58558                             // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58559                             stlexb(condition,
58560                                    Register(rd),
58561                                    Register(rt),
58562                                    MemOperand(Register(rn), Offset));
58563                             if (((instr & 0xff00ff0) != 0x1c00e90)) {
58564                               UnpredictableA32(instr);
58565                             }
58566                             break;
58567                           }
58568                           case 0x00000300: {
58569                             // 0x01c00390
58570                             if (((instr & 0xf0000000) == 0xf0000000)) {
58571                               UnallocatedA32(instr);
58572                               return;
58573                             }
58574                             Condition condition((instr >> 28) & 0xf);
58575                             unsigned rd = (instr >> 12) & 0xf;
58576                             unsigned rt = instr & 0xf;
58577                             unsigned rn = (instr >> 16) & 0xf;
58578                             // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58579                             strexb(condition,
58580                                    Register(rd),
58581                                    Register(rt),
58582                                    MemOperand(Register(rn), Offset));
58583                             if (((instr & 0xff00ff0) != 0x1c00f90)) {
58584                               UnpredictableA32(instr);
58585                             }
58586                             break;
58587                           }
58588                           default:
58589                             UnallocatedA32(instr);
58590                             break;
58591                         }
58592                         break;
58593                       }
58594                       case 0x01a00000: {
58595                         // 0x01e00090
58596                         switch (instr & 0x00000300) {
58597                           case 0x00000000: {
58598                             // 0x01e00090
58599                             if (((instr & 0xf0000000) == 0xf0000000)) {
58600                               UnallocatedA32(instr);
58601                               return;
58602                             }
58603                             Condition condition((instr >> 28) & 0xf);
58604                             unsigned rt = instr & 0xf;
58605                             unsigned rn = (instr >> 16) & 0xf;
58606                             // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
58607                             stlh(condition,
58608                                  Register(rt),
58609                                  MemOperand(Register(rn), Offset));
58610                             if (((instr & 0xff0fff0) != 0x1e0fc90)) {
58611                               UnpredictableA32(instr);
58612                             }
58613                             break;
58614                           }
58615                           case 0x00000200: {
58616                             // 0x01e00290
58617                             if (((instr & 0xf0000000) == 0xf0000000)) {
58618                               UnallocatedA32(instr);
58619                               return;
58620                             }
58621                             Condition condition((instr >> 28) & 0xf);
58622                             unsigned rd = (instr >> 12) & 0xf;
58623                             unsigned rt = instr & 0xf;
58624                             unsigned rn = (instr >> 16) & 0xf;
58625                             // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58626                             stlexh(condition,
58627                                    Register(rd),
58628                                    Register(rt),
58629                                    MemOperand(Register(rn), Offset));
58630                             if (((instr & 0xff00ff0) != 0x1e00e90)) {
58631                               UnpredictableA32(instr);
58632                             }
58633                             break;
58634                           }
58635                           case 0x00000300: {
58636                             // 0x01e00390
58637                             if (((instr & 0xf0000000) == 0xf0000000)) {
58638                               UnallocatedA32(instr);
58639                               return;
58640                             }
58641                             Condition condition((instr >> 28) & 0xf);
58642                             unsigned rd = (instr >> 12) & 0xf;
58643                             unsigned rt = instr & 0xf;
58644                             unsigned rn = (instr >> 16) & 0xf;
58645                             // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
58646                             strexh(condition,
58647                                    Register(rd),
58648                                    Register(rt),
58649                                    MemOperand(Register(rn), Offset));
58650                             if (((instr & 0xff00ff0) != 0x1e00f90)) {
58651                               UnpredictableA32(instr);
58652                             }
58653                             break;
58654                           }
58655                           default:
58656                             UnallocatedA32(instr);
58657                             break;
58658                         }
58659                         break;
58660                       }
58661                       default:
58662                         UnallocatedA32(instr);
58663                         break;
58664                     }
58665                     break;
58666                   }
58667                   case 0x00000020: {
58668                     // 0x004000b0
58669                     switch (instr & 0x01200000) {
58670                       case 0x00000000: {
58671                         // 0x004000b0
58672                         if (((instr & 0xf0000000) == 0xf0000000)) {
58673                           UnallocatedA32(instr);
58674                           return;
58675                         }
58676                         Condition condition((instr >> 28) & 0xf);
58677                         unsigned rt = (instr >> 12) & 0xf;
58678                         unsigned rn = (instr >> 16) & 0xf;
58679                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58680                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58681                         // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
58682                         strh(condition,
58683                              Best,
58684                              Register(rt),
58685                              MemOperand(Register(rn), sign, offset, PostIndex));
58686                         break;
58687                       }
58688                       case 0x00200000: {
58689                         // 0x006000b0
58690                         if (((instr & 0xf0000000) == 0xf0000000)) {
58691                           UnallocatedA32(instr);
58692                           return;
58693                         }
58694                         UnimplementedA32("STRHT", instr);
58695                         break;
58696                       }
58697                       case 0x01000000: {
58698                         // 0x014000b0
58699                         if (((instr & 0xf0000000) == 0xf0000000)) {
58700                           UnallocatedA32(instr);
58701                           return;
58702                         }
58703                         Condition condition((instr >> 28) & 0xf);
58704                         unsigned rt = (instr >> 12) & 0xf;
58705                         unsigned rn = (instr >> 16) & 0xf;
58706                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58707                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58708                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
58709                         strh(condition,
58710                              Best,
58711                              Register(rt),
58712                              MemOperand(Register(rn), sign, offset, Offset));
58713                         break;
58714                       }
58715                       case 0x01200000: {
58716                         // 0x016000b0
58717                         if (((instr & 0xf0000000) == 0xf0000000)) {
58718                           UnallocatedA32(instr);
58719                           return;
58720                         }
58721                         Condition condition((instr >> 28) & 0xf);
58722                         unsigned rt = (instr >> 12) & 0xf;
58723                         unsigned rn = (instr >> 16) & 0xf;
58724                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58725                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58726                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
58727                         strh(condition,
58728                              Best,
58729                              Register(rt),
58730                              MemOperand(Register(rn), sign, offset, PreIndex));
58731                         break;
58732                       }
58733                     }
58734                     break;
58735                   }
58736                   case 0x00000040: {
58737                     // 0x004000d0
58738                     switch (instr & 0x000f0000) {
58739                       case 0x000f0000: {
58740                         // 0x004f00d0
58741                         if (((instr & 0xf0000000) == 0xf0000000)) {
58742                           UnallocatedA32(instr);
58743                           return;
58744                         }
58745                         Condition condition((instr >> 28) & 0xf);
58746                         unsigned rt = (instr >> 12) & 0xf;
58747                         uint32_t U = (instr >> 23) & 0x1;
58748                         int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
58749                         if (U == 0) imm = -imm;
58750                         bool minus_zero = (imm == 0) && (U == 0);
58751                         Label label(imm, kA32PcDelta, minus_zero);
58752                         // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
58753                         ldrd(condition, Register(rt), Register(rt + 1), &label);
58754                         if (((instr & 0xf7f00f0) != 0x14f00d0)) {
58755                           UnpredictableA32(instr);
58756                         }
58757                         break;
58758                       }
58759                       default: {
58760                         switch (instr & 0x01200000) {
58761                           case 0x00000000: {
58762                             // 0x004000d0
58763                             if (((instr & 0xf0000000) == 0xf0000000) ||
58764                                 ((instr & 0xf0000) == 0xf0000)) {
58765                               UnallocatedA32(instr);
58766                               return;
58767                             }
58768                             Condition condition((instr >> 28) & 0xf);
58769                             unsigned rt = (instr >> 12) & 0xf;
58770                             unsigned rn = (instr >> 16) & 0xf;
58771                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58772                                                                    : plus);
58773                             int32_t offset =
58774                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
58775                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58776                             ldrd(condition,
58777                                  Register(rt),
58778                                  Register(rt + 1),
58779                                  MemOperand(Register(rn),
58780                                             sign,
58781                                             offset,
58782                                             PostIndex));
58783                             break;
58784                           }
58785                           case 0x01000000: {
58786                             // 0x014000d0
58787                             if (((instr & 0xf0000000) == 0xf0000000) ||
58788                                 ((instr & 0xf0000) == 0xf0000)) {
58789                               UnallocatedA32(instr);
58790                               return;
58791                             }
58792                             Condition condition((instr >> 28) & 0xf);
58793                             unsigned rt = (instr >> 12) & 0xf;
58794                             unsigned rn = (instr >> 16) & 0xf;
58795                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58796                                                                    : plus);
58797                             int32_t offset =
58798                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
58799                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58800                             ldrd(condition,
58801                                  Register(rt),
58802                                  Register(rt + 1),
58803                                  MemOperand(Register(rn),
58804                                             sign,
58805                                             offset,
58806                                             Offset));
58807                             break;
58808                           }
58809                           case 0x01200000: {
58810                             // 0x016000d0
58811                             if (((instr & 0xf0000000) == 0xf0000000) ||
58812                                 ((instr & 0xf0000) == 0xf0000)) {
58813                               UnallocatedA32(instr);
58814                               return;
58815                             }
58816                             Condition condition((instr >> 28) & 0xf);
58817                             unsigned rt = (instr >> 12) & 0xf;
58818                             unsigned rn = (instr >> 16) & 0xf;
58819                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
58820                                                                    : plus);
58821                             int32_t offset =
58822                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
58823                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58824                             ldrd(condition,
58825                                  Register(rt),
58826                                  Register(rt + 1),
58827                                  MemOperand(Register(rn),
58828                                             sign,
58829                                             offset,
58830                                             PreIndex));
58831                             break;
58832                           }
58833                           default:
58834                             UnallocatedA32(instr);
58835                             break;
58836                         }
58837                         break;
58838                       }
58839                     }
58840                     break;
58841                   }
58842                   case 0x00000060: {
58843                     // 0x004000f0
58844                     switch (instr & 0x01200000) {
58845                       case 0x00000000: {
58846                         // 0x004000f0
58847                         if (((instr & 0xf0000000) == 0xf0000000)) {
58848                           UnallocatedA32(instr);
58849                           return;
58850                         }
58851                         Condition condition((instr >> 28) & 0xf);
58852                         unsigned rt = (instr >> 12) & 0xf;
58853                         unsigned rn = (instr >> 16) & 0xf;
58854                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58855                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58856                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
58857                         strd(condition,
58858                              Register(rt),
58859                              Register(rt + 1),
58860                              MemOperand(Register(rn), sign, offset, PostIndex));
58861                         break;
58862                       }
58863                       case 0x01000000: {
58864                         // 0x014000f0
58865                         if (((instr & 0xf0000000) == 0xf0000000)) {
58866                           UnallocatedA32(instr);
58867                           return;
58868                         }
58869                         Condition condition((instr >> 28) & 0xf);
58870                         unsigned rt = (instr >> 12) & 0xf;
58871                         unsigned rn = (instr >> 16) & 0xf;
58872                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58873                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58874                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
58875                         strd(condition,
58876                              Register(rt),
58877                              Register(rt + 1),
58878                              MemOperand(Register(rn), sign, offset, Offset));
58879                         break;
58880                       }
58881                       case 0x01200000: {
58882                         // 0x016000f0
58883                         if (((instr & 0xf0000000) == 0xf0000000)) {
58884                           UnallocatedA32(instr);
58885                           return;
58886                         }
58887                         Condition condition((instr >> 28) & 0xf);
58888                         unsigned rt = (instr >> 12) & 0xf;
58889                         unsigned rn = (instr >> 16) & 0xf;
58890                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
58891                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
58892                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
58893                         strd(condition,
58894                              Register(rt),
58895                              Register(rt + 1),
58896                              MemOperand(Register(rn), sign, offset, PreIndex));
58897                         break;
58898                       }
58899                       default:
58900                         UnallocatedA32(instr);
58901                         break;
58902                     }
58903                     break;
58904                   }
58905                 }
58906                 break;
58907               }
58908             }
58909             break;
58910           }
58911           case 0x00100000: {
58912             // 0x00100000
58913             switch (instr & 0x01e00000) {
58914               case 0x00000000: {
58915                 // 0x00100000
58916                 switch (instr & 0x00000fe0) {
58917                   case 0x00000060: {
58918                     // 0x00100060
58919                     if (((instr & 0xf0000000) == 0xf0000000)) {
58920                       UnallocatedA32(instr);
58921                       return;
58922                     }
58923                     Condition condition((instr >> 28) & 0xf);
58924                     unsigned rd = (instr >> 12) & 0xf;
58925                     unsigned rn = (instr >> 16) & 0xf;
58926                     unsigned rm = instr & 0xf;
58927                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58928                     ands(condition,
58929                          Best,
58930                          Register(rd),
58931                          Register(rn),
58932                          Operand(Register(rm), RRX));
58933                     break;
58934                   }
58935                   default: {
58936                     if (((instr & 0xf0000000) == 0xf0000000) ||
58937                         ((instr & 0xfe0) == 0x60)) {
58938                       UnallocatedA32(instr);
58939                       return;
58940                     }
58941                     Condition condition((instr >> 28) & 0xf);
58942                     unsigned rd = (instr >> 12) & 0xf;
58943                     unsigned rn = (instr >> 16) & 0xf;
58944                     unsigned rm = instr & 0xf;
58945                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58946                                                         (instr >> 7) & 0x1f);
58947                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58948                     ands(condition,
58949                          Best,
58950                          Register(rd),
58951                          Register(rn),
58952                          Operand(Register(rm),
58953                                  shift_operand.GetType(),
58954                                  shift_operand.GetAmount()));
58955                     break;
58956                   }
58957                 }
58958                 break;
58959               }
58960               case 0x00200000: {
58961                 // 0x00300000
58962                 switch (instr & 0x00000fe0) {
58963                   case 0x00000060: {
58964                     // 0x00300060
58965                     if (((instr & 0xf0000000) == 0xf0000000)) {
58966                       UnallocatedA32(instr);
58967                       return;
58968                     }
58969                     Condition condition((instr >> 28) & 0xf);
58970                     unsigned rd = (instr >> 12) & 0xf;
58971                     unsigned rn = (instr >> 16) & 0xf;
58972                     unsigned rm = instr & 0xf;
58973                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
58974                     eors(condition,
58975                          Best,
58976                          Register(rd),
58977                          Register(rn),
58978                          Operand(Register(rm), RRX));
58979                     break;
58980                   }
58981                   default: {
58982                     if (((instr & 0xf0000000) == 0xf0000000) ||
58983                         ((instr & 0xfe0) == 0x60)) {
58984                       UnallocatedA32(instr);
58985                       return;
58986                     }
58987                     Condition condition((instr >> 28) & 0xf);
58988                     unsigned rd = (instr >> 12) & 0xf;
58989                     unsigned rn = (instr >> 16) & 0xf;
58990                     unsigned rm = instr & 0xf;
58991                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
58992                                                         (instr >> 7) & 0x1f);
58993                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
58994                     eors(condition,
58995                          Best,
58996                          Register(rd),
58997                          Register(rn),
58998                          Operand(Register(rm),
58999                                  shift_operand.GetType(),
59000                                  shift_operand.GetAmount()));
59001                     break;
59002                   }
59003                 }
59004                 break;
59005               }
59006               case 0x00400000: {
59007                 // 0x00500000
59008                 switch (instr & 0x000f0000) {
59009                   case 0x000d0000: {
59010                     // 0x005d0000
59011                     switch (instr & 0x00000fe0) {
59012                       case 0x00000060: {
59013                         // 0x005d0060
59014                         if (((instr & 0xf0000000) == 0xf0000000)) {
59015                           UnallocatedA32(instr);
59016                           return;
59017                         }
59018                         Condition condition((instr >> 28) & 0xf);
59019                         unsigned rd = (instr >> 12) & 0xf;
59020                         unsigned rm = instr & 0xf;
59021                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
59022                         subs(condition,
59023                              Best,
59024                              Register(rd),
59025                              sp,
59026                              Operand(Register(rm), RRX));
59027                         break;
59028                       }
59029                       default: {
59030                         if (((instr & 0xf0000000) == 0xf0000000) ||
59031                             ((instr & 0xfe0) == 0x60)) {
59032                           UnallocatedA32(instr);
59033                           return;
59034                         }
59035                         Condition condition((instr >> 28) & 0xf);
59036                         unsigned rd = (instr >> 12) & 0xf;
59037                         unsigned rm = instr & 0xf;
59038                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59039                                                             (instr >> 7) &
59040                                                                 0x1f);
59041                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59042                         subs(condition,
59043                              Best,
59044                              Register(rd),
59045                              sp,
59046                              Operand(Register(rm),
59047                                      shift_operand.GetType(),
59048                                      shift_operand.GetAmount()));
59049                         break;
59050                       }
59051                     }
59052                     break;
59053                   }
59054                   default: {
59055                     switch (instr & 0x00000fe0) {
59056                       case 0x00000060: {
59057                         // 0x00500060
59058                         if (((instr & 0xf0000000) == 0xf0000000) ||
59059                             ((instr & 0xf0000) == 0xd0000)) {
59060                           UnallocatedA32(instr);
59061                           return;
59062                         }
59063                         Condition condition((instr >> 28) & 0xf);
59064                         unsigned rd = (instr >> 12) & 0xf;
59065                         unsigned rn = (instr >> 16) & 0xf;
59066                         unsigned rm = instr & 0xf;
59067                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59068                         subs(condition,
59069                              Best,
59070                              Register(rd),
59071                              Register(rn),
59072                              Operand(Register(rm), RRX));
59073                         break;
59074                       }
59075                       default: {
59076                         if (((instr & 0xf0000000) == 0xf0000000) ||
59077                             ((instr & 0xf0000) == 0xd0000) ||
59078                             ((instr & 0xfe0) == 0x60)) {
59079                           UnallocatedA32(instr);
59080                           return;
59081                         }
59082                         Condition condition((instr >> 28) & 0xf);
59083                         unsigned rd = (instr >> 12) & 0xf;
59084                         unsigned rn = (instr >> 16) & 0xf;
59085                         unsigned rm = instr & 0xf;
59086                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59087                                                             (instr >> 7) &
59088                                                                 0x1f);
59089                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59090                         subs(condition,
59091                              Best,
59092                              Register(rd),
59093                              Register(rn),
59094                              Operand(Register(rm),
59095                                      shift_operand.GetType(),
59096                                      shift_operand.GetAmount()));
59097                         break;
59098                       }
59099                     }
59100                     break;
59101                   }
59102                 }
59103                 break;
59104               }
59105               case 0x00600000: {
59106                 // 0x00700000
59107                 switch (instr & 0x00000fe0) {
59108                   case 0x00000060: {
59109                     // 0x00700060
59110                     if (((instr & 0xf0000000) == 0xf0000000)) {
59111                       UnallocatedA32(instr);
59112                       return;
59113                     }
59114                     Condition condition((instr >> 28) & 0xf);
59115                     unsigned rd = (instr >> 12) & 0xf;
59116                     unsigned rn = (instr >> 16) & 0xf;
59117                     unsigned rm = instr & 0xf;
59118                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59119                     rsbs(condition,
59120                          Best,
59121                          Register(rd),
59122                          Register(rn),
59123                          Operand(Register(rm), RRX));
59124                     break;
59125                   }
59126                   default: {
59127                     if (((instr & 0xf0000000) == 0xf0000000) ||
59128                         ((instr & 0xfe0) == 0x60)) {
59129                       UnallocatedA32(instr);
59130                       return;
59131                     }
59132                     Condition condition((instr >> 28) & 0xf);
59133                     unsigned rd = (instr >> 12) & 0xf;
59134                     unsigned rn = (instr >> 16) & 0xf;
59135                     unsigned rm = instr & 0xf;
59136                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59137                                                         (instr >> 7) & 0x1f);
59138                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59139                     rsbs(condition,
59140                          Best,
59141                          Register(rd),
59142                          Register(rn),
59143                          Operand(Register(rm),
59144                                  shift_operand.GetType(),
59145                                  shift_operand.GetAmount()));
59146                     break;
59147                   }
59148                 }
59149                 break;
59150               }
59151               case 0x00800000: {
59152                 // 0x00900000
59153                 switch (instr & 0x000f0000) {
59154                   case 0x000d0000: {
59155                     // 0x009d0000
59156                     switch (instr & 0x00000fe0) {
59157                       case 0x00000060: {
59158                         // 0x009d0060
59159                         if (((instr & 0xf0000000) == 0xf0000000)) {
59160                           UnallocatedA32(instr);
59161                           return;
59162                         }
59163                         Condition condition((instr >> 28) & 0xf);
59164                         unsigned rd = (instr >> 12) & 0xf;
59165                         unsigned rm = instr & 0xf;
59166                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
59167                         adds(condition,
59168                              Best,
59169                              Register(rd),
59170                              sp,
59171                              Operand(Register(rm), RRX));
59172                         break;
59173                       }
59174                       default: {
59175                         if (((instr & 0xf0000000) == 0xf0000000) ||
59176                             ((instr & 0xfe0) == 0x60)) {
59177                           UnallocatedA32(instr);
59178                           return;
59179                         }
59180                         Condition condition((instr >> 28) & 0xf);
59181                         unsigned rd = (instr >> 12) & 0xf;
59182                         unsigned rm = instr & 0xf;
59183                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59184                                                             (instr >> 7) &
59185                                                                 0x1f);
59186                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59187                         adds(condition,
59188                              Best,
59189                              Register(rd),
59190                              sp,
59191                              Operand(Register(rm),
59192                                      shift_operand.GetType(),
59193                                      shift_operand.GetAmount()));
59194                         break;
59195                       }
59196                     }
59197                     break;
59198                   }
59199                   default: {
59200                     switch (instr & 0x00000fe0) {
59201                       case 0x00000060: {
59202                         // 0x00900060
59203                         if (((instr & 0xf0000000) == 0xf0000000) ||
59204                             ((instr & 0xf0000) == 0xd0000)) {
59205                           UnallocatedA32(instr);
59206                           return;
59207                         }
59208                         Condition condition((instr >> 28) & 0xf);
59209                         unsigned rd = (instr >> 12) & 0xf;
59210                         unsigned rn = (instr >> 16) & 0xf;
59211                         unsigned rm = instr & 0xf;
59212                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59213                         adds(condition,
59214                              Best,
59215                              Register(rd),
59216                              Register(rn),
59217                              Operand(Register(rm), RRX));
59218                         break;
59219                       }
59220                       default: {
59221                         if (((instr & 0xf0000000) == 0xf0000000) ||
59222                             ((instr & 0xf0000) == 0xd0000) ||
59223                             ((instr & 0xfe0) == 0x60)) {
59224                           UnallocatedA32(instr);
59225                           return;
59226                         }
59227                         Condition condition((instr >> 28) & 0xf);
59228                         unsigned rd = (instr >> 12) & 0xf;
59229                         unsigned rn = (instr >> 16) & 0xf;
59230                         unsigned rm = instr & 0xf;
59231                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59232                                                             (instr >> 7) &
59233                                                                 0x1f);
59234                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59235                         adds(condition,
59236                              Best,
59237                              Register(rd),
59238                              Register(rn),
59239                              Operand(Register(rm),
59240                                      shift_operand.GetType(),
59241                                      shift_operand.GetAmount()));
59242                         break;
59243                       }
59244                     }
59245                     break;
59246                   }
59247                 }
59248                 break;
59249               }
59250               case 0x00a00000: {
59251                 // 0x00b00000
59252                 switch (instr & 0x00000fe0) {
59253                   case 0x00000060: {
59254                     // 0x00b00060
59255                     if (((instr & 0xf0000000) == 0xf0000000)) {
59256                       UnallocatedA32(instr);
59257                       return;
59258                     }
59259                     Condition condition((instr >> 28) & 0xf);
59260                     unsigned rd = (instr >> 12) & 0xf;
59261                     unsigned rn = (instr >> 16) & 0xf;
59262                     unsigned rm = instr & 0xf;
59263                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59264                     adcs(condition,
59265                          Best,
59266                          Register(rd),
59267                          Register(rn),
59268                          Operand(Register(rm), RRX));
59269                     break;
59270                   }
59271                   default: {
59272                     if (((instr & 0xf0000000) == 0xf0000000) ||
59273                         ((instr & 0xfe0) == 0x60)) {
59274                       UnallocatedA32(instr);
59275                       return;
59276                     }
59277                     Condition condition((instr >> 28) & 0xf);
59278                     unsigned rd = (instr >> 12) & 0xf;
59279                     unsigned rn = (instr >> 16) & 0xf;
59280                     unsigned rm = instr & 0xf;
59281                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59282                                                         (instr >> 7) & 0x1f);
59283                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59284                     adcs(condition,
59285                          Best,
59286                          Register(rd),
59287                          Register(rn),
59288                          Operand(Register(rm),
59289                                  shift_operand.GetType(),
59290                                  shift_operand.GetAmount()));
59291                     break;
59292                   }
59293                 }
59294                 break;
59295               }
59296               case 0x00c00000: {
59297                 // 0x00d00000
59298                 switch (instr & 0x00000fe0) {
59299                   case 0x00000060: {
59300                     // 0x00d00060
59301                     if (((instr & 0xf0000000) == 0xf0000000)) {
59302                       UnallocatedA32(instr);
59303                       return;
59304                     }
59305                     Condition condition((instr >> 28) & 0xf);
59306                     unsigned rd = (instr >> 12) & 0xf;
59307                     unsigned rn = (instr >> 16) & 0xf;
59308                     unsigned rm = instr & 0xf;
59309                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59310                     sbcs(condition,
59311                          Best,
59312                          Register(rd),
59313                          Register(rn),
59314                          Operand(Register(rm), RRX));
59315                     break;
59316                   }
59317                   default: {
59318                     if (((instr & 0xf0000000) == 0xf0000000) ||
59319                         ((instr & 0xfe0) == 0x60)) {
59320                       UnallocatedA32(instr);
59321                       return;
59322                     }
59323                     Condition condition((instr >> 28) & 0xf);
59324                     unsigned rd = (instr >> 12) & 0xf;
59325                     unsigned rn = (instr >> 16) & 0xf;
59326                     unsigned rm = instr & 0xf;
59327                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59328                                                         (instr >> 7) & 0x1f);
59329                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59330                     sbcs(condition,
59331                          Best,
59332                          Register(rd),
59333                          Register(rn),
59334                          Operand(Register(rm),
59335                                  shift_operand.GetType(),
59336                                  shift_operand.GetAmount()));
59337                     break;
59338                   }
59339                 }
59340                 break;
59341               }
59342               case 0x00e00000: {
59343                 // 0x00f00000
59344                 switch (instr & 0x00000fe0) {
59345                   case 0x00000060: {
59346                     // 0x00f00060
59347                     if (((instr & 0xf0000000) == 0xf0000000)) {
59348                       UnallocatedA32(instr);
59349                       return;
59350                     }
59351                     Condition condition((instr >> 28) & 0xf);
59352                     unsigned rd = (instr >> 12) & 0xf;
59353                     unsigned rn = (instr >> 16) & 0xf;
59354                     unsigned rm = instr & 0xf;
59355                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59356                     rscs(condition,
59357                          Register(rd),
59358                          Register(rn),
59359                          Operand(Register(rm), RRX));
59360                     break;
59361                   }
59362                   default: {
59363                     if (((instr & 0xf0000000) == 0xf0000000) ||
59364                         ((instr & 0xfe0) == 0x60)) {
59365                       UnallocatedA32(instr);
59366                       return;
59367                     }
59368                     Condition condition((instr >> 28) & 0xf);
59369                     unsigned rd = (instr >> 12) & 0xf;
59370                     unsigned rn = (instr >> 16) & 0xf;
59371                     unsigned rm = instr & 0xf;
59372                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59373                                                         (instr >> 7) & 0x1f);
59374                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59375                     rscs(condition,
59376                          Register(rd),
59377                          Register(rn),
59378                          Operand(Register(rm),
59379                                  shift_operand.GetType(),
59380                                  shift_operand.GetAmount()));
59381                     break;
59382                   }
59383                 }
59384                 break;
59385               }
59386               case 0x01000000: {
59387                 // 0x01100000
59388                 switch (instr & 0x00000fe0) {
59389                   case 0x00000060: {
59390                     // 0x01100060
59391                     if (((instr & 0xf0000000) == 0xf0000000)) {
59392                       UnallocatedA32(instr);
59393                       return;
59394                     }
59395                     Condition condition((instr >> 28) & 0xf);
59396                     unsigned rn = (instr >> 16) & 0xf;
59397                     unsigned rm = instr & 0xf;
59398                     // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59399                     tst(condition,
59400                         Best,
59401                         Register(rn),
59402                         Operand(Register(rm), RRX));
59403                     if (((instr & 0xff0fff0) != 0x1100060)) {
59404                       UnpredictableA32(instr);
59405                     }
59406                     break;
59407                   }
59408                   default: {
59409                     if (((instr & 0xf0000000) == 0xf0000000) ||
59410                         ((instr & 0xfe0) == 0x60)) {
59411                       UnallocatedA32(instr);
59412                       return;
59413                     }
59414                     Condition condition((instr >> 28) & 0xf);
59415                     unsigned rn = (instr >> 16) & 0xf;
59416                     unsigned rm = instr & 0xf;
59417                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59418                                                         (instr >> 7) & 0x1f);
59419                     // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59420                     tst(condition,
59421                         Best,
59422                         Register(rn),
59423                         Operand(Register(rm),
59424                                 shift_operand.GetType(),
59425                                 shift_operand.GetAmount()));
59426                     if (((instr & 0xff0f010) != 0x1100000)) {
59427                       UnpredictableA32(instr);
59428                     }
59429                     break;
59430                   }
59431                 }
59432                 break;
59433               }
59434               case 0x01200000: {
59435                 // 0x01300000
59436                 switch (instr & 0x00000fe0) {
59437                   case 0x00000060: {
59438                     // 0x01300060
59439                     if (((instr & 0xf0000000) == 0xf0000000)) {
59440                       UnallocatedA32(instr);
59441                       return;
59442                     }
59443                     Condition condition((instr >> 28) & 0xf);
59444                     unsigned rn = (instr >> 16) & 0xf;
59445                     unsigned rm = instr & 0xf;
59446                     // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59447                     teq(condition, Register(rn), Operand(Register(rm), RRX));
59448                     if (((instr & 0xff0fff0) != 0x1300060)) {
59449                       UnpredictableA32(instr);
59450                     }
59451                     break;
59452                   }
59453                   default: {
59454                     if (((instr & 0xf0000000) == 0xf0000000) ||
59455                         ((instr & 0xfe0) == 0x60)) {
59456                       UnallocatedA32(instr);
59457                       return;
59458                     }
59459                     Condition condition((instr >> 28) & 0xf);
59460                     unsigned rn = (instr >> 16) & 0xf;
59461                     unsigned rm = instr & 0xf;
59462                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59463                                                         (instr >> 7) & 0x1f);
59464                     // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59465                     teq(condition,
59466                         Register(rn),
59467                         Operand(Register(rm),
59468                                 shift_operand.GetType(),
59469                                 shift_operand.GetAmount()));
59470                     if (((instr & 0xff0f010) != 0x1300000)) {
59471                       UnpredictableA32(instr);
59472                     }
59473                     break;
59474                   }
59475                 }
59476                 break;
59477               }
59478               case 0x01400000: {
59479                 // 0x01500000
59480                 switch (instr & 0x00000fe0) {
59481                   case 0x00000060: {
59482                     // 0x01500060
59483                     if (((instr & 0xf0000000) == 0xf0000000)) {
59484                       UnallocatedA32(instr);
59485                       return;
59486                     }
59487                     Condition condition((instr >> 28) & 0xf);
59488                     unsigned rn = (instr >> 16) & 0xf;
59489                     unsigned rm = instr & 0xf;
59490                     // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59491                     cmp(condition,
59492                         Best,
59493                         Register(rn),
59494                         Operand(Register(rm), RRX));
59495                     if (((instr & 0xff0fff0) != 0x1500060)) {
59496                       UnpredictableA32(instr);
59497                     }
59498                     break;
59499                   }
59500                   default: {
59501                     if (((instr & 0xf0000000) == 0xf0000000) ||
59502                         ((instr & 0xfe0) == 0x60)) {
59503                       UnallocatedA32(instr);
59504                       return;
59505                     }
59506                     Condition condition((instr >> 28) & 0xf);
59507                     unsigned rn = (instr >> 16) & 0xf;
59508                     unsigned rm = instr & 0xf;
59509                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59510                                                         (instr >> 7) & 0x1f);
59511                     // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59512                     cmp(condition,
59513                         Best,
59514                         Register(rn),
59515                         Operand(Register(rm),
59516                                 shift_operand.GetType(),
59517                                 shift_operand.GetAmount()));
59518                     if (((instr & 0xff0f010) != 0x1500000)) {
59519                       UnpredictableA32(instr);
59520                     }
59521                     break;
59522                   }
59523                 }
59524                 break;
59525               }
59526               case 0x01600000: {
59527                 // 0x01700000
59528                 switch (instr & 0x00000fe0) {
59529                   case 0x00000060: {
59530                     // 0x01700060
59531                     if (((instr & 0xf0000000) == 0xf0000000)) {
59532                       UnallocatedA32(instr);
59533                       return;
59534                     }
59535                     Condition condition((instr >> 28) & 0xf);
59536                     unsigned rn = (instr >> 16) & 0xf;
59537                     unsigned rm = instr & 0xf;
59538                     // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
59539                     cmn(condition,
59540                         Best,
59541                         Register(rn),
59542                         Operand(Register(rm), RRX));
59543                     if (((instr & 0xff0fff0) != 0x1700060)) {
59544                       UnpredictableA32(instr);
59545                     }
59546                     break;
59547                   }
59548                   default: {
59549                     if (((instr & 0xf0000000) == 0xf0000000) ||
59550                         ((instr & 0xfe0) == 0x60)) {
59551                       UnallocatedA32(instr);
59552                       return;
59553                     }
59554                     Condition condition((instr >> 28) & 0xf);
59555                     unsigned rn = (instr >> 16) & 0xf;
59556                     unsigned rm = instr & 0xf;
59557                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59558                                                         (instr >> 7) & 0x1f);
59559                     // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
59560                     cmn(condition,
59561                         Best,
59562                         Register(rn),
59563                         Operand(Register(rm),
59564                                 shift_operand.GetType(),
59565                                 shift_operand.GetAmount()));
59566                     if (((instr & 0xff0f010) != 0x1700000)) {
59567                       UnpredictableA32(instr);
59568                     }
59569                     break;
59570                   }
59571                 }
59572                 break;
59573               }
59574               case 0x01800000: {
59575                 // 0x01900000
59576                 switch (instr & 0x00000fe0) {
59577                   case 0x00000060: {
59578                     // 0x01900060
59579                     if (((instr & 0xf0000000) == 0xf0000000)) {
59580                       UnallocatedA32(instr);
59581                       return;
59582                     }
59583                     Condition condition((instr >> 28) & 0xf);
59584                     unsigned rd = (instr >> 12) & 0xf;
59585                     unsigned rn = (instr >> 16) & 0xf;
59586                     unsigned rm = instr & 0xf;
59587                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59588                     orrs(condition,
59589                          Best,
59590                          Register(rd),
59591                          Register(rn),
59592                          Operand(Register(rm), RRX));
59593                     break;
59594                   }
59595                   default: {
59596                     if (((instr & 0xf0000000) == 0xf0000000) ||
59597                         ((instr & 0xfe0) == 0x60)) {
59598                       UnallocatedA32(instr);
59599                       return;
59600                     }
59601                     Condition condition((instr >> 28) & 0xf);
59602                     unsigned rd = (instr >> 12) & 0xf;
59603                     unsigned rn = (instr >> 16) & 0xf;
59604                     unsigned rm = instr & 0xf;
59605                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59606                                                         (instr >> 7) & 0x1f);
59607                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59608                     orrs(condition,
59609                          Best,
59610                          Register(rd),
59611                          Register(rn),
59612                          Operand(Register(rm),
59613                                  shift_operand.GetType(),
59614                                  shift_operand.GetAmount()));
59615                     break;
59616                   }
59617                 }
59618                 break;
59619               }
59620               case 0x01a00000: {
59621                 // 0x01b00000
59622                 switch (instr & 0x00000fe0) {
59623                   case 0x00000060: {
59624                     // 0x01b00060
59625                     if (((instr & 0xf0000000) == 0xf0000000)) {
59626                       UnallocatedA32(instr);
59627                       return;
59628                     }
59629                     if (((instr & 0xf0000000) != 0xf0000000)) {
59630                       Condition condition((instr >> 28) & 0xf);
59631                       unsigned rd = (instr >> 12) & 0xf;
59632                       unsigned rm = instr & 0xf;
59633                       // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
59634                       rrxs(condition, Register(rd), Register(rm));
59635                       if (((instr & 0xfff0ff0) != 0x1b00060)) {
59636                         UnpredictableA32(instr);
59637                       }
59638                       return;
59639                     }
59640                     Condition condition((instr >> 28) & 0xf);
59641                     unsigned rd = (instr >> 12) & 0xf;
59642                     unsigned rm = instr & 0xf;
59643                     // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59644                     movs(condition,
59645                          Best,
59646                          Register(rd),
59647                          Operand(Register(rm), RRX));
59648                     if (((instr & 0xfff0ff0) != 0x1b00060)) {
59649                       UnpredictableA32(instr);
59650                     }
59651                     break;
59652                   }
59653                   default: {
59654                     if (((instr & 0xf0000000) == 0xf0000000) ||
59655                         ((instr & 0xfe0) == 0x60)) {
59656                       UnallocatedA32(instr);
59657                       return;
59658                     }
59659                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59660                         ((instr & 0xf0000000) != 0xf0000000)) {
59661                       Condition condition((instr >> 28) & 0xf);
59662                       unsigned rd = (instr >> 12) & 0xf;
59663                       unsigned rm = instr & 0xf;
59664                       uint32_t amount = (instr >> 7) & 0x1f;
59665                       if (amount == 0) amount = 32;
59666                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59667                       asrs(condition, Best, Register(rd), Register(rm), amount);
59668                       if (((instr & 0xfff0070) != 0x1b00040)) {
59669                         UnpredictableA32(instr);
59670                       }
59671                       return;
59672                     }
59673                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
59674                         ((instr & 0xf0000000) != 0xf0000000) &&
59675                         ((instr & 0x00000f80) != 0x00000000)) {
59676                       Condition condition((instr >> 28) & 0xf);
59677                       unsigned rd = (instr >> 12) & 0xf;
59678                       unsigned rm = instr & 0xf;
59679                       uint32_t amount = (instr >> 7) & 0x1f;
59680                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59681                       lsls(condition, Best, Register(rd), Register(rm), amount);
59682                       if (((instr & 0xfff0070) != 0x1b00000)) {
59683                         UnpredictableA32(instr);
59684                       }
59685                       return;
59686                     }
59687                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
59688                         ((instr & 0xf0000000) != 0xf0000000)) {
59689                       Condition condition((instr >> 28) & 0xf);
59690                       unsigned rd = (instr >> 12) & 0xf;
59691                       unsigned rm = instr & 0xf;
59692                       uint32_t amount = (instr >> 7) & 0x1f;
59693                       if (amount == 0) amount = 32;
59694                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59695                       lsrs(condition, Best, Register(rd), Register(rm), amount);
59696                       if (((instr & 0xfff0070) != 0x1b00020)) {
59697                         UnpredictableA32(instr);
59698                       }
59699                       return;
59700                     }
59701                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
59702                         ((instr & 0xf0000000) != 0xf0000000) &&
59703                         ((instr & 0x00000f80) != 0x00000000)) {
59704                       Condition condition((instr >> 28) & 0xf);
59705                       unsigned rd = (instr >> 12) & 0xf;
59706                       unsigned rm = instr & 0xf;
59707                       uint32_t amount = (instr >> 7) & 0x1f;
59708                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
59709                       rors(condition, Best, Register(rd), Register(rm), amount);
59710                       if (((instr & 0xfff0070) != 0x1b00060)) {
59711                         UnpredictableA32(instr);
59712                       }
59713                       return;
59714                     }
59715                     Condition condition((instr >> 28) & 0xf);
59716                     unsigned rd = (instr >> 12) & 0xf;
59717                     unsigned rm = instr & 0xf;
59718                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59719                                                         (instr >> 7) & 0x1f);
59720                     // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59721                     movs(condition,
59722                          Best,
59723                          Register(rd),
59724                          Operand(Register(rm),
59725                                  shift_operand.GetType(),
59726                                  shift_operand.GetAmount()));
59727                     if (((instr & 0xfff0010) != 0x1b00000)) {
59728                       UnpredictableA32(instr);
59729                     }
59730                     break;
59731                   }
59732                 }
59733                 break;
59734               }
59735               case 0x01c00000: {
59736                 // 0x01d00000
59737                 switch (instr & 0x00000fe0) {
59738                   case 0x00000060: {
59739                     // 0x01d00060
59740                     if (((instr & 0xf0000000) == 0xf0000000)) {
59741                       UnallocatedA32(instr);
59742                       return;
59743                     }
59744                     Condition condition((instr >> 28) & 0xf);
59745                     unsigned rd = (instr >> 12) & 0xf;
59746                     unsigned rn = (instr >> 16) & 0xf;
59747                     unsigned rm = instr & 0xf;
59748                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
59749                     bics(condition,
59750                          Best,
59751                          Register(rd),
59752                          Register(rn),
59753                          Operand(Register(rm), RRX));
59754                     break;
59755                   }
59756                   default: {
59757                     if (((instr & 0xf0000000) == 0xf0000000) ||
59758                         ((instr & 0xfe0) == 0x60)) {
59759                       UnallocatedA32(instr);
59760                       return;
59761                     }
59762                     Condition condition((instr >> 28) & 0xf);
59763                     unsigned rd = (instr >> 12) & 0xf;
59764                     unsigned rn = (instr >> 16) & 0xf;
59765                     unsigned rm = instr & 0xf;
59766                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59767                                                         (instr >> 7) & 0x1f);
59768                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
59769                     bics(condition,
59770                          Best,
59771                          Register(rd),
59772                          Register(rn),
59773                          Operand(Register(rm),
59774                                  shift_operand.GetType(),
59775                                  shift_operand.GetAmount()));
59776                     break;
59777                   }
59778                 }
59779                 break;
59780               }
59781               case 0x01e00000: {
59782                 // 0x01f00000
59783                 switch (instr & 0x00000fe0) {
59784                   case 0x00000060: {
59785                     // 0x01f00060
59786                     if (((instr & 0xf0000000) == 0xf0000000)) {
59787                       UnallocatedA32(instr);
59788                       return;
59789                     }
59790                     Condition condition((instr >> 28) & 0xf);
59791                     unsigned rd = (instr >> 12) & 0xf;
59792                     unsigned rm = instr & 0xf;
59793                     // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
59794                     mvns(condition,
59795                          Best,
59796                          Register(rd),
59797                          Operand(Register(rm), RRX));
59798                     if (((instr & 0xfff0ff0) != 0x1f00060)) {
59799                       UnpredictableA32(instr);
59800                     }
59801                     break;
59802                   }
59803                   default: {
59804                     if (((instr & 0xf0000000) == 0xf0000000) ||
59805                         ((instr & 0xfe0) == 0x60)) {
59806                       UnallocatedA32(instr);
59807                       return;
59808                     }
59809                     Condition condition((instr >> 28) & 0xf);
59810                     unsigned rd = (instr >> 12) & 0xf;
59811                     unsigned rm = instr & 0xf;
59812                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
59813                                                         (instr >> 7) & 0x1f);
59814                     // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
59815                     mvns(condition,
59816                          Best,
59817                          Register(rd),
59818                          Operand(Register(rm),
59819                                  shift_operand.GetType(),
59820                                  shift_operand.GetAmount()));
59821                     if (((instr & 0xfff0010) != 0x1f00000)) {
59822                       UnpredictableA32(instr);
59823                     }
59824                     break;
59825                   }
59826                 }
59827                 break;
59828               }
59829             }
59830             break;
59831           }
59832           case 0x00100010: {
59833             // 0x00100010
59834             switch (instr & 0x00400080) {
59835               case 0x00000000: {
59836                 // 0x00100010
59837                 switch (instr & 0x01a00000) {
59838                   case 0x00000000: {
59839                     // 0x00100010
59840                     if (((instr & 0xf0000000) == 0xf0000000)) {
59841                       UnallocatedA32(instr);
59842                       return;
59843                     }
59844                     Condition condition((instr >> 28) & 0xf);
59845                     unsigned rd = (instr >> 12) & 0xf;
59846                     unsigned rn = (instr >> 16) & 0xf;
59847                     unsigned rm = instr & 0xf;
59848                     Shift shift((instr >> 5) & 0x3);
59849                     unsigned rs = (instr >> 8) & 0xf;
59850                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59851                     ands(condition,
59852                          Best,
59853                          Register(rd),
59854                          Register(rn),
59855                          Operand(Register(rm), shift.GetType(), Register(rs)));
59856                     break;
59857                   }
59858                   case 0x00200000: {
59859                     // 0x00300010
59860                     if (((instr & 0xf0000000) == 0xf0000000)) {
59861                       UnallocatedA32(instr);
59862                       return;
59863                     }
59864                     Condition condition((instr >> 28) & 0xf);
59865                     unsigned rd = (instr >> 12) & 0xf;
59866                     unsigned rn = (instr >> 16) & 0xf;
59867                     unsigned rm = instr & 0xf;
59868                     Shift shift((instr >> 5) & 0x3);
59869                     unsigned rs = (instr >> 8) & 0xf;
59870                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59871                     eors(condition,
59872                          Best,
59873                          Register(rd),
59874                          Register(rn),
59875                          Operand(Register(rm), shift.GetType(), Register(rs)));
59876                     break;
59877                   }
59878                   case 0x00800000: {
59879                     // 0x00900010
59880                     if (((instr & 0xf0000000) == 0xf0000000)) {
59881                       UnallocatedA32(instr);
59882                       return;
59883                     }
59884                     Condition condition((instr >> 28) & 0xf);
59885                     unsigned rd = (instr >> 12) & 0xf;
59886                     unsigned rn = (instr >> 16) & 0xf;
59887                     unsigned rm = instr & 0xf;
59888                     Shift shift((instr >> 5) & 0x3);
59889                     unsigned rs = (instr >> 8) & 0xf;
59890                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59891                     adds(condition,
59892                          Best,
59893                          Register(rd),
59894                          Register(rn),
59895                          Operand(Register(rm), shift.GetType(), Register(rs)));
59896                     break;
59897                   }
59898                   case 0x00a00000: {
59899                     // 0x00b00010
59900                     if (((instr & 0xf0000000) == 0xf0000000)) {
59901                       UnallocatedA32(instr);
59902                       return;
59903                     }
59904                     Condition condition((instr >> 28) & 0xf);
59905                     unsigned rd = (instr >> 12) & 0xf;
59906                     unsigned rn = (instr >> 16) & 0xf;
59907                     unsigned rm = instr & 0xf;
59908                     Shift shift((instr >> 5) & 0x3);
59909                     unsigned rs = (instr >> 8) & 0xf;
59910                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59911                     adcs(condition,
59912                          Best,
59913                          Register(rd),
59914                          Register(rn),
59915                          Operand(Register(rm), shift.GetType(), Register(rs)));
59916                     break;
59917                   }
59918                   case 0x01000000: {
59919                     // 0x01100010
59920                     if (((instr & 0xf0000000) == 0xf0000000)) {
59921                       UnallocatedA32(instr);
59922                       return;
59923                     }
59924                     Condition condition((instr >> 28) & 0xf);
59925                     unsigned rn = (instr >> 16) & 0xf;
59926                     unsigned rm = instr & 0xf;
59927                     Shift shift((instr >> 5) & 0x3);
59928                     unsigned rs = (instr >> 8) & 0xf;
59929                     // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
59930                     tst(condition,
59931                         Best,
59932                         Register(rn),
59933                         Operand(Register(rm), shift.GetType(), Register(rs)));
59934                     if (((instr & 0xff0f090) != 0x1100010)) {
59935                       UnpredictableA32(instr);
59936                     }
59937                     break;
59938                   }
59939                   case 0x01200000: {
59940                     // 0x01300010
59941                     if (((instr & 0xf0000000) == 0xf0000000)) {
59942                       UnallocatedA32(instr);
59943                       return;
59944                     }
59945                     Condition condition((instr >> 28) & 0xf);
59946                     unsigned rn = (instr >> 16) & 0xf;
59947                     unsigned rm = instr & 0xf;
59948                     Shift shift((instr >> 5) & 0x3);
59949                     unsigned rs = (instr >> 8) & 0xf;
59950                     // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
59951                     teq(condition,
59952                         Register(rn),
59953                         Operand(Register(rm), shift.GetType(), Register(rs)));
59954                     if (((instr & 0xff0f090) != 0x1300010)) {
59955                       UnpredictableA32(instr);
59956                     }
59957                     break;
59958                   }
59959                   case 0x01800000: {
59960                     // 0x01900010
59961                     if (((instr & 0xf0000000) == 0xf0000000)) {
59962                       UnallocatedA32(instr);
59963                       return;
59964                     }
59965                     Condition condition((instr >> 28) & 0xf);
59966                     unsigned rd = (instr >> 12) & 0xf;
59967                     unsigned rn = (instr >> 16) & 0xf;
59968                     unsigned rm = instr & 0xf;
59969                     Shift shift((instr >> 5) & 0x3);
59970                     unsigned rs = (instr >> 8) & 0xf;
59971                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
59972                     orrs(condition,
59973                          Best,
59974                          Register(rd),
59975                          Register(rn),
59976                          Operand(Register(rm), shift.GetType(), Register(rs)));
59977                     break;
59978                   }
59979                   case 0x01a00000: {
59980                     // 0x01b00010
59981                     if (((instr & 0xf0000000) == 0xf0000000)) {
59982                       UnallocatedA32(instr);
59983                       return;
59984                     }
59985                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
59986                         ((instr & 0xf0000000) != 0xf0000000)) {
59987                       Condition condition((instr >> 28) & 0xf);
59988                       unsigned rd = (instr >> 12) & 0xf;
59989                       unsigned rm = instr & 0xf;
59990                       unsigned rs = (instr >> 8) & 0xf;
59991                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
59992                       asrs(condition,
59993                            Best,
59994                            Register(rd),
59995                            Register(rm),
59996                            Register(rs));
59997                       if (((instr & 0xfff00f0) != 0x1b00050)) {
59998                         UnpredictableA32(instr);
59999                       }
60000                       return;
60001                     }
60002                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
60003                         ((instr & 0xf0000000) != 0xf0000000)) {
60004                       Condition condition((instr >> 28) & 0xf);
60005                       unsigned rd = (instr >> 12) & 0xf;
60006                       unsigned rm = instr & 0xf;
60007                       unsigned rs = (instr >> 8) & 0xf;
60008                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60009                       lsls(condition,
60010                            Best,
60011                            Register(rd),
60012                            Register(rm),
60013                            Register(rs));
60014                       if (((instr & 0xfff00f0) != 0x1b00010)) {
60015                         UnpredictableA32(instr);
60016                       }
60017                       return;
60018                     }
60019                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
60020                         ((instr & 0xf0000000) != 0xf0000000)) {
60021                       Condition condition((instr >> 28) & 0xf);
60022                       unsigned rd = (instr >> 12) & 0xf;
60023                       unsigned rm = instr & 0xf;
60024                       unsigned rs = (instr >> 8) & 0xf;
60025                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60026                       lsrs(condition,
60027                            Best,
60028                            Register(rd),
60029                            Register(rm),
60030                            Register(rs));
60031                       if (((instr & 0xfff00f0) != 0x1b00030)) {
60032                         UnpredictableA32(instr);
60033                       }
60034                       return;
60035                     }
60036                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
60037                         ((instr & 0xf0000000) != 0xf0000000)) {
60038                       Condition condition((instr >> 28) & 0xf);
60039                       unsigned rd = (instr >> 12) & 0xf;
60040                       unsigned rm = instr & 0xf;
60041                       unsigned rs = (instr >> 8) & 0xf;
60042                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
60043                       rors(condition,
60044                            Best,
60045                            Register(rd),
60046                            Register(rm),
60047                            Register(rs));
60048                       if (((instr & 0xfff00f0) != 0x1b00070)) {
60049                         UnpredictableA32(instr);
60050                       }
60051                       return;
60052                     }
60053                     Condition condition((instr >> 28) & 0xf);
60054                     unsigned rd = (instr >> 12) & 0xf;
60055                     unsigned rm = instr & 0xf;
60056                     Shift shift((instr >> 5) & 0x3);
60057                     unsigned rs = (instr >> 8) & 0xf;
60058                     // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
60059                     movs(condition,
60060                          Best,
60061                          Register(rd),
60062                          Operand(Register(rm), shift.GetType(), Register(rs)));
60063                     if (((instr & 0xfff0090) != 0x1b00010)) {
60064                       UnpredictableA32(instr);
60065                     }
60066                     break;
60067                   }
60068                 }
60069                 break;
60070               }
60071               case 0x00000080: {
60072                 // 0x00100090
60073                 switch (instr & 0x01200060) {
60074                   case 0x00000000: {
60075                     // 0x00100090
60076                     switch (instr & 0x00800000) {
60077                       case 0x00000000: {
60078                         // 0x00100090
60079                         if (((instr & 0xf0000000) == 0xf0000000)) {
60080                           UnallocatedA32(instr);
60081                           return;
60082                         }
60083                         Condition condition((instr >> 28) & 0xf);
60084                         unsigned rd = (instr >> 16) & 0xf;
60085                         unsigned rn = instr & 0xf;
60086                         unsigned rm = (instr >> 8) & 0xf;
60087                         // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
60088                         muls(condition,
60089                              Register(rd),
60090                              Register(rn),
60091                              Register(rm));
60092                         if (((instr & 0xff0f0f0) != 0x100090)) {
60093                           UnpredictableA32(instr);
60094                         }
60095                         break;
60096                       }
60097                       case 0x00800000: {
60098                         // 0x00900090
60099                         if (((instr & 0xf0000000) == 0xf0000000)) {
60100                           UnallocatedA32(instr);
60101                           return;
60102                         }
60103                         Condition condition((instr >> 28) & 0xf);
60104                         unsigned rdlo = (instr >> 12) & 0xf;
60105                         unsigned rdhi = (instr >> 16) & 0xf;
60106                         unsigned rn = instr & 0xf;
60107                         unsigned rm = (instr >> 8) & 0xf;
60108                         // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60109                         umulls(condition,
60110                                Register(rdlo),
60111                                Register(rdhi),
60112                                Register(rn),
60113                                Register(rm));
60114                         break;
60115                       }
60116                     }
60117                     break;
60118                   }
60119                   case 0x00000020: {
60120                     // 0x001000b0
60121                     if (((instr & 0xf0000000) == 0xf0000000)) {
60122                       UnallocatedA32(instr);
60123                       return;
60124                     }
60125                     Condition condition((instr >> 28) & 0xf);
60126                     unsigned rt = (instr >> 12) & 0xf;
60127                     unsigned rn = (instr >> 16) & 0xf;
60128                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60129                     unsigned rm = instr & 0xf;
60130                     // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
60131                     ldrh(condition,
60132                          Best,
60133                          Register(rt),
60134                          MemOperand(Register(rn),
60135                                     sign,
60136                                     Register(rm),
60137                                     PostIndex));
60138                     if (((instr & 0xf700ff0) != 0x1000b0)) {
60139                       UnpredictableA32(instr);
60140                     }
60141                     break;
60142                   }
60143                   case 0x00000040: {
60144                     // 0x001000d0
60145                     if (((instr & 0xf0000000) == 0xf0000000)) {
60146                       UnallocatedA32(instr);
60147                       return;
60148                     }
60149                     Condition condition((instr >> 28) & 0xf);
60150                     unsigned rt = (instr >> 12) & 0xf;
60151                     unsigned rn = (instr >> 16) & 0xf;
60152                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60153                     unsigned rm = instr & 0xf;
60154                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
60155                     ldrsb(condition,
60156                           Best,
60157                           Register(rt),
60158                           MemOperand(Register(rn),
60159                                      sign,
60160                                      Register(rm),
60161                                      PostIndex));
60162                     if (((instr & 0xf700ff0) != 0x1000d0)) {
60163                       UnpredictableA32(instr);
60164                     }
60165                     break;
60166                   }
60167                   case 0x00000060: {
60168                     // 0x001000f0
60169                     if (((instr & 0xf0000000) == 0xf0000000)) {
60170                       UnallocatedA32(instr);
60171                       return;
60172                     }
60173                     Condition condition((instr >> 28) & 0xf);
60174                     unsigned rt = (instr >> 12) & 0xf;
60175                     unsigned rn = (instr >> 16) & 0xf;
60176                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60177                     unsigned rm = instr & 0xf;
60178                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
60179                     ldrsh(condition,
60180                           Best,
60181                           Register(rt),
60182                           MemOperand(Register(rn),
60183                                      sign,
60184                                      Register(rm),
60185                                      PostIndex));
60186                     if (((instr & 0xf700ff0) != 0x1000f0)) {
60187                       UnpredictableA32(instr);
60188                     }
60189                     break;
60190                   }
60191                   case 0x00200000: {
60192                     // 0x00300090
60193                     switch (instr & 0x00800000) {
60194                       case 0x00000000: {
60195                         // 0x00300090
60196                         if (((instr & 0xf0000000) == 0xf0000000)) {
60197                           UnallocatedA32(instr);
60198                           return;
60199                         }
60200                         Condition condition((instr >> 28) & 0xf);
60201                         unsigned rd = (instr >> 16) & 0xf;
60202                         unsigned rn = instr & 0xf;
60203                         unsigned rm = (instr >> 8) & 0xf;
60204                         unsigned ra = (instr >> 12) & 0xf;
60205                         // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
60206                         mlas(condition,
60207                              Register(rd),
60208                              Register(rn),
60209                              Register(rm),
60210                              Register(ra));
60211                         break;
60212                       }
60213                       case 0x00800000: {
60214                         // 0x00b00090
60215                         if (((instr & 0xf0000000) == 0xf0000000)) {
60216                           UnallocatedA32(instr);
60217                           return;
60218                         }
60219                         Condition condition((instr >> 28) & 0xf);
60220                         unsigned rdlo = (instr >> 12) & 0xf;
60221                         unsigned rdhi = (instr >> 16) & 0xf;
60222                         unsigned rn = instr & 0xf;
60223                         unsigned rm = (instr >> 8) & 0xf;
60224                         // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60225                         umlals(condition,
60226                                Register(rdlo),
60227                                Register(rdhi),
60228                                Register(rn),
60229                                Register(rm));
60230                         break;
60231                       }
60232                     }
60233                     break;
60234                   }
60235                   case 0x00200020: {
60236                     // 0x003000b0
60237                     if (((instr & 0xf0000000) == 0xf0000000)) {
60238                       UnallocatedA32(instr);
60239                       return;
60240                     }
60241                     UnimplementedA32("LDRHT", instr);
60242                     break;
60243                   }
60244                   case 0x00200040: {
60245                     // 0x003000d0
60246                     if (((instr & 0xf0000000) == 0xf0000000)) {
60247                       UnallocatedA32(instr);
60248                       return;
60249                     }
60250                     UnimplementedA32("LDRSBT", instr);
60251                     break;
60252                   }
60253                   case 0x00200060: {
60254                     // 0x003000f0
60255                     if (((instr & 0xf0000000) == 0xf0000000)) {
60256                       UnallocatedA32(instr);
60257                       return;
60258                     }
60259                     UnimplementedA32("LDRSHT", instr);
60260                     break;
60261                   }
60262                   case 0x01000000: {
60263                     // 0x01100090
60264                     switch (instr & 0x00800300) {
60265                       case 0x00800000: {
60266                         // 0x01900090
60267                         if (((instr & 0xf0000000) == 0xf0000000)) {
60268                           UnallocatedA32(instr);
60269                           return;
60270                         }
60271                         Condition condition((instr >> 28) & 0xf);
60272                         unsigned rt = (instr >> 12) & 0xf;
60273                         unsigned rn = (instr >> 16) & 0xf;
60274                         // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
60275                         lda(condition,
60276                             Register(rt),
60277                             MemOperand(Register(rn), Offset));
60278                         if (((instr & 0xff00fff) != 0x1900c9f)) {
60279                           UnpredictableA32(instr);
60280                         }
60281                         break;
60282                       }
60283                       case 0x00800200: {
60284                         // 0x01900290
60285                         if (((instr & 0xf0000000) == 0xf0000000)) {
60286                           UnallocatedA32(instr);
60287                           return;
60288                         }
60289                         Condition condition((instr >> 28) & 0xf);
60290                         unsigned rt = (instr >> 12) & 0xf;
60291                         unsigned rn = (instr >> 16) & 0xf;
60292                         // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
60293                         ldaex(condition,
60294                               Register(rt),
60295                               MemOperand(Register(rn), Offset));
60296                         if (((instr & 0xff00fff) != 0x1900e9f)) {
60297                           UnpredictableA32(instr);
60298                         }
60299                         break;
60300                       }
60301                       case 0x00800300: {
60302                         // 0x01900390
60303                         if (((instr & 0xf0000000) == 0xf0000000)) {
60304                           UnallocatedA32(instr);
60305                           return;
60306                         }
60307                         Condition condition((instr >> 28) & 0xf);
60308                         unsigned rt = (instr >> 12) & 0xf;
60309                         unsigned rn = (instr >> 16) & 0xf;
60310                         // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
60311                         ldrex(condition,
60312                               Register(rt),
60313                               MemOperand(Register(rn), plus, 0, Offset));
60314                         if (((instr & 0xff00fff) != 0x1900f9f)) {
60315                           UnpredictableA32(instr);
60316                         }
60317                         break;
60318                       }
60319                       default:
60320                         UnallocatedA32(instr);
60321                         break;
60322                     }
60323                     break;
60324                   }
60325                   case 0x01000020: {
60326                     // 0x011000b0
60327                     if (((instr & 0xf0000000) == 0xf0000000)) {
60328                       UnallocatedA32(instr);
60329                       return;
60330                     }
60331                     Condition condition((instr >> 28) & 0xf);
60332                     unsigned rt = (instr >> 12) & 0xf;
60333                     unsigned rn = (instr >> 16) & 0xf;
60334                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60335                     unsigned rm = instr & 0xf;
60336                     AddrMode addrmode = Offset;
60337                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
60338                     ldrh(condition,
60339                          Best,
60340                          Register(rt),
60341                          MemOperand(Register(rn),
60342                                     sign,
60343                                     Register(rm),
60344                                     addrmode));
60345                     if (((instr & 0xf700ff0) != 0x11000b0)) {
60346                       UnpredictableA32(instr);
60347                     }
60348                     break;
60349                   }
60350                   case 0x01000040: {
60351                     // 0x011000d0
60352                     if (((instr & 0xf0000000) == 0xf0000000)) {
60353                       UnallocatedA32(instr);
60354                       return;
60355                     }
60356                     Condition condition((instr >> 28) & 0xf);
60357                     unsigned rt = (instr >> 12) & 0xf;
60358                     unsigned rn = (instr >> 16) & 0xf;
60359                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60360                     unsigned rm = instr & 0xf;
60361                     AddrMode addrmode = Offset;
60362                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
60363                     ldrsb(condition,
60364                           Best,
60365                           Register(rt),
60366                           MemOperand(Register(rn),
60367                                      sign,
60368                                      Register(rm),
60369                                      addrmode));
60370                     if (((instr & 0xf700ff0) != 0x11000d0)) {
60371                       UnpredictableA32(instr);
60372                     }
60373                     break;
60374                   }
60375                   case 0x01000060: {
60376                     // 0x011000f0
60377                     if (((instr & 0xf0000000) == 0xf0000000)) {
60378                       UnallocatedA32(instr);
60379                       return;
60380                     }
60381                     Condition condition((instr >> 28) & 0xf);
60382                     unsigned rt = (instr >> 12) & 0xf;
60383                     unsigned rn = (instr >> 16) & 0xf;
60384                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60385                     unsigned rm = instr & 0xf;
60386                     AddrMode addrmode = Offset;
60387                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
60388                     ldrsh(condition,
60389                           Best,
60390                           Register(rt),
60391                           MemOperand(Register(rn),
60392                                      sign,
60393                                      Register(rm),
60394                                      addrmode));
60395                     if (((instr & 0xf700ff0) != 0x11000f0)) {
60396                       UnpredictableA32(instr);
60397                     }
60398                     break;
60399                   }
60400                   case 0x01200000: {
60401                     // 0x01300090
60402                     switch (instr & 0x00800300) {
60403                       case 0x00800200: {
60404                         // 0x01b00290
60405                         if (((instr & 0xf0000000) == 0xf0000000)) {
60406                           UnallocatedA32(instr);
60407                           return;
60408                         }
60409                         Condition condition((instr >> 28) & 0xf);
60410                         unsigned rt = (instr >> 12) & 0xf;
60411                         unsigned rn = (instr >> 16) & 0xf;
60412                         // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
60413                         ldaexd(condition,
60414                                Register(rt),
60415                                Register(rt + 1),
60416                                MemOperand(Register(rn), Offset));
60417                         if (((instr & 0xff00fff) != 0x1b00e9f)) {
60418                           UnpredictableA32(instr);
60419                         }
60420                         break;
60421                       }
60422                       case 0x00800300: {
60423                         // 0x01b00390
60424                         if (((instr & 0xf0000000) == 0xf0000000)) {
60425                           UnallocatedA32(instr);
60426                           return;
60427                         }
60428                         Condition condition((instr >> 28) & 0xf);
60429                         unsigned rt = (instr >> 12) & 0xf;
60430                         unsigned rn = (instr >> 16) & 0xf;
60431                         // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
60432                         ldrexd(condition,
60433                                Register(rt),
60434                                Register(rt + 1),
60435                                MemOperand(Register(rn), Offset));
60436                         if (((instr & 0xff00fff) != 0x1b00f9f)) {
60437                           UnpredictableA32(instr);
60438                         }
60439                         break;
60440                       }
60441                       default:
60442                         UnallocatedA32(instr);
60443                         break;
60444                     }
60445                     break;
60446                   }
60447                   case 0x01200020: {
60448                     // 0x013000b0
60449                     if (((instr & 0xf0000000) == 0xf0000000)) {
60450                       UnallocatedA32(instr);
60451                       return;
60452                     }
60453                     Condition condition((instr >> 28) & 0xf);
60454                     unsigned rt = (instr >> 12) & 0xf;
60455                     unsigned rn = (instr >> 16) & 0xf;
60456                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60457                     unsigned rm = instr & 0xf;
60458                     AddrMode addrmode = PreIndex;
60459                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
60460                     ldrh(condition,
60461                          Best,
60462                          Register(rt),
60463                          MemOperand(Register(rn),
60464                                     sign,
60465                                     Register(rm),
60466                                     addrmode));
60467                     if (((instr & 0xf700ff0) != 0x13000b0)) {
60468                       UnpredictableA32(instr);
60469                     }
60470                     break;
60471                   }
60472                   case 0x01200040: {
60473                     // 0x013000d0
60474                     if (((instr & 0xf0000000) == 0xf0000000)) {
60475                       UnallocatedA32(instr);
60476                       return;
60477                     }
60478                     Condition condition((instr >> 28) & 0xf);
60479                     unsigned rt = (instr >> 12) & 0xf;
60480                     unsigned rn = (instr >> 16) & 0xf;
60481                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60482                     unsigned rm = instr & 0xf;
60483                     AddrMode addrmode = PreIndex;
60484                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
60485                     ldrsb(condition,
60486                           Best,
60487                           Register(rt),
60488                           MemOperand(Register(rn),
60489                                      sign,
60490                                      Register(rm),
60491                                      addrmode));
60492                     if (((instr & 0xf700ff0) != 0x13000d0)) {
60493                       UnpredictableA32(instr);
60494                     }
60495                     break;
60496                   }
60497                   case 0x01200060: {
60498                     // 0x013000f0
60499                     if (((instr & 0xf0000000) == 0xf0000000)) {
60500                       UnallocatedA32(instr);
60501                       return;
60502                     }
60503                     Condition condition((instr >> 28) & 0xf);
60504                     unsigned rt = (instr >> 12) & 0xf;
60505                     unsigned rn = (instr >> 16) & 0xf;
60506                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
60507                     unsigned rm = instr & 0xf;
60508                     AddrMode addrmode = PreIndex;
60509                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
60510                     ldrsh(condition,
60511                           Best,
60512                           Register(rt),
60513                           MemOperand(Register(rn),
60514                                      sign,
60515                                      Register(rm),
60516                                      addrmode));
60517                     if (((instr & 0xf700ff0) != 0x13000f0)) {
60518                       UnpredictableA32(instr);
60519                     }
60520                     break;
60521                   }
60522                 }
60523                 break;
60524               }
60525               case 0x00400000: {
60526                 // 0x00500010
60527                 switch (instr & 0x01a00000) {
60528                   case 0x00000000: {
60529                     // 0x00500010
60530                     if (((instr & 0xf0000000) == 0xf0000000)) {
60531                       UnallocatedA32(instr);
60532                       return;
60533                     }
60534                     Condition condition((instr >> 28) & 0xf);
60535                     unsigned rd = (instr >> 12) & 0xf;
60536                     unsigned rn = (instr >> 16) & 0xf;
60537                     unsigned rm = instr & 0xf;
60538                     Shift shift((instr >> 5) & 0x3);
60539                     unsigned rs = (instr >> 8) & 0xf;
60540                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60541                     subs(condition,
60542                          Best,
60543                          Register(rd),
60544                          Register(rn),
60545                          Operand(Register(rm), shift.GetType(), Register(rs)));
60546                     break;
60547                   }
60548                   case 0x00200000: {
60549                     // 0x00700010
60550                     if (((instr & 0xf0000000) == 0xf0000000)) {
60551                       UnallocatedA32(instr);
60552                       return;
60553                     }
60554                     Condition condition((instr >> 28) & 0xf);
60555                     unsigned rd = (instr >> 12) & 0xf;
60556                     unsigned rn = (instr >> 16) & 0xf;
60557                     unsigned rm = instr & 0xf;
60558                     Shift shift((instr >> 5) & 0x3);
60559                     unsigned rs = (instr >> 8) & 0xf;
60560                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60561                     rsbs(condition,
60562                          Best,
60563                          Register(rd),
60564                          Register(rn),
60565                          Operand(Register(rm), shift.GetType(), Register(rs)));
60566                     break;
60567                   }
60568                   case 0x00800000: {
60569                     // 0x00d00010
60570                     if (((instr & 0xf0000000) == 0xf0000000)) {
60571                       UnallocatedA32(instr);
60572                       return;
60573                     }
60574                     Condition condition((instr >> 28) & 0xf);
60575                     unsigned rd = (instr >> 12) & 0xf;
60576                     unsigned rn = (instr >> 16) & 0xf;
60577                     unsigned rm = instr & 0xf;
60578                     Shift shift((instr >> 5) & 0x3);
60579                     unsigned rs = (instr >> 8) & 0xf;
60580                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60581                     sbcs(condition,
60582                          Best,
60583                          Register(rd),
60584                          Register(rn),
60585                          Operand(Register(rm), shift.GetType(), Register(rs)));
60586                     break;
60587                   }
60588                   case 0x00a00000: {
60589                     // 0x00f00010
60590                     if (((instr & 0xf0000000) == 0xf0000000)) {
60591                       UnallocatedA32(instr);
60592                       return;
60593                     }
60594                     Condition condition((instr >> 28) & 0xf);
60595                     unsigned rd = (instr >> 12) & 0xf;
60596                     unsigned rn = (instr >> 16) & 0xf;
60597                     unsigned rm = instr & 0xf;
60598                     Shift shift((instr >> 5) & 0x3);
60599                     unsigned rs = (instr >> 8) & 0xf;
60600                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60601                     rscs(condition,
60602                          Register(rd),
60603                          Register(rn),
60604                          Operand(Register(rm), shift.GetType(), Register(rs)));
60605                     break;
60606                   }
60607                   case 0x01000000: {
60608                     // 0x01500010
60609                     if (((instr & 0xf0000000) == 0xf0000000)) {
60610                       UnallocatedA32(instr);
60611                       return;
60612                     }
60613                     Condition condition((instr >> 28) & 0xf);
60614                     unsigned rn = (instr >> 16) & 0xf;
60615                     unsigned rm = instr & 0xf;
60616                     Shift shift((instr >> 5) & 0x3);
60617                     unsigned rs = (instr >> 8) & 0xf;
60618                     // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60619                     cmp(condition,
60620                         Best,
60621                         Register(rn),
60622                         Operand(Register(rm), shift.GetType(), Register(rs)));
60623                     if (((instr & 0xff0f090) != 0x1500010)) {
60624                       UnpredictableA32(instr);
60625                     }
60626                     break;
60627                   }
60628                   case 0x01200000: {
60629                     // 0x01700010
60630                     if (((instr & 0xf0000000) == 0xf0000000)) {
60631                       UnallocatedA32(instr);
60632                       return;
60633                     }
60634                     Condition condition((instr >> 28) & 0xf);
60635                     unsigned rn = (instr >> 16) & 0xf;
60636                     unsigned rm = instr & 0xf;
60637                     Shift shift((instr >> 5) & 0x3);
60638                     unsigned rs = (instr >> 8) & 0xf;
60639                     // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
60640                     cmn(condition,
60641                         Best,
60642                         Register(rn),
60643                         Operand(Register(rm), shift.GetType(), Register(rs)));
60644                     if (((instr & 0xff0f090) != 0x1700010)) {
60645                       UnpredictableA32(instr);
60646                     }
60647                     break;
60648                   }
60649                   case 0x01800000: {
60650                     // 0x01d00010
60651                     if (((instr & 0xf0000000) == 0xf0000000)) {
60652                       UnallocatedA32(instr);
60653                       return;
60654                     }
60655                     Condition condition((instr >> 28) & 0xf);
60656                     unsigned rd = (instr >> 12) & 0xf;
60657                     unsigned rn = (instr >> 16) & 0xf;
60658                     unsigned rm = instr & 0xf;
60659                     Shift shift((instr >> 5) & 0x3);
60660                     unsigned rs = (instr >> 8) & 0xf;
60661                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
60662                     bics(condition,
60663                          Best,
60664                          Register(rd),
60665                          Register(rn),
60666                          Operand(Register(rm), shift.GetType(), Register(rs)));
60667                     break;
60668                   }
60669                   case 0x01a00000: {
60670                     // 0x01f00010
60671                     if (((instr & 0xf0000000) == 0xf0000000)) {
60672                       UnallocatedA32(instr);
60673                       return;
60674                     }
60675                     Condition condition((instr >> 28) & 0xf);
60676                     unsigned rd = (instr >> 12) & 0xf;
60677                     unsigned rm = instr & 0xf;
60678                     Shift shift((instr >> 5) & 0x3);
60679                     unsigned rs = (instr >> 8) & 0xf;
60680                     // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
60681                     mvns(condition,
60682                          Best,
60683                          Register(rd),
60684                          Operand(Register(rm), shift.GetType(), Register(rs)));
60685                     if (((instr & 0xfff0090) != 0x1f00010)) {
60686                       UnpredictableA32(instr);
60687                     }
60688                     break;
60689                   }
60690                 }
60691                 break;
60692               }
60693               case 0x00400080: {
60694                 // 0x00500090
60695                 switch (instr & 0x00000060) {
60696                   case 0x00000000: {
60697                     // 0x00500090
60698                     switch (instr & 0x01a00000) {
60699                       case 0x00800000: {
60700                         // 0x00d00090
60701                         if (((instr & 0xf0000000) == 0xf0000000)) {
60702                           UnallocatedA32(instr);
60703                           return;
60704                         }
60705                         Condition condition((instr >> 28) & 0xf);
60706                         unsigned rdlo = (instr >> 12) & 0xf;
60707                         unsigned rdhi = (instr >> 16) & 0xf;
60708                         unsigned rn = instr & 0xf;
60709                         unsigned rm = (instr >> 8) & 0xf;
60710                         // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60711                         smulls(condition,
60712                                Register(rdlo),
60713                                Register(rdhi),
60714                                Register(rn),
60715                                Register(rm));
60716                         break;
60717                       }
60718                       case 0x00a00000: {
60719                         // 0x00f00090
60720                         if (((instr & 0xf0000000) == 0xf0000000)) {
60721                           UnallocatedA32(instr);
60722                           return;
60723                         }
60724                         Condition condition((instr >> 28) & 0xf);
60725                         unsigned rdlo = (instr >> 12) & 0xf;
60726                         unsigned rdhi = (instr >> 16) & 0xf;
60727                         unsigned rn = instr & 0xf;
60728                         unsigned rm = (instr >> 8) & 0xf;
60729                         // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
60730                         smlals(condition,
60731                                Register(rdlo),
60732                                Register(rdhi),
60733                                Register(rn),
60734                                Register(rm));
60735                         break;
60736                       }
60737                       case 0x01800000: {
60738                         // 0x01d00090
60739                         switch (instr & 0x00000300) {
60740                           case 0x00000000: {
60741                             // 0x01d00090
60742                             if (((instr & 0xf0000000) == 0xf0000000)) {
60743                               UnallocatedA32(instr);
60744                               return;
60745                             }
60746                             Condition condition((instr >> 28) & 0xf);
60747                             unsigned rt = (instr >> 12) & 0xf;
60748                             unsigned rn = (instr >> 16) & 0xf;
60749                             // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60750                             ldab(condition,
60751                                  Register(rt),
60752                                  MemOperand(Register(rn), Offset));
60753                             if (((instr & 0xff00fff) != 0x1d00c9f)) {
60754                               UnpredictableA32(instr);
60755                             }
60756                             break;
60757                           }
60758                           case 0x00000200: {
60759                             // 0x01d00290
60760                             if (((instr & 0xf0000000) == 0xf0000000)) {
60761                               UnallocatedA32(instr);
60762                               return;
60763                             }
60764                             Condition condition((instr >> 28) & 0xf);
60765                             unsigned rt = (instr >> 12) & 0xf;
60766                             unsigned rn = (instr >> 16) & 0xf;
60767                             // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60768                             ldaexb(condition,
60769                                    Register(rt),
60770                                    MemOperand(Register(rn), Offset));
60771                             if (((instr & 0xff00fff) != 0x1d00e9f)) {
60772                               UnpredictableA32(instr);
60773                             }
60774                             break;
60775                           }
60776                           case 0x00000300: {
60777                             // 0x01d00390
60778                             if (((instr & 0xf0000000) == 0xf0000000)) {
60779                               UnallocatedA32(instr);
60780                               return;
60781                             }
60782                             Condition condition((instr >> 28) & 0xf);
60783                             unsigned rt = (instr >> 12) & 0xf;
60784                             unsigned rn = (instr >> 16) & 0xf;
60785                             // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
60786                             ldrexb(condition,
60787                                    Register(rt),
60788                                    MemOperand(Register(rn), Offset));
60789                             if (((instr & 0xff00fff) != 0x1d00f9f)) {
60790                               UnpredictableA32(instr);
60791                             }
60792                             break;
60793                           }
60794                           default:
60795                             UnallocatedA32(instr);
60796                             break;
60797                         }
60798                         break;
60799                       }
60800                       case 0x01a00000: {
60801                         // 0x01f00090
60802                         switch (instr & 0x00000300) {
60803                           case 0x00000000: {
60804                             // 0x01f00090
60805                             if (((instr & 0xf0000000) == 0xf0000000)) {
60806                               UnallocatedA32(instr);
60807                               return;
60808                             }
60809                             Condition condition((instr >> 28) & 0xf);
60810                             unsigned rt = (instr >> 12) & 0xf;
60811                             unsigned rn = (instr >> 16) & 0xf;
60812                             // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60813                             ldah(condition,
60814                                  Register(rt),
60815                                  MemOperand(Register(rn), Offset));
60816                             if (((instr & 0xff00fff) != 0x1f00c9f)) {
60817                               UnpredictableA32(instr);
60818                             }
60819                             break;
60820                           }
60821                           case 0x00000200: {
60822                             // 0x01f00290
60823                             if (((instr & 0xf0000000) == 0xf0000000)) {
60824                               UnallocatedA32(instr);
60825                               return;
60826                             }
60827                             Condition condition((instr >> 28) & 0xf);
60828                             unsigned rt = (instr >> 12) & 0xf;
60829                             unsigned rn = (instr >> 16) & 0xf;
60830                             // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60831                             ldaexh(condition,
60832                                    Register(rt),
60833                                    MemOperand(Register(rn), Offset));
60834                             if (((instr & 0xff00fff) != 0x1f00e9f)) {
60835                               UnpredictableA32(instr);
60836                             }
60837                             break;
60838                           }
60839                           case 0x00000300: {
60840                             // 0x01f00390
60841                             if (((instr & 0xf0000000) == 0xf0000000)) {
60842                               UnallocatedA32(instr);
60843                               return;
60844                             }
60845                             Condition condition((instr >> 28) & 0xf);
60846                             unsigned rt = (instr >> 12) & 0xf;
60847                             unsigned rn = (instr >> 16) & 0xf;
60848                             // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
60849                             ldrexh(condition,
60850                                    Register(rt),
60851                                    MemOperand(Register(rn), Offset));
60852                             if (((instr & 0xff00fff) != 0x1f00f9f)) {
60853                               UnpredictableA32(instr);
60854                             }
60855                             break;
60856                           }
60857                           default:
60858                             UnallocatedA32(instr);
60859                             break;
60860                         }
60861                         break;
60862                       }
60863                       default:
60864                         UnallocatedA32(instr);
60865                         break;
60866                     }
60867                     break;
60868                   }
60869                   case 0x00000020: {
60870                     // 0x005000b0
60871                     switch (instr & 0x01200000) {
60872                       case 0x00000000: {
60873                         // 0x005000b0
60874                         switch (instr & 0x000f0000) {
60875                           case 0x000f0000: {
60876                             // 0x005f00b0
60877                             if (((instr & 0xf0000000) == 0xf0000000) ||
60878                                 ((instr & 0x1200000) == 0x200000)) {
60879                               UnallocatedA32(instr);
60880                               return;
60881                             }
60882                             Condition condition((instr >> 28) & 0xf);
60883                             unsigned rt = (instr >> 12) & 0xf;
60884                             uint32_t U = (instr >> 23) & 0x1;
60885                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60886                             if (U == 0) imm = -imm;
60887                             bool minus_zero = (imm == 0) && (U == 0);
60888                             Label label(imm, kA32PcDelta, minus_zero);
60889                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60890                             ldrh(condition, Register(rt), &label);
60891                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60892                               UnpredictableA32(instr);
60893                             }
60894                             break;
60895                           }
60896                           default: {
60897                             if (((instr & 0xf0000000) == 0xf0000000) ||
60898                                 ((instr & 0xf0000) == 0xf0000)) {
60899                               UnallocatedA32(instr);
60900                               return;
60901                             }
60902                             Condition condition((instr >> 28) & 0xf);
60903                             unsigned rt = (instr >> 12) & 0xf;
60904                             unsigned rn = (instr >> 16) & 0xf;
60905                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60906                                                                    : plus);
60907                             int32_t offset =
60908                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60909                             // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
60910                             ldrh(condition,
60911                                  Best,
60912                                  Register(rt),
60913                                  MemOperand(Register(rn),
60914                                             sign,
60915                                             offset,
60916                                             PostIndex));
60917                             break;
60918                           }
60919                         }
60920                         break;
60921                       }
60922                       case 0x00200000: {
60923                         // 0x007000b0
60924                         if (((instr & 0xf0000000) == 0xf0000000)) {
60925                           UnallocatedA32(instr);
60926                           return;
60927                         }
60928                         UnimplementedA32("LDRHT", instr);
60929                         break;
60930                       }
60931                       case 0x01000000: {
60932                         // 0x015000b0
60933                         switch (instr & 0x000f0000) {
60934                           case 0x000f0000: {
60935                             // 0x015f00b0
60936                             if (((instr & 0xf0000000) == 0xf0000000) ||
60937                                 ((instr & 0x1200000) == 0x200000)) {
60938                               UnallocatedA32(instr);
60939                               return;
60940                             }
60941                             Condition condition((instr >> 28) & 0xf);
60942                             unsigned rt = (instr >> 12) & 0xf;
60943                             uint32_t U = (instr >> 23) & 0x1;
60944                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60945                             if (U == 0) imm = -imm;
60946                             bool minus_zero = (imm == 0) && (U == 0);
60947                             Label label(imm, kA32PcDelta, minus_zero);
60948                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60949                             ldrh(condition, Register(rt), &label);
60950                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
60951                               UnpredictableA32(instr);
60952                             }
60953                             break;
60954                           }
60955                           default: {
60956                             if (((instr & 0xf0000000) == 0xf0000000) ||
60957                                 ((instr & 0xf0000) == 0xf0000)) {
60958                               UnallocatedA32(instr);
60959                               return;
60960                             }
60961                             Condition condition((instr >> 28) & 0xf);
60962                             unsigned rt = (instr >> 12) & 0xf;
60963                             unsigned rn = (instr >> 16) & 0xf;
60964                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
60965                                                                    : plus);
60966                             int32_t offset =
60967                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
60968                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
60969                             ldrh(condition,
60970                                  Best,
60971                                  Register(rt),
60972                                  MemOperand(Register(rn),
60973                                             sign,
60974                                             offset,
60975                                             Offset));
60976                             break;
60977                           }
60978                         }
60979                         break;
60980                       }
60981                       case 0x01200000: {
60982                         // 0x017000b0
60983                         switch (instr & 0x000f0000) {
60984                           case 0x000f0000: {
60985                             // 0x017f00b0
60986                             if (((instr & 0xf0000000) == 0xf0000000) ||
60987                                 ((instr & 0x1200000) == 0x200000)) {
60988                               UnallocatedA32(instr);
60989                               return;
60990                             }
60991                             Condition condition((instr >> 28) & 0xf);
60992                             unsigned rt = (instr >> 12) & 0xf;
60993                             uint32_t U = (instr >> 23) & 0x1;
60994                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
60995                             if (U == 0) imm = -imm;
60996                             bool minus_zero = (imm == 0) && (U == 0);
60997                             Label label(imm, kA32PcDelta, minus_zero);
60998                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
60999                             ldrh(condition, Register(rt), &label);
61000                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
61001                               UnpredictableA32(instr);
61002                             }
61003                             break;
61004                           }
61005                           default: {
61006                             if (((instr & 0xf0000000) == 0xf0000000) ||
61007                                 ((instr & 0xf0000) == 0xf0000)) {
61008                               UnallocatedA32(instr);
61009                               return;
61010                             }
61011                             Condition condition((instr >> 28) & 0xf);
61012                             unsigned rt = (instr >> 12) & 0xf;
61013                             unsigned rn = (instr >> 16) & 0xf;
61014                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61015                                                                    : plus);
61016                             int32_t offset =
61017                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61018                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
61019                             ldrh(condition,
61020                                  Best,
61021                                  Register(rt),
61022                                  MemOperand(Register(rn),
61023                                             sign,
61024                                             offset,
61025                                             PreIndex));
61026                             break;
61027                           }
61028                         }
61029                         break;
61030                       }
61031                     }
61032                     break;
61033                   }
61034                   case 0x00000040: {
61035                     // 0x005000d0
61036                     switch (instr & 0x01200000) {
61037                       case 0x00000000: {
61038                         // 0x005000d0
61039                         switch (instr & 0x000f0000) {
61040                           case 0x000f0000: {
61041                             // 0x005f00d0
61042                             if (((instr & 0xf0000000) == 0xf0000000) ||
61043                                 ((instr & 0x1200000) == 0x200000)) {
61044                               UnallocatedA32(instr);
61045                               return;
61046                             }
61047                             Condition condition((instr >> 28) & 0xf);
61048                             unsigned rt = (instr >> 12) & 0xf;
61049                             uint32_t U = (instr >> 23) & 0x1;
61050                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61051                             if (U == 0) imm = -imm;
61052                             bool minus_zero = (imm == 0) && (U == 0);
61053                             Label label(imm, kA32PcDelta, minus_zero);
61054                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
61055                             ldrsb(condition, Register(rt), &label);
61056                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
61057                               UnpredictableA32(instr);
61058                             }
61059                             break;
61060                           }
61061                           default: {
61062                             if (((instr & 0xf0000000) == 0xf0000000) ||
61063                                 ((instr & 0xf0000) == 0xf0000)) {
61064                               UnallocatedA32(instr);
61065                               return;
61066                             }
61067                             Condition condition((instr >> 28) & 0xf);
61068                             unsigned rt = (instr >> 12) & 0xf;
61069                             unsigned rn = (instr >> 16) & 0xf;
61070                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61071                                                                    : plus);
61072                             int32_t offset =
61073                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61074                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
61075                             ldrsb(condition,
61076                                   Best,
61077                                   Register(rt),
61078                                   MemOperand(Register(rn),
61079                                              sign,
61080                                              offset,
61081                                              PostIndex));
61082                             break;
61083                           }
61084                         }
61085                         break;
61086                       }
61087                       case 0x00200000: {
61088                         // 0x007000d0
61089                         if (((instr & 0xf0000000) == 0xf0000000)) {
61090                           UnallocatedA32(instr);
61091                           return;
61092                         }
61093                         UnimplementedA32("LDRSBT", instr);
61094                         break;
61095                       }
61096                       case 0x01000000: {
61097                         // 0x015000d0
61098                         switch (instr & 0x000f0000) {
61099                           case 0x000f0000: {
61100                             // 0x015f00d0
61101                             if (((instr & 0xf0000000) == 0xf0000000) ||
61102                                 ((instr & 0x1200000) == 0x200000)) {
61103                               UnallocatedA32(instr);
61104                               return;
61105                             }
61106                             Condition condition((instr >> 28) & 0xf);
61107                             unsigned rt = (instr >> 12) & 0xf;
61108                             uint32_t U = (instr >> 23) & 0x1;
61109                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61110                             if (U == 0) imm = -imm;
61111                             bool minus_zero = (imm == 0) && (U == 0);
61112                             Label label(imm, kA32PcDelta, minus_zero);
61113                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
61114                             ldrsb(condition, Register(rt), &label);
61115                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
61116                               UnpredictableA32(instr);
61117                             }
61118                             break;
61119                           }
61120                           default: {
61121                             if (((instr & 0xf0000000) == 0xf0000000) ||
61122                                 ((instr & 0xf0000) == 0xf0000)) {
61123                               UnallocatedA32(instr);
61124                               return;
61125                             }
61126                             Condition condition((instr >> 28) & 0xf);
61127                             unsigned rt = (instr >> 12) & 0xf;
61128                             unsigned rn = (instr >> 16) & 0xf;
61129                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61130                                                                    : plus);
61131                             int32_t offset =
61132                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61133                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
61134                             ldrsb(condition,
61135                                   Best,
61136                                   Register(rt),
61137                                   MemOperand(Register(rn),
61138                                              sign,
61139                                              offset,
61140                                              Offset));
61141                             break;
61142                           }
61143                         }
61144                         break;
61145                       }
61146                       case 0x01200000: {
61147                         // 0x017000d0
61148                         switch (instr & 0x000f0000) {
61149                           case 0x000f0000: {
61150                             // 0x017f00d0
61151                             if (((instr & 0xf0000000) == 0xf0000000) ||
61152                                 ((instr & 0x1200000) == 0x200000)) {
61153                               UnallocatedA32(instr);
61154                               return;
61155                             }
61156                             Condition condition((instr >> 28) & 0xf);
61157                             unsigned rt = (instr >> 12) & 0xf;
61158                             uint32_t U = (instr >> 23) & 0x1;
61159                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61160                             if (U == 0) imm = -imm;
61161                             bool minus_zero = (imm == 0) && (U == 0);
61162                             Label label(imm, kA32PcDelta, minus_zero);
61163                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
61164                             ldrsb(condition, Register(rt), &label);
61165                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
61166                               UnpredictableA32(instr);
61167                             }
61168                             break;
61169                           }
61170                           default: {
61171                             if (((instr & 0xf0000000) == 0xf0000000) ||
61172                                 ((instr & 0xf0000) == 0xf0000)) {
61173                               UnallocatedA32(instr);
61174                               return;
61175                             }
61176                             Condition condition((instr >> 28) & 0xf);
61177                             unsigned rt = (instr >> 12) & 0xf;
61178                             unsigned rn = (instr >> 16) & 0xf;
61179                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61180                                                                    : plus);
61181                             int32_t offset =
61182                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61183                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
61184                             ldrsb(condition,
61185                                   Best,
61186                                   Register(rt),
61187                                   MemOperand(Register(rn),
61188                                              sign,
61189                                              offset,
61190                                              PreIndex));
61191                             break;
61192                           }
61193                         }
61194                         break;
61195                       }
61196                     }
61197                     break;
61198                   }
61199                   case 0x00000060: {
61200                     // 0x005000f0
61201                     switch (instr & 0x01200000) {
61202                       case 0x00000000: {
61203                         // 0x005000f0
61204                         switch (instr & 0x000f0000) {
61205                           case 0x000f0000: {
61206                             // 0x005f00f0
61207                             if (((instr & 0xf0000000) == 0xf0000000) ||
61208                                 ((instr & 0x1200000) == 0x200000)) {
61209                               UnallocatedA32(instr);
61210                               return;
61211                             }
61212                             Condition condition((instr >> 28) & 0xf);
61213                             unsigned rt = (instr >> 12) & 0xf;
61214                             uint32_t U = (instr >> 23) & 0x1;
61215                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61216                             if (U == 0) imm = -imm;
61217                             bool minus_zero = (imm == 0) && (U == 0);
61218                             Label label(imm, kA32PcDelta, minus_zero);
61219                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
61220                             ldrsh(condition, Register(rt), &label);
61221                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
61222                               UnpredictableA32(instr);
61223                             }
61224                             break;
61225                           }
61226                           default: {
61227                             if (((instr & 0xf0000000) == 0xf0000000) ||
61228                                 ((instr & 0xf0000) == 0xf0000)) {
61229                               UnallocatedA32(instr);
61230                               return;
61231                             }
61232                             Condition condition((instr >> 28) & 0xf);
61233                             unsigned rt = (instr >> 12) & 0xf;
61234                             unsigned rn = (instr >> 16) & 0xf;
61235                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61236                                                                    : plus);
61237                             int32_t offset =
61238                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61239                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
61240                             ldrsh(condition,
61241                                   Best,
61242                                   Register(rt),
61243                                   MemOperand(Register(rn),
61244                                              sign,
61245                                              offset,
61246                                              PostIndex));
61247                             break;
61248                           }
61249                         }
61250                         break;
61251                       }
61252                       case 0x00200000: {
61253                         // 0x007000f0
61254                         if (((instr & 0xf0000000) == 0xf0000000)) {
61255                           UnallocatedA32(instr);
61256                           return;
61257                         }
61258                         UnimplementedA32("LDRSHT", instr);
61259                         break;
61260                       }
61261                       case 0x01000000: {
61262                         // 0x015000f0
61263                         switch (instr & 0x000f0000) {
61264                           case 0x000f0000: {
61265                             // 0x015f00f0
61266                             if (((instr & 0xf0000000) == 0xf0000000) ||
61267                                 ((instr & 0x1200000) == 0x200000)) {
61268                               UnallocatedA32(instr);
61269                               return;
61270                             }
61271                             Condition condition((instr >> 28) & 0xf);
61272                             unsigned rt = (instr >> 12) & 0xf;
61273                             uint32_t U = (instr >> 23) & 0x1;
61274                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61275                             if (U == 0) imm = -imm;
61276                             bool minus_zero = (imm == 0) && (U == 0);
61277                             Label label(imm, kA32PcDelta, minus_zero);
61278                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
61279                             ldrsh(condition, Register(rt), &label);
61280                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
61281                               UnpredictableA32(instr);
61282                             }
61283                             break;
61284                           }
61285                           default: {
61286                             if (((instr & 0xf0000000) == 0xf0000000) ||
61287                                 ((instr & 0xf0000) == 0xf0000)) {
61288                               UnallocatedA32(instr);
61289                               return;
61290                             }
61291                             Condition condition((instr >> 28) & 0xf);
61292                             unsigned rt = (instr >> 12) & 0xf;
61293                             unsigned rn = (instr >> 16) & 0xf;
61294                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61295                                                                    : plus);
61296                             int32_t offset =
61297                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61298                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
61299                             ldrsh(condition,
61300                                   Best,
61301                                   Register(rt),
61302                                   MemOperand(Register(rn),
61303                                              sign,
61304                                              offset,
61305                                              Offset));
61306                             break;
61307                           }
61308                         }
61309                         break;
61310                       }
61311                       case 0x01200000: {
61312                         // 0x017000f0
61313                         switch (instr & 0x000f0000) {
61314                           case 0x000f0000: {
61315                             // 0x017f00f0
61316                             if (((instr & 0xf0000000) == 0xf0000000) ||
61317                                 ((instr & 0x1200000) == 0x200000)) {
61318                               UnallocatedA32(instr);
61319                               return;
61320                             }
61321                             Condition condition((instr >> 28) & 0xf);
61322                             unsigned rt = (instr >> 12) & 0xf;
61323                             uint32_t U = (instr >> 23) & 0x1;
61324                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
61325                             if (U == 0) imm = -imm;
61326                             bool minus_zero = (imm == 0) && (U == 0);
61327                             Label label(imm, kA32PcDelta, minus_zero);
61328                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
61329                             ldrsh(condition, Register(rt), &label);
61330                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
61331                               UnpredictableA32(instr);
61332                             }
61333                             break;
61334                           }
61335                           default: {
61336                             if (((instr & 0xf0000000) == 0xf0000000) ||
61337                                 ((instr & 0xf0000) == 0xf0000)) {
61338                               UnallocatedA32(instr);
61339                               return;
61340                             }
61341                             Condition condition((instr >> 28) & 0xf);
61342                             unsigned rt = (instr >> 12) & 0xf;
61343                             unsigned rn = (instr >> 16) & 0xf;
61344                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
61345                                                                    : plus);
61346                             int32_t offset =
61347                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
61348                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
61349                             ldrsh(condition,
61350                                   Best,
61351                                   Register(rt),
61352                                   MemOperand(Register(rn),
61353                                              sign,
61354                                              offset,
61355                                              PreIndex));
61356                             break;
61357                           }
61358                         }
61359                         break;
61360                       }
61361                     }
61362                     break;
61363                   }
61364                 }
61365                 break;
61366               }
61367             }
61368             break;
61369           }
61370         }
61371         break;
61372       }
61373       case 0x02000000: {
61374         // 0x02000000
61375         switch (instr & 0x01b00000) {
61376           case 0x00000000: {
61377             // 0x02000000
61378             switch (instr & 0x00400000) {
61379               case 0x00000000: {
61380                 // 0x02000000
61381                 if (((instr & 0xf0000000) == 0xf0000000)) {
61382                   UnallocatedA32(instr);
61383                   return;
61384                 }
61385                 Condition condition((instr >> 28) & 0xf);
61386                 unsigned rd = (instr >> 12) & 0xf;
61387                 unsigned rn = (instr >> 16) & 0xf;
61388                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61389                 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61390                 and_(condition, Best, Register(rd), Register(rn), imm);
61391                 break;
61392               }
61393               case 0x00400000: {
61394                 // 0x02400000
61395                 switch (instr & 0x000d0000) {
61396                   case 0x000d0000: {
61397                     // 0x024d0000
61398                     switch (instr & 0x00020000) {
61399                       case 0x00000000: {
61400                         // 0x024d0000
61401                         if (((instr & 0xf0000000) == 0xf0000000)) {
61402                           UnallocatedA32(instr);
61403                           return;
61404                         }
61405                         Condition condition((instr >> 28) & 0xf);
61406                         unsigned rd = (instr >> 12) & 0xf;
61407                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61408                         // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61409                         sub(condition, Best, Register(rd), sp, imm);
61410                         break;
61411                       }
61412                       case 0x00020000: {
61413                         // 0x024f0000
61414                         if (((instr & 0xf0000000) == 0xf0000000)) {
61415                           UnallocatedA32(instr);
61416                           return;
61417                         }
61418                         if (((instr & 0xf0000000) != 0xf0000000) &&
61419                             ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
61420                           Condition condition((instr >> 28) & 0xf);
61421                           unsigned rd = (instr >> 12) & 0xf;
61422                           uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61423                           // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
61424                           sub(condition, Best, Register(rd), pc, imm);
61425                           return;
61426                         }
61427                         Condition condition((instr >> 28) & 0xf);
61428                         unsigned rd = (instr >> 12) & 0xf;
61429                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61430                         Label label(-imm, kA32PcDelta);
61431                         // ADR{<c>}{<q>} <Rd>, <label> ; A2
61432                         adr(condition, Best, Register(rd), &label);
61433                         break;
61434                       }
61435                     }
61436                     break;
61437                   }
61438                   default: {
61439                     if (((instr & 0xf0000000) == 0xf0000000) ||
61440                         ((instr & 0xd0000) == 0xd0000)) {
61441                       UnallocatedA32(instr);
61442                       return;
61443                     }
61444                     Condition condition((instr >> 28) & 0xf);
61445                     unsigned rd = (instr >> 12) & 0xf;
61446                     unsigned rn = (instr >> 16) & 0xf;
61447                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61448                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61449                     sub(condition, Best, Register(rd), Register(rn), imm);
61450                     break;
61451                   }
61452                 }
61453                 break;
61454               }
61455             }
61456             break;
61457           }
61458           case 0x00100000: {
61459             // 0x02100000
61460             switch (instr & 0x00400000) {
61461               case 0x00000000: {
61462                 // 0x02100000
61463                 if (((instr & 0xf0000000) == 0xf0000000)) {
61464                   UnallocatedA32(instr);
61465                   return;
61466                 }
61467                 Condition condition((instr >> 28) & 0xf);
61468                 unsigned rd = (instr >> 12) & 0xf;
61469                 unsigned rn = (instr >> 16) & 0xf;
61470                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61471                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61472                 ands(condition, Best, Register(rd), Register(rn), imm);
61473                 break;
61474               }
61475               case 0x00400000: {
61476                 // 0x02500000
61477                 switch (instr & 0x000f0000) {
61478                   case 0x000d0000: {
61479                     // 0x025d0000
61480                     if (((instr & 0xf0000000) == 0xf0000000)) {
61481                       UnallocatedA32(instr);
61482                       return;
61483                     }
61484                     Condition condition((instr >> 28) & 0xf);
61485                     unsigned rd = (instr >> 12) & 0xf;
61486                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61487                     // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61488                     subs(condition, Best, Register(rd), sp, imm);
61489                     break;
61490                   }
61491                   default: {
61492                     if (((instr & 0xf0000000) == 0xf0000000) ||
61493                         ((instr & 0xf0000) == 0xd0000)) {
61494                       UnallocatedA32(instr);
61495                       return;
61496                     }
61497                     Condition condition((instr >> 28) & 0xf);
61498                     unsigned rd = (instr >> 12) & 0xf;
61499                     unsigned rn = (instr >> 16) & 0xf;
61500                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61501                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61502                     subs(condition, Best, Register(rd), Register(rn), imm);
61503                     break;
61504                   }
61505                 }
61506                 break;
61507               }
61508             }
61509             break;
61510           }
61511           case 0x00200000: {
61512             // 0x02200000
61513             switch (instr & 0x00400000) {
61514               case 0x00000000: {
61515                 // 0x02200000
61516                 if (((instr & 0xf0000000) == 0xf0000000)) {
61517                   UnallocatedA32(instr);
61518                   return;
61519                 }
61520                 Condition condition((instr >> 28) & 0xf);
61521                 unsigned rd = (instr >> 12) & 0xf;
61522                 unsigned rn = (instr >> 16) & 0xf;
61523                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61524                 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61525                 eor(condition, Best, Register(rd), Register(rn), imm);
61526                 break;
61527               }
61528               case 0x00400000: {
61529                 // 0x02600000
61530                 if (((instr & 0xf0000000) == 0xf0000000)) {
61531                   UnallocatedA32(instr);
61532                   return;
61533                 }
61534                 Condition condition((instr >> 28) & 0xf);
61535                 unsigned rd = (instr >> 12) & 0xf;
61536                 unsigned rn = (instr >> 16) & 0xf;
61537                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61538                 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61539                 rsb(condition, Best, Register(rd), Register(rn), imm);
61540                 break;
61541               }
61542             }
61543             break;
61544           }
61545           case 0x00300000: {
61546             // 0x02300000
61547             switch (instr & 0x00400000) {
61548               case 0x00000000: {
61549                 // 0x02300000
61550                 if (((instr & 0xf0000000) == 0xf0000000)) {
61551                   UnallocatedA32(instr);
61552                   return;
61553                 }
61554                 Condition condition((instr >> 28) & 0xf);
61555                 unsigned rd = (instr >> 12) & 0xf;
61556                 unsigned rn = (instr >> 16) & 0xf;
61557                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61558                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61559                 eors(condition, Best, Register(rd), Register(rn), imm);
61560                 break;
61561               }
61562               case 0x00400000: {
61563                 // 0x02700000
61564                 if (((instr & 0xf0000000) == 0xf0000000)) {
61565                   UnallocatedA32(instr);
61566                   return;
61567                 }
61568                 Condition condition((instr >> 28) & 0xf);
61569                 unsigned rd = (instr >> 12) & 0xf;
61570                 unsigned rn = (instr >> 16) & 0xf;
61571                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61572                 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61573                 rsbs(condition, Best, Register(rd), Register(rn), imm);
61574                 break;
61575               }
61576             }
61577             break;
61578           }
61579           case 0x00800000: {
61580             // 0x02800000
61581             switch (instr & 0x00400000) {
61582               case 0x00000000: {
61583                 // 0x02800000
61584                 switch (instr & 0x000d0000) {
61585                   case 0x000d0000: {
61586                     // 0x028d0000
61587                     switch (instr & 0x00020000) {
61588                       case 0x00000000: {
61589                         // 0x028d0000
61590                         if (((instr & 0xf0000000) == 0xf0000000)) {
61591                           UnallocatedA32(instr);
61592                           return;
61593                         }
61594                         Condition condition((instr >> 28) & 0xf);
61595                         unsigned rd = (instr >> 12) & 0xf;
61596                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61597                         // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61598                         add(condition, Best, Register(rd), sp, imm);
61599                         break;
61600                       }
61601                       case 0x00020000: {
61602                         // 0x028f0000
61603                         if (((instr & 0xf0000000) == 0xf0000000)) {
61604                           UnallocatedA32(instr);
61605                           return;
61606                         }
61607                         Condition condition((instr >> 28) & 0xf);
61608                         unsigned rd = (instr >> 12) & 0xf;
61609                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61610                         Label label(imm, kA32PcDelta);
61611                         // ADR{<c>}{<q>} <Rd>, <label> ; A1
61612                         adr(condition, Best, Register(rd), &label);
61613                         break;
61614                       }
61615                     }
61616                     break;
61617                   }
61618                   default: {
61619                     if (((instr & 0xf0000000) == 0xf0000000) ||
61620                         ((instr & 0xd0000) == 0xd0000)) {
61621                       UnallocatedA32(instr);
61622                       return;
61623                     }
61624                     Condition condition((instr >> 28) & 0xf);
61625                     unsigned rd = (instr >> 12) & 0xf;
61626                     unsigned rn = (instr >> 16) & 0xf;
61627                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61628                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61629                     add(condition, Best, Register(rd), Register(rn), imm);
61630                     break;
61631                   }
61632                 }
61633                 break;
61634               }
61635               case 0x00400000: {
61636                 // 0x02c00000
61637                 if (((instr & 0xf0000000) == 0xf0000000)) {
61638                   UnallocatedA32(instr);
61639                   return;
61640                 }
61641                 Condition condition((instr >> 28) & 0xf);
61642                 unsigned rd = (instr >> 12) & 0xf;
61643                 unsigned rn = (instr >> 16) & 0xf;
61644                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61645                 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61646                 sbc(condition, Best, Register(rd), Register(rn), imm);
61647                 break;
61648               }
61649             }
61650             break;
61651           }
61652           case 0x00900000: {
61653             // 0x02900000
61654             switch (instr & 0x00400000) {
61655               case 0x00000000: {
61656                 // 0x02900000
61657                 switch (instr & 0x000f0000) {
61658                   case 0x000d0000: {
61659                     // 0x029d0000
61660                     if (((instr & 0xf0000000) == 0xf0000000)) {
61661                       UnallocatedA32(instr);
61662                       return;
61663                     }
61664                     Condition condition((instr >> 28) & 0xf);
61665                     unsigned rd = (instr >> 12) & 0xf;
61666                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61667                     // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
61668                     adds(condition, Best, Register(rd), sp, imm);
61669                     break;
61670                   }
61671                   default: {
61672                     if (((instr & 0xf0000000) == 0xf0000000) ||
61673                         ((instr & 0xf0000) == 0xd0000)) {
61674                       UnallocatedA32(instr);
61675                       return;
61676                     }
61677                     Condition condition((instr >> 28) & 0xf);
61678                     unsigned rd = (instr >> 12) & 0xf;
61679                     unsigned rn = (instr >> 16) & 0xf;
61680                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61681                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61682                     adds(condition, Best, Register(rd), Register(rn), imm);
61683                     break;
61684                   }
61685                 }
61686                 break;
61687               }
61688               case 0x00400000: {
61689                 // 0x02d00000
61690                 if (((instr & 0xf0000000) == 0xf0000000)) {
61691                   UnallocatedA32(instr);
61692                   return;
61693                 }
61694                 Condition condition((instr >> 28) & 0xf);
61695                 unsigned rd = (instr >> 12) & 0xf;
61696                 unsigned rn = (instr >> 16) & 0xf;
61697                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61698                 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61699                 sbcs(condition, Best, Register(rd), Register(rn), imm);
61700                 break;
61701               }
61702             }
61703             break;
61704           }
61705           case 0x00a00000: {
61706             // 0x02a00000
61707             switch (instr & 0x00400000) {
61708               case 0x00000000: {
61709                 // 0x02a00000
61710                 if (((instr & 0xf0000000) == 0xf0000000)) {
61711                   UnallocatedA32(instr);
61712                   return;
61713                 }
61714                 Condition condition((instr >> 28) & 0xf);
61715                 unsigned rd = (instr >> 12) & 0xf;
61716                 unsigned rn = (instr >> 16) & 0xf;
61717                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61718                 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61719                 adc(condition, Best, Register(rd), Register(rn), imm);
61720                 break;
61721               }
61722               case 0x00400000: {
61723                 // 0x02e00000
61724                 if (((instr & 0xf0000000) == 0xf0000000)) {
61725                   UnallocatedA32(instr);
61726                   return;
61727                 }
61728                 Condition condition((instr >> 28) & 0xf);
61729                 unsigned rd = (instr >> 12) & 0xf;
61730                 unsigned rn = (instr >> 16) & 0xf;
61731                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61732                 // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61733                 rsc(condition, Register(rd), Register(rn), imm);
61734                 break;
61735               }
61736             }
61737             break;
61738           }
61739           case 0x00b00000: {
61740             // 0x02b00000
61741             switch (instr & 0x00400000) {
61742               case 0x00000000: {
61743                 // 0x02b00000
61744                 if (((instr & 0xf0000000) == 0xf0000000)) {
61745                   UnallocatedA32(instr);
61746                   return;
61747                 }
61748                 Condition condition((instr >> 28) & 0xf);
61749                 unsigned rd = (instr >> 12) & 0xf;
61750                 unsigned rn = (instr >> 16) & 0xf;
61751                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61752                 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61753                 adcs(condition, Best, Register(rd), Register(rn), imm);
61754                 break;
61755               }
61756               case 0x00400000: {
61757                 // 0x02f00000
61758                 if (((instr & 0xf0000000) == 0xf0000000)) {
61759                   UnallocatedA32(instr);
61760                   return;
61761                 }
61762                 Condition condition((instr >> 28) & 0xf);
61763                 unsigned rd = (instr >> 12) & 0xf;
61764                 unsigned rn = (instr >> 16) & 0xf;
61765                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61766                 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
61767                 rscs(condition, Register(rd), Register(rn), imm);
61768                 break;
61769               }
61770             }
61771             break;
61772           }
61773           case 0x01000000: {
61774             // 0x03000000
61775             switch (instr & 0x00400000) {
61776               case 0x00000000: {
61777                 // 0x03000000
61778                 if (((instr & 0xf0000000) == 0xf0000000)) {
61779                   UnallocatedA32(instr);
61780                   return;
61781                 }
61782                 Condition condition((instr >> 28) & 0xf);
61783                 unsigned rd = (instr >> 12) & 0xf;
61784                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
61785                 if (!ImmediateA32::IsImmediateA32(imm)) {
61786                   // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
61787                   mov(condition, Best, Register(rd), imm);
61788                 } else {
61789                   // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
61790                   movw(condition, Register(rd), imm);
61791                 }
61792                 break;
61793               }
61794               case 0x00400000: {
61795                 // 0x03400000
61796                 if (((instr & 0xf0000000) == 0xf0000000)) {
61797                   UnallocatedA32(instr);
61798                   return;
61799                 }
61800                 Condition condition((instr >> 28) & 0xf);
61801                 unsigned rd = (instr >> 12) & 0xf;
61802                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
61803                 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
61804                 movt(condition, Register(rd), imm);
61805                 break;
61806               }
61807             }
61808             break;
61809           }
61810           case 0x01100000: {
61811             // 0x03100000
61812             switch (instr & 0x00400000) {
61813               case 0x00000000: {
61814                 // 0x03100000
61815                 if (((instr & 0xf0000000) == 0xf0000000)) {
61816                   UnallocatedA32(instr);
61817                   return;
61818                 }
61819                 Condition condition((instr >> 28) & 0xf);
61820                 unsigned rn = (instr >> 16) & 0xf;
61821                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61822                 // TST{<c>}{<q>} <Rn>, #<const> ; A1
61823                 tst(condition, Best, Register(rn), imm);
61824                 if (((instr & 0xff0f000) != 0x3100000)) {
61825                   UnpredictableA32(instr);
61826                 }
61827                 break;
61828               }
61829               case 0x00400000: {
61830                 // 0x03500000
61831                 if (((instr & 0xf0000000) == 0xf0000000)) {
61832                   UnallocatedA32(instr);
61833                   return;
61834                 }
61835                 Condition condition((instr >> 28) & 0xf);
61836                 unsigned rn = (instr >> 16) & 0xf;
61837                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61838                 // CMP{<c>}{<q>} <Rn>, #<const> ; A1
61839                 cmp(condition, Best, Register(rn), imm);
61840                 if (((instr & 0xff0f000) != 0x3500000)) {
61841                   UnpredictableA32(instr);
61842                 }
61843                 break;
61844               }
61845             }
61846             break;
61847           }
61848           case 0x01200000: {
61849             // 0x03200000
61850             switch (instr & 0x004f0000) {
61851               case 0x00000000: {
61852                 // 0x03200000
61853                 switch (instr & 0x000000f0) {
61854                   case 0x00000000: {
61855                     // 0x03200000
61856                     switch (instr & 0x0000000f) {
61857                       case 0x00000000: {
61858                         // 0x03200000
61859                         if (((instr & 0xf0000000) == 0xf0000000)) {
61860                           UnallocatedA32(instr);
61861                           return;
61862                         }
61863                         Condition condition((instr >> 28) & 0xf);
61864                         // NOP{<c>}{<q>} ; A1
61865                         nop(condition, Best);
61866                         if (((instr & 0xfffffff) != 0x320f000)) {
61867                           UnpredictableA32(instr);
61868                         }
61869                         break;
61870                       }
61871                       case 0x00000001: {
61872                         // 0x03200001
61873                         if (((instr & 0xf0000000) == 0xf0000000)) {
61874                           UnallocatedA32(instr);
61875                           return;
61876                         }
61877                         Condition condition((instr >> 28) & 0xf);
61878                         // YIELD{<c>}{<q>} ; A1
61879                         yield(condition, Best);
61880                         if (((instr & 0xfffffff) != 0x320f001)) {
61881                           UnpredictableA32(instr);
61882                         }
61883                         break;
61884                       }
61885                       case 0x00000002: {
61886                         // 0x03200002
61887                         if (((instr & 0xf0000000) == 0xf0000000)) {
61888                           UnallocatedA32(instr);
61889                           return;
61890                         }
61891                         UnimplementedA32("WFE", instr);
61892                         break;
61893                       }
61894                       case 0x00000003: {
61895                         // 0x03200003
61896                         if (((instr & 0xf0000000) == 0xf0000000)) {
61897                           UnallocatedA32(instr);
61898                           return;
61899                         }
61900                         UnimplementedA32("WFI", instr);
61901                         break;
61902                       }
61903                       case 0x00000004: {
61904                         // 0x03200004
61905                         if (((instr & 0xf0000000) == 0xf0000000)) {
61906                           UnallocatedA32(instr);
61907                           return;
61908                         }
61909                         UnimplementedA32("SEV", instr);
61910                         break;
61911                       }
61912                       case 0x00000005: {
61913                         // 0x03200005
61914                         if (((instr & 0xf0000000) == 0xf0000000)) {
61915                           UnallocatedA32(instr);
61916                           return;
61917                         }
61918                         UnimplementedA32("SEVL", instr);
61919                         break;
61920                       }
61921                       default:
61922                         UnallocatedA32(instr);
61923                         break;
61924                     }
61925                     break;
61926                   }
61927                   case 0x000000f0: {
61928                     // 0x032000f0
61929                     if (((instr & 0xf0000000) == 0xf0000000)) {
61930                       UnallocatedA32(instr);
61931                       return;
61932                     }
61933                     UnimplementedA32("DBG", instr);
61934                     break;
61935                   }
61936                   default:
61937                     UnallocatedA32(instr);
61938                     break;
61939                 }
61940                 break;
61941               }
61942               default: {
61943                 if (((instr & 0xf0000000) == 0xf0000000) ||
61944                     ((instr & 0x4f0000) == 0x0)) {
61945                   UnallocatedA32(instr);
61946                   return;
61947                 }
61948                 Condition condition((instr >> 28) & 0xf);
61949                 unsigned spec_reg =
61950                     ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
61951                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61952                 // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
61953                 msr(condition, MaskedSpecialRegister(spec_reg), imm);
61954                 if (((instr & 0xfb0f000) != 0x320f000)) {
61955                   UnpredictableA32(instr);
61956                 }
61957                 break;
61958               }
61959             }
61960             break;
61961           }
61962           case 0x01300000: {
61963             // 0x03300000
61964             switch (instr & 0x00400000) {
61965               case 0x00000000: {
61966                 // 0x03300000
61967                 if (((instr & 0xf0000000) == 0xf0000000)) {
61968                   UnallocatedA32(instr);
61969                   return;
61970                 }
61971                 Condition condition((instr >> 28) & 0xf);
61972                 unsigned rn = (instr >> 16) & 0xf;
61973                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61974                 // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
61975                 teq(condition, Register(rn), imm);
61976                 if (((instr & 0xff0f000) != 0x3300000)) {
61977                   UnpredictableA32(instr);
61978                 }
61979                 break;
61980               }
61981               case 0x00400000: {
61982                 // 0x03700000
61983                 if (((instr & 0xf0000000) == 0xf0000000)) {
61984                   UnallocatedA32(instr);
61985                   return;
61986                 }
61987                 Condition condition((instr >> 28) & 0xf);
61988                 unsigned rn = (instr >> 16) & 0xf;
61989                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
61990                 // CMN{<c>}{<q>} <Rn>, #<const> ; A1
61991                 cmn(condition, Best, Register(rn), imm);
61992                 if (((instr & 0xff0f000) != 0x3700000)) {
61993                   UnpredictableA32(instr);
61994                 }
61995                 break;
61996               }
61997             }
61998             break;
61999           }
62000           case 0x01800000: {
62001             // 0x03800000
62002             switch (instr & 0x00400000) {
62003               case 0x00000000: {
62004                 // 0x03800000
62005                 if (((instr & 0xf0000000) == 0xf0000000)) {
62006                   UnallocatedA32(instr);
62007                   return;
62008                 }
62009                 Condition condition((instr >> 28) & 0xf);
62010                 unsigned rd = (instr >> 12) & 0xf;
62011                 unsigned rn = (instr >> 16) & 0xf;
62012                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62013                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62014                 orr(condition, Best, Register(rd), Register(rn), imm);
62015                 break;
62016               }
62017               case 0x00400000: {
62018                 // 0x03c00000
62019                 if (((instr & 0xf0000000) == 0xf0000000)) {
62020                   UnallocatedA32(instr);
62021                   return;
62022                 }
62023                 Condition condition((instr >> 28) & 0xf);
62024                 unsigned rd = (instr >> 12) & 0xf;
62025                 unsigned rn = (instr >> 16) & 0xf;
62026                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62027                 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62028                 bic(condition, Best, Register(rd), Register(rn), imm);
62029                 break;
62030               }
62031             }
62032             break;
62033           }
62034           case 0x01900000: {
62035             // 0x03900000
62036             switch (instr & 0x00400000) {
62037               case 0x00000000: {
62038                 // 0x03900000
62039                 if (((instr & 0xf0000000) == 0xf0000000)) {
62040                   UnallocatedA32(instr);
62041                   return;
62042                 }
62043                 Condition condition((instr >> 28) & 0xf);
62044                 unsigned rd = (instr >> 12) & 0xf;
62045                 unsigned rn = (instr >> 16) & 0xf;
62046                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62047                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62048                 orrs(condition, Best, Register(rd), Register(rn), imm);
62049                 break;
62050               }
62051               case 0x00400000: {
62052                 // 0x03d00000
62053                 if (((instr & 0xf0000000) == 0xf0000000)) {
62054                   UnallocatedA32(instr);
62055                   return;
62056                 }
62057                 Condition condition((instr >> 28) & 0xf);
62058                 unsigned rd = (instr >> 12) & 0xf;
62059                 unsigned rn = (instr >> 16) & 0xf;
62060                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62061                 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
62062                 bics(condition, Best, Register(rd), Register(rn), imm);
62063                 break;
62064               }
62065             }
62066             break;
62067           }
62068           case 0x01a00000: {
62069             // 0x03a00000
62070             switch (instr & 0x00400000) {
62071               case 0x00000000: {
62072                 // 0x03a00000
62073                 if (((instr & 0xf0000000) == 0xf0000000)) {
62074                   UnallocatedA32(instr);
62075                   return;
62076                 }
62077                 Condition condition((instr >> 28) & 0xf);
62078                 unsigned rd = (instr >> 12) & 0xf;
62079                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62080                 // MOV{<c>}{<q>} <Rd>, #<const> ; A1
62081                 mov(condition, Best, Register(rd), imm);
62082                 if (((instr & 0xfff0000) != 0x3a00000)) {
62083                   UnpredictableA32(instr);
62084                 }
62085                 break;
62086               }
62087               case 0x00400000: {
62088                 // 0x03e00000
62089                 if (((instr & 0xf0000000) == 0xf0000000)) {
62090                   UnallocatedA32(instr);
62091                   return;
62092                 }
62093                 Condition condition((instr >> 28) & 0xf);
62094                 unsigned rd = (instr >> 12) & 0xf;
62095                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62096                 // MVN{<c>}{<q>} <Rd>, #<const> ; A1
62097                 mvn(condition, Best, Register(rd), imm);
62098                 if (((instr & 0xfff0000) != 0x3e00000)) {
62099                   UnpredictableA32(instr);
62100                 }
62101                 break;
62102               }
62103             }
62104             break;
62105           }
62106           case 0x01b00000: {
62107             // 0x03b00000
62108             switch (instr & 0x00400000) {
62109               case 0x00000000: {
62110                 // 0x03b00000
62111                 if (((instr & 0xf0000000) == 0xf0000000)) {
62112                   UnallocatedA32(instr);
62113                   return;
62114                 }
62115                 Condition condition((instr >> 28) & 0xf);
62116                 unsigned rd = (instr >> 12) & 0xf;
62117                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62118                 // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
62119                 movs(condition, Best, Register(rd), imm);
62120                 if (((instr & 0xfff0000) != 0x3b00000)) {
62121                   UnpredictableA32(instr);
62122                 }
62123                 break;
62124               }
62125               case 0x00400000: {
62126                 // 0x03f00000
62127                 if (((instr & 0xf0000000) == 0xf0000000)) {
62128                   UnallocatedA32(instr);
62129                   return;
62130                 }
62131                 Condition condition((instr >> 28) & 0xf);
62132                 unsigned rd = (instr >> 12) & 0xf;
62133                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
62134                 // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
62135                 mvns(condition, Best, Register(rd), imm);
62136                 if (((instr & 0xfff0000) != 0x3f00000)) {
62137                   UnpredictableA32(instr);
62138                 }
62139                 break;
62140               }
62141             }
62142             break;
62143           }
62144         }
62145         break;
62146       }
62147       case 0x04000000: {
62148         // 0x04000000
62149         switch (instr & 0x00500000) {
62150           case 0x00000000: {
62151             // 0x04000000
62152             switch (instr & 0x01200000) {
62153               case 0x00000000: {
62154                 // 0x04000000
62155                 if (((instr & 0xf0000000) == 0xf0000000)) {
62156                   UnallocatedA32(instr);
62157                   return;
62158                 }
62159                 Condition condition((instr >> 28) & 0xf);
62160                 unsigned rt = (instr >> 12) & 0xf;
62161                 unsigned rn = (instr >> 16) & 0xf;
62162                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62163                 int32_t offset = instr & 0xfff;
62164                 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62165                 str(condition,
62166                     Best,
62167                     Register(rt),
62168                     MemOperand(Register(rn), sign, offset, PostIndex));
62169                 break;
62170               }
62171               case 0x00200000: {
62172                 // 0x04200000
62173                 if (((instr & 0xf0000000) == 0xf0000000)) {
62174                   UnallocatedA32(instr);
62175                   return;
62176                 }
62177                 UnimplementedA32("STRT", instr);
62178                 break;
62179               }
62180               case 0x01000000: {
62181                 // 0x05000000
62182                 if (((instr & 0xf0000000) == 0xf0000000)) {
62183                   UnallocatedA32(instr);
62184                   return;
62185                 }
62186                 Condition condition((instr >> 28) & 0xf);
62187                 unsigned rt = (instr >> 12) & 0xf;
62188                 unsigned rn = (instr >> 16) & 0xf;
62189                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62190                 int32_t offset = instr & 0xfff;
62191                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62192                 str(condition,
62193                     Best,
62194                     Register(rt),
62195                     MemOperand(Register(rn), sign, offset, Offset));
62196                 break;
62197               }
62198               case 0x01200000: {
62199                 // 0x05200000
62200                 if (((instr & 0xf0000000) == 0xf0000000)) {
62201                   UnallocatedA32(instr);
62202                   return;
62203                 }
62204                 if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
62205                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
62206                     ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
62207                     ((instr & 0xf0000000) != 0xf0000000)) {
62208                   Condition condition((instr >> 28) & 0xf);
62209                   unsigned rt = (instr >> 12) & 0xf;
62210                   // PUSH{<c>}{<q>} <single_register_list> ; A1
62211                   push(condition, Best, Register(rt));
62212                   return;
62213                 }
62214                 Condition condition((instr >> 28) & 0xf);
62215                 unsigned rt = (instr >> 12) & 0xf;
62216                 unsigned rn = (instr >> 16) & 0xf;
62217                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62218                 int32_t offset = instr & 0xfff;
62219                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62220                 str(condition,
62221                     Best,
62222                     Register(rt),
62223                     MemOperand(Register(rn), sign, offset, PreIndex));
62224                 break;
62225               }
62226             }
62227             break;
62228           }
62229           case 0x00100000: {
62230             // 0x04100000
62231             switch (instr & 0x01200000) {
62232               case 0x00000000: {
62233                 // 0x04100000
62234                 switch (instr & 0x000f0000) {
62235                   case 0x000f0000: {
62236                     // 0x041f0000
62237                     if (((instr & 0xf0000000) == 0xf0000000) ||
62238                         ((instr & 0x1200000) == 0x200000)) {
62239                       UnallocatedA32(instr);
62240                       return;
62241                     }
62242                     Condition condition((instr >> 28) & 0xf);
62243                     unsigned rt = (instr >> 12) & 0xf;
62244                     uint32_t U = (instr >> 23) & 0x1;
62245                     int32_t imm = instr & 0xfff;
62246                     if (U == 0) imm = -imm;
62247                     bool minus_zero = (imm == 0) && (U == 0);
62248                     Label label(imm, kA32PcDelta, minus_zero);
62249                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
62250                     ldr(condition, Best, Register(rt), &label);
62251                     if (((instr & 0xf7f0000) != 0x51f0000)) {
62252                       UnpredictableA32(instr);
62253                     }
62254                     break;
62255                   }
62256                   default: {
62257                     if (((instr & 0xf0000000) == 0xf0000000) ||
62258                         ((instr & 0xf0000) == 0xf0000)) {
62259                       UnallocatedA32(instr);
62260                       return;
62261                     }
62262                     if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
62263                          Uint32(0x1)) &&
62264                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
62265                          Uint32(0xd)) &&
62266                         ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
62267                         ((instr & 0xf0000000) != 0xf0000000)) {
62268                       Condition condition((instr >> 28) & 0xf);
62269                       unsigned rt = (instr >> 12) & 0xf;
62270                       // POP{<c>}{<q>} <single_register_list> ; A1
62271                       pop(condition, Best, Register(rt));
62272                       return;
62273                     }
62274                     Condition condition((instr >> 28) & 0xf);
62275                     unsigned rt = (instr >> 12) & 0xf;
62276                     unsigned rn = (instr >> 16) & 0xf;
62277                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62278                     int32_t offset = instr & 0xfff;
62279                     // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62280                     ldr(condition,
62281                         Best,
62282                         Register(rt),
62283                         MemOperand(Register(rn), sign, offset, PostIndex));
62284                     break;
62285                   }
62286                 }
62287                 break;
62288               }
62289               case 0x00200000: {
62290                 // 0x04300000
62291                 if (((instr & 0xf0000000) == 0xf0000000)) {
62292                   UnallocatedA32(instr);
62293                   return;
62294                 }
62295                 UnimplementedA32("LDRT", instr);
62296                 break;
62297               }
62298               case 0x01000000: {
62299                 // 0x05100000
62300                 switch (instr & 0x000f0000) {
62301                   case 0x000f0000: {
62302                     // 0x051f0000
62303                     if (((instr & 0xf0000000) == 0xf0000000) ||
62304                         ((instr & 0x1200000) == 0x200000)) {
62305                       UnallocatedA32(instr);
62306                       return;
62307                     }
62308                     Condition condition((instr >> 28) & 0xf);
62309                     unsigned rt = (instr >> 12) & 0xf;
62310                     uint32_t U = (instr >> 23) & 0x1;
62311                     int32_t imm = instr & 0xfff;
62312                     if (U == 0) imm = -imm;
62313                     bool minus_zero = (imm == 0) && (U == 0);
62314                     Label label(imm, kA32PcDelta, minus_zero);
62315                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
62316                     ldr(condition, Best, Register(rt), &label);
62317                     if (((instr & 0xf7f0000) != 0x51f0000)) {
62318                       UnpredictableA32(instr);
62319                     }
62320                     break;
62321                   }
62322                   default: {
62323                     if (((instr & 0xf0000000) == 0xf0000000) ||
62324                         ((instr & 0xf0000) == 0xf0000)) {
62325                       UnallocatedA32(instr);
62326                       return;
62327                     }
62328                     Condition condition((instr >> 28) & 0xf);
62329                     unsigned rt = (instr >> 12) & 0xf;
62330                     unsigned rn = (instr >> 16) & 0xf;
62331                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62332                     int32_t offset = instr & 0xfff;
62333                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62334                     ldr(condition,
62335                         Best,
62336                         Register(rt),
62337                         MemOperand(Register(rn), sign, offset, Offset));
62338                     break;
62339                   }
62340                 }
62341                 break;
62342               }
62343               case 0x01200000: {
62344                 // 0x05300000
62345                 switch (instr & 0x000f0000) {
62346                   case 0x000f0000: {
62347                     // 0x053f0000
62348                     if (((instr & 0xf0000000) == 0xf0000000) ||
62349                         ((instr & 0x1200000) == 0x200000)) {
62350                       UnallocatedA32(instr);
62351                       return;
62352                     }
62353                     Condition condition((instr >> 28) & 0xf);
62354                     unsigned rt = (instr >> 12) & 0xf;
62355                     uint32_t U = (instr >> 23) & 0x1;
62356                     int32_t imm = instr & 0xfff;
62357                     if (U == 0) imm = -imm;
62358                     bool minus_zero = (imm == 0) && (U == 0);
62359                     Label label(imm, kA32PcDelta, minus_zero);
62360                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
62361                     ldr(condition, Best, Register(rt), &label);
62362                     if (((instr & 0xf7f0000) != 0x51f0000)) {
62363                       UnpredictableA32(instr);
62364                     }
62365                     break;
62366                   }
62367                   default: {
62368                     if (((instr & 0xf0000000) == 0xf0000000) ||
62369                         ((instr & 0xf0000) == 0xf0000)) {
62370                       UnallocatedA32(instr);
62371                       return;
62372                     }
62373                     Condition condition((instr >> 28) & 0xf);
62374                     unsigned rt = (instr >> 12) & 0xf;
62375                     unsigned rn = (instr >> 16) & 0xf;
62376                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62377                     int32_t offset = instr & 0xfff;
62378                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62379                     ldr(condition,
62380                         Best,
62381                         Register(rt),
62382                         MemOperand(Register(rn), sign, offset, PreIndex));
62383                     break;
62384                   }
62385                 }
62386                 break;
62387               }
62388             }
62389             break;
62390           }
62391           case 0x00400000: {
62392             // 0x04400000
62393             switch (instr & 0x01200000) {
62394               case 0x00000000: {
62395                 // 0x04400000
62396                 if (((instr & 0xf0000000) == 0xf0000000)) {
62397                   UnallocatedA32(instr);
62398                   return;
62399                 }
62400                 Condition condition((instr >> 28) & 0xf);
62401                 unsigned rt = (instr >> 12) & 0xf;
62402                 unsigned rn = (instr >> 16) & 0xf;
62403                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62404                 int32_t offset = instr & 0xfff;
62405                 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62406                 strb(condition,
62407                      Best,
62408                      Register(rt),
62409                      MemOperand(Register(rn), sign, offset, PostIndex));
62410                 break;
62411               }
62412               case 0x00200000: {
62413                 // 0x04600000
62414                 if (((instr & 0xf0000000) == 0xf0000000)) {
62415                   UnallocatedA32(instr);
62416                   return;
62417                 }
62418                 UnimplementedA32("STRBT", instr);
62419                 break;
62420               }
62421               case 0x01000000: {
62422                 // 0x05400000
62423                 if (((instr & 0xf0000000) == 0xf0000000)) {
62424                   UnallocatedA32(instr);
62425                   return;
62426                 }
62427                 Condition condition((instr >> 28) & 0xf);
62428                 unsigned rt = (instr >> 12) & 0xf;
62429                 unsigned rn = (instr >> 16) & 0xf;
62430                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62431                 int32_t offset = instr & 0xfff;
62432                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62433                 strb(condition,
62434                      Best,
62435                      Register(rt),
62436                      MemOperand(Register(rn), sign, offset, Offset));
62437                 break;
62438               }
62439               case 0x01200000: {
62440                 // 0x05600000
62441                 if (((instr & 0xf0000000) == 0xf0000000)) {
62442                   UnallocatedA32(instr);
62443                   return;
62444                 }
62445                 Condition condition((instr >> 28) & 0xf);
62446                 unsigned rt = (instr >> 12) & 0xf;
62447                 unsigned rn = (instr >> 16) & 0xf;
62448                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62449                 int32_t offset = instr & 0xfff;
62450                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62451                 strb(condition,
62452                      Best,
62453                      Register(rt),
62454                      MemOperand(Register(rn), sign, offset, PreIndex));
62455                 break;
62456               }
62457             }
62458             break;
62459           }
62460           case 0x00500000: {
62461             // 0x04500000
62462             switch (instr & 0x01200000) {
62463               case 0x00000000: {
62464                 // 0x04500000
62465                 switch (instr & 0x000f0000) {
62466                   case 0x000f0000: {
62467                     // 0x045f0000
62468                     if (((instr & 0xf0000000) == 0xf0000000) ||
62469                         ((instr & 0x1200000) == 0x200000)) {
62470                       UnallocatedA32(instr);
62471                       return;
62472                     }
62473                     Condition condition((instr >> 28) & 0xf);
62474                     unsigned rt = (instr >> 12) & 0xf;
62475                     uint32_t U = (instr >> 23) & 0x1;
62476                     int32_t imm = instr & 0xfff;
62477                     if (U == 0) imm = -imm;
62478                     bool minus_zero = (imm == 0) && (U == 0);
62479                     Label label(imm, kA32PcDelta, minus_zero);
62480                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62481                     ldrb(condition, Register(rt), &label);
62482                     if (((instr & 0xf7f0000) != 0x55f0000)) {
62483                       UnpredictableA32(instr);
62484                     }
62485                     break;
62486                   }
62487                   default: {
62488                     if (((instr & 0xf0000000) == 0xf0000000) ||
62489                         ((instr & 0xf0000) == 0xf0000)) {
62490                       UnallocatedA32(instr);
62491                       return;
62492                     }
62493                     Condition condition((instr >> 28) & 0xf);
62494                     unsigned rt = (instr >> 12) & 0xf;
62495                     unsigned rn = (instr >> 16) & 0xf;
62496                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62497                     int32_t offset = instr & 0xfff;
62498                     // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
62499                     ldrb(condition,
62500                          Best,
62501                          Register(rt),
62502                          MemOperand(Register(rn), sign, offset, PostIndex));
62503                     break;
62504                   }
62505                 }
62506                 break;
62507               }
62508               case 0x00200000: {
62509                 // 0x04700000
62510                 if (((instr & 0xf0000000) == 0xf0000000)) {
62511                   UnallocatedA32(instr);
62512                   return;
62513                 }
62514                 UnimplementedA32("LDRBT", instr);
62515                 break;
62516               }
62517               case 0x01000000: {
62518                 // 0x05500000
62519                 switch (instr & 0x000f0000) {
62520                   case 0x000f0000: {
62521                     // 0x055f0000
62522                     if (((instr & 0xf0000000) == 0xf0000000) ||
62523                         ((instr & 0x1200000) == 0x200000)) {
62524                       UnallocatedA32(instr);
62525                       return;
62526                     }
62527                     Condition condition((instr >> 28) & 0xf);
62528                     unsigned rt = (instr >> 12) & 0xf;
62529                     uint32_t U = (instr >> 23) & 0x1;
62530                     int32_t imm = instr & 0xfff;
62531                     if (U == 0) imm = -imm;
62532                     bool minus_zero = (imm == 0) && (U == 0);
62533                     Label label(imm, kA32PcDelta, minus_zero);
62534                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62535                     ldrb(condition, Register(rt), &label);
62536                     if (((instr & 0xf7f0000) != 0x55f0000)) {
62537                       UnpredictableA32(instr);
62538                     }
62539                     break;
62540                   }
62541                   default: {
62542                     if (((instr & 0xf0000000) == 0xf0000000) ||
62543                         ((instr & 0xf0000) == 0xf0000)) {
62544                       UnallocatedA32(instr);
62545                       return;
62546                     }
62547                     Condition condition((instr >> 28) & 0xf);
62548                     unsigned rt = (instr >> 12) & 0xf;
62549                     unsigned rn = (instr >> 16) & 0xf;
62550                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62551                     int32_t offset = instr & 0xfff;
62552                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
62553                     ldrb(condition,
62554                          Best,
62555                          Register(rt),
62556                          MemOperand(Register(rn), sign, offset, Offset));
62557                     break;
62558                   }
62559                 }
62560                 break;
62561               }
62562               case 0x01200000: {
62563                 // 0x05700000
62564                 switch (instr & 0x000f0000) {
62565                   case 0x000f0000: {
62566                     // 0x057f0000
62567                     if (((instr & 0xf0000000) == 0xf0000000) ||
62568                         ((instr & 0x1200000) == 0x200000)) {
62569                       UnallocatedA32(instr);
62570                       return;
62571                     }
62572                     Condition condition((instr >> 28) & 0xf);
62573                     unsigned rt = (instr >> 12) & 0xf;
62574                     uint32_t U = (instr >> 23) & 0x1;
62575                     int32_t imm = instr & 0xfff;
62576                     if (U == 0) imm = -imm;
62577                     bool minus_zero = (imm == 0) && (U == 0);
62578                     Label label(imm, kA32PcDelta, minus_zero);
62579                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
62580                     ldrb(condition, Register(rt), &label);
62581                     if (((instr & 0xf7f0000) != 0x55f0000)) {
62582                       UnpredictableA32(instr);
62583                     }
62584                     break;
62585                   }
62586                   default: {
62587                     if (((instr & 0xf0000000) == 0xf0000000) ||
62588                         ((instr & 0xf0000) == 0xf0000)) {
62589                       UnallocatedA32(instr);
62590                       return;
62591                     }
62592                     Condition condition((instr >> 28) & 0xf);
62593                     unsigned rt = (instr >> 12) & 0xf;
62594                     unsigned rn = (instr >> 16) & 0xf;
62595                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
62596                     int32_t offset = instr & 0xfff;
62597                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
62598                     ldrb(condition,
62599                          Best,
62600                          Register(rt),
62601                          MemOperand(Register(rn), sign, offset, PreIndex));
62602                     break;
62603                   }
62604                 }
62605                 break;
62606               }
62607             }
62608             break;
62609           }
62610         }
62611         break;
62612       }
62613       case 0x06000000: {
62614         // 0x06000000
62615         switch (instr & 0x01600010) {
62616           case 0x00000000: {
62617             // 0x06000000
62618             switch (instr & 0x00100000) {
62619               case 0x00000000: {
62620                 // 0x06000000
62621                 if (((instr & 0xf0000000) == 0xf0000000)) {
62622                   UnallocatedA32(instr);
62623                   return;
62624                 }
62625                 Condition condition((instr >> 28) & 0xf);
62626                 unsigned rt = (instr >> 12) & 0xf;
62627                 unsigned rn = (instr >> 16) & 0xf;
62628                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62629                 unsigned rm = instr & 0xf;
62630                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62631                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62632                                                     (imm_and_type_ & 0x7c) >>
62633                                                         2);
62634                 Shift shift = shift_operand.GetShift();
62635                 uint32_t amount = shift_operand.GetAmount();
62636                 // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62637                 str(condition,
62638                     Best,
62639                     Register(rt),
62640                     MemOperand(Register(rn),
62641                                sign,
62642                                Register(rm),
62643                                shift,
62644                                amount,
62645                                PostIndex));
62646                 break;
62647               }
62648               case 0x00100000: {
62649                 // 0x06100000
62650                 if (((instr & 0xf0000000) == 0xf0000000)) {
62651                   UnallocatedA32(instr);
62652                   return;
62653                 }
62654                 Condition condition((instr >> 28) & 0xf);
62655                 unsigned rt = (instr >> 12) & 0xf;
62656                 unsigned rn = (instr >> 16) & 0xf;
62657                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
62658                 unsigned rm = instr & 0xf;
62659                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
62660                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
62661                                                     (imm_and_type_ & 0x7c) >>
62662                                                         2);
62663                 Shift shift = shift_operand.GetShift();
62664                 uint32_t amount = shift_operand.GetAmount();
62665                 // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
62666                 ldr(condition,
62667                     Best,
62668                     Register(rt),
62669                     MemOperand(Register(rn),
62670                                sign,
62671                                Register(rm),
62672                                shift,
62673                                amount,
62674                                PostIndex));
62675                 break;
62676               }
62677             }
62678             break;
62679           }
62680           case 0x00000010: {
62681             // 0x06000010
62682             switch (instr & 0x00900060) {
62683               case 0x00100000: {
62684                 // 0x06100010
62685                 switch (instr & 0x00000080) {
62686                   case 0x00000000: {
62687                     // 0x06100010
62688                     if (((instr & 0xf0000000) == 0xf0000000)) {
62689                       UnallocatedA32(instr);
62690                       return;
62691                     }
62692                     Condition condition((instr >> 28) & 0xf);
62693                     unsigned rd = (instr >> 12) & 0xf;
62694                     unsigned rn = (instr >> 16) & 0xf;
62695                     unsigned rm = instr & 0xf;
62696                     // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62697                     sadd16(condition, Register(rd), Register(rn), Register(rm));
62698                     if (((instr & 0xff00ff0) != 0x6100f10)) {
62699                       UnpredictableA32(instr);
62700                     }
62701                     break;
62702                   }
62703                   case 0x00000080: {
62704                     // 0x06100090
62705                     if (((instr & 0xf0000000) == 0xf0000000)) {
62706                       UnallocatedA32(instr);
62707                       return;
62708                     }
62709                     Condition condition((instr >> 28) & 0xf);
62710                     unsigned rd = (instr >> 12) & 0xf;
62711                     unsigned rn = (instr >> 16) & 0xf;
62712                     unsigned rm = instr & 0xf;
62713                     // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62714                     sadd8(condition, Register(rd), Register(rn), Register(rm));
62715                     if (((instr & 0xff00ff0) != 0x6100f90)) {
62716                       UnpredictableA32(instr);
62717                     }
62718                     break;
62719                   }
62720                 }
62721                 break;
62722               }
62723               case 0x00100020: {
62724                 // 0x06100030
62725                 if ((instr & 0x00000080) == 0x00000000) {
62726                   if (((instr & 0xf0000000) == 0xf0000000)) {
62727                     UnallocatedA32(instr);
62728                     return;
62729                   }
62730                   Condition condition((instr >> 28) & 0xf);
62731                   unsigned rd = (instr >> 12) & 0xf;
62732                   unsigned rn = (instr >> 16) & 0xf;
62733                   unsigned rm = instr & 0xf;
62734                   // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62735                   sasx(condition, Register(rd), Register(rn), Register(rm));
62736                   if (((instr & 0xff00ff0) != 0x6100f30)) {
62737                     UnpredictableA32(instr);
62738                   }
62739                 } else {
62740                   UnallocatedA32(instr);
62741                 }
62742                 break;
62743               }
62744               case 0x00100040: {
62745                 // 0x06100050
62746                 if ((instr & 0x00000080) == 0x00000000) {
62747                   if (((instr & 0xf0000000) == 0xf0000000)) {
62748                     UnallocatedA32(instr);
62749                     return;
62750                   }
62751                   Condition condition((instr >> 28) & 0xf);
62752                   unsigned rd = (instr >> 12) & 0xf;
62753                   unsigned rn = (instr >> 16) & 0xf;
62754                   unsigned rm = instr & 0xf;
62755                   // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62756                   ssax(condition, Register(rd), Register(rn), Register(rm));
62757                   if (((instr & 0xff00ff0) != 0x6100f50)) {
62758                     UnpredictableA32(instr);
62759                   }
62760                 } else {
62761                   UnallocatedA32(instr);
62762                 }
62763                 break;
62764               }
62765               case 0x00100060: {
62766                 // 0x06100070
62767                 switch (instr & 0x00000080) {
62768                   case 0x00000000: {
62769                     // 0x06100070
62770                     if (((instr & 0xf0000000) == 0xf0000000)) {
62771                       UnallocatedA32(instr);
62772                       return;
62773                     }
62774                     Condition condition((instr >> 28) & 0xf);
62775                     unsigned rd = (instr >> 12) & 0xf;
62776                     unsigned rn = (instr >> 16) & 0xf;
62777                     unsigned rm = instr & 0xf;
62778                     // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62779                     ssub16(condition, Register(rd), Register(rn), Register(rm));
62780                     if (((instr & 0xff00ff0) != 0x6100f70)) {
62781                       UnpredictableA32(instr);
62782                     }
62783                     break;
62784                   }
62785                   case 0x00000080: {
62786                     // 0x061000f0
62787                     if (((instr & 0xf0000000) == 0xf0000000)) {
62788                       UnallocatedA32(instr);
62789                       return;
62790                     }
62791                     Condition condition((instr >> 28) & 0xf);
62792                     unsigned rd = (instr >> 12) & 0xf;
62793                     unsigned rn = (instr >> 16) & 0xf;
62794                     unsigned rm = instr & 0xf;
62795                     // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62796                     ssub8(condition, Register(rd), Register(rn), Register(rm));
62797                     if (((instr & 0xff00ff0) != 0x6100ff0)) {
62798                       UnpredictableA32(instr);
62799                     }
62800                     break;
62801                   }
62802                 }
62803                 break;
62804               }
62805               case 0x00800000: {
62806                 // 0x06800010
62807                 if (((instr & 0xf0000000) == 0xf0000000)) {
62808                   UnallocatedA32(instr);
62809                   return;
62810                 }
62811                 Condition condition((instr >> 28) & 0xf);
62812                 unsigned rd = (instr >> 12) & 0xf;
62813                 unsigned rn = (instr >> 16) & 0xf;
62814                 unsigned rm = instr & 0xf;
62815                 uint32_t amount = (instr >> 7) & 0x1f;
62816                 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
62817                 pkhbt(condition,
62818                       Register(rd),
62819                       Register(rn),
62820                       Operand(Register(rm), LSL, amount));
62821                 break;
62822               }
62823               case 0x00800020: {
62824                 // 0x06800030
62825                 if ((instr & 0x00000080) == 0x00000080) {
62826                   if (((instr & 0xf0000000) == 0xf0000000)) {
62827                     UnallocatedA32(instr);
62828                     return;
62829                   }
62830                   Condition condition((instr >> 28) & 0xf);
62831                   unsigned rd = (instr >> 12) & 0xf;
62832                   unsigned rn = (instr >> 16) & 0xf;
62833                   unsigned rm = instr & 0xf;
62834                   // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62835                   sel(condition, Register(rd), Register(rn), Register(rm));
62836                   if (((instr & 0xff00ff0) != 0x6800fb0)) {
62837                     UnpredictableA32(instr);
62838                   }
62839                 } else {
62840                   UnallocatedA32(instr);
62841                 }
62842                 break;
62843               }
62844               case 0x00800040: {
62845                 // 0x06800050
62846                 if (((instr & 0xf0000000) == 0xf0000000)) {
62847                   UnallocatedA32(instr);
62848                   return;
62849                 }
62850                 Condition condition((instr >> 28) & 0xf);
62851                 unsigned rd = (instr >> 12) & 0xf;
62852                 unsigned rn = (instr >> 16) & 0xf;
62853                 unsigned rm = instr & 0xf;
62854                 uint32_t amount = (instr >> 7) & 0x1f;
62855                 if (amount == 0) amount = 32;
62856                 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
62857                 pkhtb(condition,
62858                       Register(rd),
62859                       Register(rn),
62860                       Operand(Register(rm), ASR, amount));
62861                 break;
62862               }
62863               case 0x00800060: {
62864                 // 0x06800070
62865                 switch (instr & 0x00000080) {
62866                   case 0x00000000: {
62867                     // 0x06800070
62868                     switch (instr & 0x000f0000) {
62869                       case 0x000f0000: {
62870                         // 0x068f0070
62871                         if (((instr & 0xf0000000) == 0xf0000000)) {
62872                           UnallocatedA32(instr);
62873                           return;
62874                         }
62875                         Condition condition((instr >> 28) & 0xf);
62876                         unsigned rd = (instr >> 12) & 0xf;
62877                         unsigned rm = instr & 0xf;
62878                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62879                         // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
62880                         sxtb16(condition,
62881                                Register(rd),
62882                                Operand(Register(rm), ROR, amount));
62883                         if (((instr & 0xfff03f0) != 0x68f0070)) {
62884                           UnpredictableA32(instr);
62885                         }
62886                         break;
62887                       }
62888                       default: {
62889                         if (((instr & 0xf0000000) == 0xf0000000) ||
62890                             ((instr & 0xf0000) == 0xf0000)) {
62891                           UnallocatedA32(instr);
62892                           return;
62893                         }
62894                         Condition condition((instr >> 28) & 0xf);
62895                         unsigned rd = (instr >> 12) & 0xf;
62896                         unsigned rn = (instr >> 16) & 0xf;
62897                         unsigned rm = instr & 0xf;
62898                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
62899                         // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
62900                         sxtab16(condition,
62901                                 Register(rd),
62902                                 Register(rn),
62903                                 Operand(Register(rm), ROR, amount));
62904                         if (((instr & 0xff003f0) != 0x6800070)) {
62905                           UnpredictableA32(instr);
62906                         }
62907                         break;
62908                       }
62909                     }
62910                     break;
62911                   }
62912                   default:
62913                     UnallocatedA32(instr);
62914                     break;
62915                 }
62916                 break;
62917               }
62918               default:
62919                 UnallocatedA32(instr);
62920                 break;
62921             }
62922             break;
62923           }
62924           case 0x00200000: {
62925             // 0x06200000
62926             switch (instr & 0x00100000) {
62927               case 0x00000000: {
62928                 // 0x06200000
62929                 if (((instr & 0xf0000000) == 0xf0000000)) {
62930                   UnallocatedA32(instr);
62931                   return;
62932                 }
62933                 UnimplementedA32("STRT", instr);
62934                 break;
62935               }
62936               case 0x00100000: {
62937                 // 0x06300000
62938                 if (((instr & 0xf0000000) == 0xf0000000)) {
62939                   UnallocatedA32(instr);
62940                   return;
62941                 }
62942                 UnimplementedA32("LDRT", instr);
62943                 break;
62944               }
62945             }
62946             break;
62947           }
62948           case 0x00200010: {
62949             // 0x06200010
62950             switch (instr & 0x00800060) {
62951               case 0x00000000: {
62952                 // 0x06200010
62953                 switch (instr & 0x00100080) {
62954                   case 0x00000000: {
62955                     // 0x06200010
62956                     if (((instr & 0xf0000000) == 0xf0000000)) {
62957                       UnallocatedA32(instr);
62958                       return;
62959                     }
62960                     Condition condition((instr >> 28) & 0xf);
62961                     unsigned rd = (instr >> 12) & 0xf;
62962                     unsigned rn = (instr >> 16) & 0xf;
62963                     unsigned rm = instr & 0xf;
62964                     // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62965                     qadd16(condition, Register(rd), Register(rn), Register(rm));
62966                     if (((instr & 0xff00ff0) != 0x6200f10)) {
62967                       UnpredictableA32(instr);
62968                     }
62969                     break;
62970                   }
62971                   case 0x00000080: {
62972                     // 0x06200090
62973                     if (((instr & 0xf0000000) == 0xf0000000)) {
62974                       UnallocatedA32(instr);
62975                       return;
62976                     }
62977                     Condition condition((instr >> 28) & 0xf);
62978                     unsigned rd = (instr >> 12) & 0xf;
62979                     unsigned rn = (instr >> 16) & 0xf;
62980                     unsigned rm = instr & 0xf;
62981                     // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62982                     qadd8(condition, Register(rd), Register(rn), Register(rm));
62983                     if (((instr & 0xff00ff0) != 0x6200f90)) {
62984                       UnpredictableA32(instr);
62985                     }
62986                     break;
62987                   }
62988                   case 0x00100000: {
62989                     // 0x06300010
62990                     if (((instr & 0xf0000000) == 0xf0000000)) {
62991                       UnallocatedA32(instr);
62992                       return;
62993                     }
62994                     Condition condition((instr >> 28) & 0xf);
62995                     unsigned rd = (instr >> 12) & 0xf;
62996                     unsigned rn = (instr >> 16) & 0xf;
62997                     unsigned rm = instr & 0xf;
62998                     // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
62999                     shadd16(condition,
63000                             Register(rd),
63001                             Register(rn),
63002                             Register(rm));
63003                     if (((instr & 0xff00ff0) != 0x6300f10)) {
63004                       UnpredictableA32(instr);
63005                     }
63006                     break;
63007                   }
63008                   case 0x00100080: {
63009                     // 0x06300090
63010                     if (((instr & 0xf0000000) == 0xf0000000)) {
63011                       UnallocatedA32(instr);
63012                       return;
63013                     }
63014                     Condition condition((instr >> 28) & 0xf);
63015                     unsigned rd = (instr >> 12) & 0xf;
63016                     unsigned rn = (instr >> 16) & 0xf;
63017                     unsigned rm = instr & 0xf;
63018                     // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63019                     shadd8(condition, Register(rd), Register(rn), Register(rm));
63020                     if (((instr & 0xff00ff0) != 0x6300f90)) {
63021                       UnpredictableA32(instr);
63022                     }
63023                     break;
63024                   }
63025                 }
63026                 break;
63027               }
63028               case 0x00000020: {
63029                 // 0x06200030
63030                 switch (instr & 0x00100080) {
63031                   case 0x00000000: {
63032                     // 0x06200030
63033                     if (((instr & 0xf0000000) == 0xf0000000)) {
63034                       UnallocatedA32(instr);
63035                       return;
63036                     }
63037                     Condition condition((instr >> 28) & 0xf);
63038                     unsigned rd = (instr >> 12) & 0xf;
63039                     unsigned rn = (instr >> 16) & 0xf;
63040                     unsigned rm = instr & 0xf;
63041                     // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63042                     qasx(condition, Register(rd), Register(rn), Register(rm));
63043                     if (((instr & 0xff00ff0) != 0x6200f30)) {
63044                       UnpredictableA32(instr);
63045                     }
63046                     break;
63047                   }
63048                   case 0x00100000: {
63049                     // 0x06300030
63050                     if (((instr & 0xf0000000) == 0xf0000000)) {
63051                       UnallocatedA32(instr);
63052                       return;
63053                     }
63054                     Condition condition((instr >> 28) & 0xf);
63055                     unsigned rd = (instr >> 12) & 0xf;
63056                     unsigned rn = (instr >> 16) & 0xf;
63057                     unsigned rm = instr & 0xf;
63058                     // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63059                     shasx(condition, Register(rd), Register(rn), Register(rm));
63060                     if (((instr & 0xff00ff0) != 0x6300f30)) {
63061                       UnpredictableA32(instr);
63062                     }
63063                     break;
63064                   }
63065                   default:
63066                     UnallocatedA32(instr);
63067                     break;
63068                 }
63069                 break;
63070               }
63071               case 0x00000040: {
63072                 // 0x06200050
63073                 switch (instr & 0x00100080) {
63074                   case 0x00000000: {
63075                     // 0x06200050
63076                     if (((instr & 0xf0000000) == 0xf0000000)) {
63077                       UnallocatedA32(instr);
63078                       return;
63079                     }
63080                     Condition condition((instr >> 28) & 0xf);
63081                     unsigned rd = (instr >> 12) & 0xf;
63082                     unsigned rn = (instr >> 16) & 0xf;
63083                     unsigned rm = instr & 0xf;
63084                     // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63085                     qsax(condition, Register(rd), Register(rn), Register(rm));
63086                     if (((instr & 0xff00ff0) != 0x6200f50)) {
63087                       UnpredictableA32(instr);
63088                     }
63089                     break;
63090                   }
63091                   case 0x00100000: {
63092                     // 0x06300050
63093                     if (((instr & 0xf0000000) == 0xf0000000)) {
63094                       UnallocatedA32(instr);
63095                       return;
63096                     }
63097                     Condition condition((instr >> 28) & 0xf);
63098                     unsigned rd = (instr >> 12) & 0xf;
63099                     unsigned rn = (instr >> 16) & 0xf;
63100                     unsigned rm = instr & 0xf;
63101                     // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63102                     shsax(condition, Register(rd), Register(rn), Register(rm));
63103                     if (((instr & 0xff00ff0) != 0x6300f50)) {
63104                       UnpredictableA32(instr);
63105                     }
63106                     break;
63107                   }
63108                   default:
63109                     UnallocatedA32(instr);
63110                     break;
63111                 }
63112                 break;
63113               }
63114               case 0x00000060: {
63115                 // 0x06200070
63116                 switch (instr & 0x00100080) {
63117                   case 0x00000000: {
63118                     // 0x06200070
63119                     if (((instr & 0xf0000000) == 0xf0000000)) {
63120                       UnallocatedA32(instr);
63121                       return;
63122                     }
63123                     Condition condition((instr >> 28) & 0xf);
63124                     unsigned rd = (instr >> 12) & 0xf;
63125                     unsigned rn = (instr >> 16) & 0xf;
63126                     unsigned rm = instr & 0xf;
63127                     // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63128                     qsub16(condition, Register(rd), Register(rn), Register(rm));
63129                     if (((instr & 0xff00ff0) != 0x6200f70)) {
63130                       UnpredictableA32(instr);
63131                     }
63132                     break;
63133                   }
63134                   case 0x00000080: {
63135                     // 0x062000f0
63136                     if (((instr & 0xf0000000) == 0xf0000000)) {
63137                       UnallocatedA32(instr);
63138                       return;
63139                     }
63140                     Condition condition((instr >> 28) & 0xf);
63141                     unsigned rd = (instr >> 12) & 0xf;
63142                     unsigned rn = (instr >> 16) & 0xf;
63143                     unsigned rm = instr & 0xf;
63144                     // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63145                     qsub8(condition, Register(rd), Register(rn), Register(rm));
63146                     if (((instr & 0xff00ff0) != 0x6200ff0)) {
63147                       UnpredictableA32(instr);
63148                     }
63149                     break;
63150                   }
63151                   case 0x00100000: {
63152                     // 0x06300070
63153                     if (((instr & 0xf0000000) == 0xf0000000)) {
63154                       UnallocatedA32(instr);
63155                       return;
63156                     }
63157                     Condition condition((instr >> 28) & 0xf);
63158                     unsigned rd = (instr >> 12) & 0xf;
63159                     unsigned rn = (instr >> 16) & 0xf;
63160                     unsigned rm = instr & 0xf;
63161                     // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63162                     shsub16(condition,
63163                             Register(rd),
63164                             Register(rn),
63165                             Register(rm));
63166                     if (((instr & 0xff00ff0) != 0x6300f70)) {
63167                       UnpredictableA32(instr);
63168                     }
63169                     break;
63170                   }
63171                   case 0x00100080: {
63172                     // 0x063000f0
63173                     if (((instr & 0xf0000000) == 0xf0000000)) {
63174                       UnallocatedA32(instr);
63175                       return;
63176                     }
63177                     Condition condition((instr >> 28) & 0xf);
63178                     unsigned rd = (instr >> 12) & 0xf;
63179                     unsigned rn = (instr >> 16) & 0xf;
63180                     unsigned rm = instr & 0xf;
63181                     // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63182                     shsub8(condition, Register(rd), Register(rn), Register(rm));
63183                     if (((instr & 0xff00ff0) != 0x6300ff0)) {
63184                       UnpredictableA32(instr);
63185                     }
63186                     break;
63187                   }
63188                 }
63189                 break;
63190               }
63191               case 0x00800000: {
63192                 // 0x06a00010
63193                 if (((instr & 0xf0000000) == 0xf0000000)) {
63194                   UnallocatedA32(instr);
63195                   return;
63196                 }
63197                 Condition condition((instr >> 28) & 0xf);
63198                 unsigned rd = (instr >> 12) & 0xf;
63199                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
63200                 unsigned rn = instr & 0xf;
63201                 uint32_t amount = (instr >> 7) & 0x1f;
63202                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
63203                 ssat(condition,
63204                      Register(rd),
63205                      imm,
63206                      Operand(Register(rn), LSL, amount));
63207                 break;
63208               }
63209               case 0x00800020: {
63210                 // 0x06a00030
63211                 switch (instr & 0x00100080) {
63212                   case 0x00000000: {
63213                     // 0x06a00030
63214                     if (((instr & 0xf0000000) == 0xf0000000)) {
63215                       UnallocatedA32(instr);
63216                       return;
63217                     }
63218                     Condition condition((instr >> 28) & 0xf);
63219                     unsigned rd = (instr >> 12) & 0xf;
63220                     uint32_t imm = ((instr >> 16) & 0xf) + 1;
63221                     unsigned rn = instr & 0xf;
63222                     // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
63223                     ssat16(condition, Register(rd), imm, Register(rn));
63224                     if (((instr & 0xff00ff0) != 0x6a00f30)) {
63225                       UnpredictableA32(instr);
63226                     }
63227                     break;
63228                   }
63229                   case 0x00100000: {
63230                     // 0x06b00030
63231                     if (((instr & 0xf0000000) == 0xf0000000)) {
63232                       UnallocatedA32(instr);
63233                       return;
63234                     }
63235                     Condition condition((instr >> 28) & 0xf);
63236                     unsigned rd = (instr >> 12) & 0xf;
63237                     unsigned rm = instr & 0xf;
63238                     // REV{<c>}{<q>} <Rd>, <Rm> ; A1
63239                     rev(condition, Best, Register(rd), Register(rm));
63240                     if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
63241                       UnpredictableA32(instr);
63242                     }
63243                     break;
63244                   }
63245                   case 0x00100080: {
63246                     // 0x06b000b0
63247                     if (((instr & 0xf0000000) == 0xf0000000)) {
63248                       UnallocatedA32(instr);
63249                       return;
63250                     }
63251                     Condition condition((instr >> 28) & 0xf);
63252                     unsigned rd = (instr >> 12) & 0xf;
63253                     unsigned rm = instr & 0xf;
63254                     // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
63255                     rev16(condition, Best, Register(rd), Register(rm));
63256                     if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
63257                       UnpredictableA32(instr);
63258                     }
63259                     break;
63260                   }
63261                   default:
63262                     UnallocatedA32(instr);
63263                     break;
63264                 }
63265                 break;
63266               }
63267               case 0x00800040: {
63268                 // 0x06a00050
63269                 if (((instr & 0xf0000000) == 0xf0000000)) {
63270                   UnallocatedA32(instr);
63271                   return;
63272                 }
63273                 Condition condition((instr >> 28) & 0xf);
63274                 unsigned rd = (instr >> 12) & 0xf;
63275                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
63276                 unsigned rn = instr & 0xf;
63277                 uint32_t amount = (instr >> 7) & 0x1f;
63278                 if (amount == 0) amount = 32;
63279                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
63280                 ssat(condition,
63281                      Register(rd),
63282                      imm,
63283                      Operand(Register(rn), ASR, amount));
63284                 break;
63285               }
63286               case 0x00800060: {
63287                 // 0x06a00070
63288                 switch (instr & 0x00100080) {
63289                   case 0x00000000: {
63290                     // 0x06a00070
63291                     switch (instr & 0x000f0000) {
63292                       case 0x000f0000: {
63293                         // 0x06af0070
63294                         if (((instr & 0xf0000000) == 0xf0000000)) {
63295                           UnallocatedA32(instr);
63296                           return;
63297                         }
63298                         Condition condition((instr >> 28) & 0xf);
63299                         unsigned rd = (instr >> 12) & 0xf;
63300                         unsigned rm = instr & 0xf;
63301                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63302                         // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63303                         sxtb(condition,
63304                              Best,
63305                              Register(rd),
63306                              Operand(Register(rm), ROR, amount));
63307                         if (((instr & 0xfff03f0) != 0x6af0070)) {
63308                           UnpredictableA32(instr);
63309                         }
63310                         break;
63311                       }
63312                       default: {
63313                         if (((instr & 0xf0000000) == 0xf0000000) ||
63314                             ((instr & 0xf0000) == 0xf0000)) {
63315                           UnallocatedA32(instr);
63316                           return;
63317                         }
63318                         Condition condition((instr >> 28) & 0xf);
63319                         unsigned rd = (instr >> 12) & 0xf;
63320                         unsigned rn = (instr >> 16) & 0xf;
63321                         unsigned rm = instr & 0xf;
63322                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63323                         // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63324                         sxtab(condition,
63325                               Register(rd),
63326                               Register(rn),
63327                               Operand(Register(rm), ROR, amount));
63328                         if (((instr & 0xff003f0) != 0x6a00070)) {
63329                           UnpredictableA32(instr);
63330                         }
63331                         break;
63332                       }
63333                     }
63334                     break;
63335                   }
63336                   case 0x00100000: {
63337                     // 0x06b00070
63338                     switch (instr & 0x000f0000) {
63339                       case 0x000f0000: {
63340                         // 0x06bf0070
63341                         if (((instr & 0xf0000000) == 0xf0000000)) {
63342                           UnallocatedA32(instr);
63343                           return;
63344                         }
63345                         Condition condition((instr >> 28) & 0xf);
63346                         unsigned rd = (instr >> 12) & 0xf;
63347                         unsigned rm = instr & 0xf;
63348                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63349                         // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63350                         sxth(condition,
63351                              Best,
63352                              Register(rd),
63353                              Operand(Register(rm), ROR, amount));
63354                         if (((instr & 0xfff03f0) != 0x6bf0070)) {
63355                           UnpredictableA32(instr);
63356                         }
63357                         break;
63358                       }
63359                       default: {
63360                         if (((instr & 0xf0000000) == 0xf0000000) ||
63361                             ((instr & 0xf0000) == 0xf0000)) {
63362                           UnallocatedA32(instr);
63363                           return;
63364                         }
63365                         Condition condition((instr >> 28) & 0xf);
63366                         unsigned rd = (instr >> 12) & 0xf;
63367                         unsigned rn = (instr >> 16) & 0xf;
63368                         unsigned rm = instr & 0xf;
63369                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63370                         // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63371                         sxtah(condition,
63372                               Register(rd),
63373                               Register(rn),
63374                               Operand(Register(rm), ROR, amount));
63375                         if (((instr & 0xff003f0) != 0x6b00070)) {
63376                           UnpredictableA32(instr);
63377                         }
63378                         break;
63379                       }
63380                     }
63381                     break;
63382                   }
63383                   default:
63384                     UnallocatedA32(instr);
63385                     break;
63386                 }
63387                 break;
63388               }
63389             }
63390             break;
63391           }
63392           case 0x00400000: {
63393             // 0x06400000
63394             switch (instr & 0x00100000) {
63395               case 0x00000000: {
63396                 // 0x06400000
63397                 if (((instr & 0xf0000000) == 0xf0000000)) {
63398                   UnallocatedA32(instr);
63399                   return;
63400                 }
63401                 Condition condition((instr >> 28) & 0xf);
63402                 unsigned rt = (instr >> 12) & 0xf;
63403                 unsigned rn = (instr >> 16) & 0xf;
63404                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63405                 unsigned rm = instr & 0xf;
63406                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63407                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63408                                                     (imm_and_type_ & 0x7c) >>
63409                                                         2);
63410                 Shift shift = shift_operand.GetShift();
63411                 uint32_t amount = shift_operand.GetAmount();
63412                 // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63413                 strb(condition,
63414                      Best,
63415                      Register(rt),
63416                      MemOperand(Register(rn),
63417                                 sign,
63418                                 Register(rm),
63419                                 shift,
63420                                 amount,
63421                                 PostIndex));
63422                 break;
63423               }
63424               case 0x00100000: {
63425                 // 0x06500000
63426                 if (((instr & 0xf0000000) == 0xf0000000)) {
63427                   UnallocatedA32(instr);
63428                   return;
63429                 }
63430                 Condition condition((instr >> 28) & 0xf);
63431                 unsigned rt = (instr >> 12) & 0xf;
63432                 unsigned rn = (instr >> 16) & 0xf;
63433                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
63434                 unsigned rm = instr & 0xf;
63435                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
63436                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
63437                                                     (imm_and_type_ & 0x7c) >>
63438                                                         2);
63439                 Shift shift = shift_operand.GetShift();
63440                 uint32_t amount = shift_operand.GetAmount();
63441                 // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
63442                 ldrb(condition,
63443                      Best,
63444                      Register(rt),
63445                      MemOperand(Register(rn),
63446                                 sign,
63447                                 Register(rm),
63448                                 shift,
63449                                 amount,
63450                                 PostIndex));
63451                 break;
63452               }
63453             }
63454             break;
63455           }
63456           case 0x00400010: {
63457             // 0x06400010
63458             switch (instr & 0x009000e0) {
63459               case 0x00100000: {
63460                 // 0x06500010
63461                 if (((instr & 0xf0000000) == 0xf0000000)) {
63462                   UnallocatedA32(instr);
63463                   return;
63464                 }
63465                 Condition condition((instr >> 28) & 0xf);
63466                 unsigned rd = (instr >> 12) & 0xf;
63467                 unsigned rn = (instr >> 16) & 0xf;
63468                 unsigned rm = instr & 0xf;
63469                 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63470                 uadd16(condition, Register(rd), Register(rn), Register(rm));
63471                 if (((instr & 0xff00ff0) != 0x6500f10)) {
63472                   UnpredictableA32(instr);
63473                 }
63474                 break;
63475               }
63476               case 0x00100020: {
63477                 // 0x06500030
63478                 if (((instr & 0xf0000000) == 0xf0000000)) {
63479                   UnallocatedA32(instr);
63480                   return;
63481                 }
63482                 Condition condition((instr >> 28) & 0xf);
63483                 unsigned rd = (instr >> 12) & 0xf;
63484                 unsigned rn = (instr >> 16) & 0xf;
63485                 unsigned rm = instr & 0xf;
63486                 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63487                 uasx(condition, Register(rd), Register(rn), Register(rm));
63488                 if (((instr & 0xff00ff0) != 0x6500f30)) {
63489                   UnpredictableA32(instr);
63490                 }
63491                 break;
63492               }
63493               case 0x00100040: {
63494                 // 0x06500050
63495                 if (((instr & 0xf0000000) == 0xf0000000)) {
63496                   UnallocatedA32(instr);
63497                   return;
63498                 }
63499                 Condition condition((instr >> 28) & 0xf);
63500                 unsigned rd = (instr >> 12) & 0xf;
63501                 unsigned rn = (instr >> 16) & 0xf;
63502                 unsigned rm = instr & 0xf;
63503                 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63504                 usax(condition, Register(rd), Register(rn), Register(rm));
63505                 if (((instr & 0xff00ff0) != 0x6500f50)) {
63506                   UnpredictableA32(instr);
63507                 }
63508                 break;
63509               }
63510               case 0x00100060: {
63511                 // 0x06500070
63512                 if (((instr & 0xf0000000) == 0xf0000000)) {
63513                   UnallocatedA32(instr);
63514                   return;
63515                 }
63516                 Condition condition((instr >> 28) & 0xf);
63517                 unsigned rd = (instr >> 12) & 0xf;
63518                 unsigned rn = (instr >> 16) & 0xf;
63519                 unsigned rm = instr & 0xf;
63520                 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63521                 usub16(condition, Register(rd), Register(rn), Register(rm));
63522                 if (((instr & 0xff00ff0) != 0x6500f70)) {
63523                   UnpredictableA32(instr);
63524                 }
63525                 break;
63526               }
63527               case 0x00100080: {
63528                 // 0x06500090
63529                 if (((instr & 0xf0000000) == 0xf0000000)) {
63530                   UnallocatedA32(instr);
63531                   return;
63532                 }
63533                 Condition condition((instr >> 28) & 0xf);
63534                 unsigned rd = (instr >> 12) & 0xf;
63535                 unsigned rn = (instr >> 16) & 0xf;
63536                 unsigned rm = instr & 0xf;
63537                 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63538                 uadd8(condition, Register(rd), Register(rn), Register(rm));
63539                 if (((instr & 0xff00ff0) != 0x6500f90)) {
63540                   UnpredictableA32(instr);
63541                 }
63542                 break;
63543               }
63544               case 0x001000e0: {
63545                 // 0x065000f0
63546                 if (((instr & 0xf0000000) == 0xf0000000)) {
63547                   UnallocatedA32(instr);
63548                   return;
63549                 }
63550                 Condition condition((instr >> 28) & 0xf);
63551                 unsigned rd = (instr >> 12) & 0xf;
63552                 unsigned rn = (instr >> 16) & 0xf;
63553                 unsigned rm = instr & 0xf;
63554                 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63555                 usub8(condition, Register(rd), Register(rn), Register(rm));
63556                 if (((instr & 0xff00ff0) != 0x6500ff0)) {
63557                   UnpredictableA32(instr);
63558                 }
63559                 break;
63560               }
63561               case 0x00800060: {
63562                 // 0x06c00070
63563                 switch (instr & 0x000f0000) {
63564                   case 0x000f0000: {
63565                     // 0x06cf0070
63566                     if (((instr & 0xf0000000) == 0xf0000000)) {
63567                       UnallocatedA32(instr);
63568                       return;
63569                     }
63570                     Condition condition((instr >> 28) & 0xf);
63571                     unsigned rd = (instr >> 12) & 0xf;
63572                     unsigned rm = instr & 0xf;
63573                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
63574                     // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63575                     uxtb16(condition,
63576                            Register(rd),
63577                            Operand(Register(rm), ROR, amount));
63578                     if (((instr & 0xfff03f0) != 0x6cf0070)) {
63579                       UnpredictableA32(instr);
63580                     }
63581                     break;
63582                   }
63583                   default: {
63584                     if (((instr & 0xf0000000) == 0xf0000000) ||
63585                         ((instr & 0xf0000) == 0xf0000)) {
63586                       UnallocatedA32(instr);
63587                       return;
63588                     }
63589                     Condition condition((instr >> 28) & 0xf);
63590                     unsigned rd = (instr >> 12) & 0xf;
63591                     unsigned rn = (instr >> 16) & 0xf;
63592                     unsigned rm = instr & 0xf;
63593                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
63594                     // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
63595                     uxtab16(condition,
63596                             Register(rd),
63597                             Register(rn),
63598                             Operand(Register(rm), ROR, amount));
63599                     if (((instr & 0xff003f0) != 0x6c00070)) {
63600                       UnpredictableA32(instr);
63601                     }
63602                     break;
63603                   }
63604                 }
63605                 break;
63606               }
63607               default:
63608                 UnallocatedA32(instr);
63609                 break;
63610             }
63611             break;
63612           }
63613           case 0x00600000: {
63614             // 0x06600000
63615             switch (instr & 0x00100000) {
63616               case 0x00000000: {
63617                 // 0x06600000
63618                 if (((instr & 0xf0000000) == 0xf0000000)) {
63619                   UnallocatedA32(instr);
63620                   return;
63621                 }
63622                 UnimplementedA32("STRBT", instr);
63623                 break;
63624               }
63625               case 0x00100000: {
63626                 // 0x06700000
63627                 if (((instr & 0xf0000000) == 0xf0000000)) {
63628                   UnallocatedA32(instr);
63629                   return;
63630                 }
63631                 UnimplementedA32("LDRBT", instr);
63632                 break;
63633               }
63634             }
63635             break;
63636           }
63637           case 0x00600010: {
63638             // 0x06600010
63639             switch (instr & 0x00800060) {
63640               case 0x00000000: {
63641                 // 0x06600010
63642                 switch (instr & 0x00100080) {
63643                   case 0x00000000: {
63644                     // 0x06600010
63645                     if (((instr & 0xf0000000) == 0xf0000000)) {
63646                       UnallocatedA32(instr);
63647                       return;
63648                     }
63649                     Condition condition((instr >> 28) & 0xf);
63650                     unsigned rd = (instr >> 12) & 0xf;
63651                     unsigned rn = (instr >> 16) & 0xf;
63652                     unsigned rm = instr & 0xf;
63653                     // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63654                     uqadd16(condition,
63655                             Register(rd),
63656                             Register(rn),
63657                             Register(rm));
63658                     if (((instr & 0xff00ff0) != 0x6600f10)) {
63659                       UnpredictableA32(instr);
63660                     }
63661                     break;
63662                   }
63663                   case 0x00000080: {
63664                     // 0x06600090
63665                     if (((instr & 0xf0000000) == 0xf0000000)) {
63666                       UnallocatedA32(instr);
63667                       return;
63668                     }
63669                     Condition condition((instr >> 28) & 0xf);
63670                     unsigned rd = (instr >> 12) & 0xf;
63671                     unsigned rn = (instr >> 16) & 0xf;
63672                     unsigned rm = instr & 0xf;
63673                     // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63674                     uqadd8(condition, Register(rd), Register(rn), Register(rm));
63675                     if (((instr & 0xff00ff0) != 0x6600f90)) {
63676                       UnpredictableA32(instr);
63677                     }
63678                     break;
63679                   }
63680                   case 0x00100000: {
63681                     // 0x06700010
63682                     if (((instr & 0xf0000000) == 0xf0000000)) {
63683                       UnallocatedA32(instr);
63684                       return;
63685                     }
63686                     Condition condition((instr >> 28) & 0xf);
63687                     unsigned rd = (instr >> 12) & 0xf;
63688                     unsigned rn = (instr >> 16) & 0xf;
63689                     unsigned rm = instr & 0xf;
63690                     // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63691                     uhadd16(condition,
63692                             Register(rd),
63693                             Register(rn),
63694                             Register(rm));
63695                     if (((instr & 0xff00ff0) != 0x6700f10)) {
63696                       UnpredictableA32(instr);
63697                     }
63698                     break;
63699                   }
63700                   case 0x00100080: {
63701                     // 0x06700090
63702                     if (((instr & 0xf0000000) == 0xf0000000)) {
63703                       UnallocatedA32(instr);
63704                       return;
63705                     }
63706                     Condition condition((instr >> 28) & 0xf);
63707                     unsigned rd = (instr >> 12) & 0xf;
63708                     unsigned rn = (instr >> 16) & 0xf;
63709                     unsigned rm = instr & 0xf;
63710                     // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63711                     uhadd8(condition, Register(rd), Register(rn), Register(rm));
63712                     if (((instr & 0xff00ff0) != 0x6700f90)) {
63713                       UnpredictableA32(instr);
63714                     }
63715                     break;
63716                   }
63717                 }
63718                 break;
63719               }
63720               case 0x00000020: {
63721                 // 0x06600030
63722                 switch (instr & 0x00100080) {
63723                   case 0x00000000: {
63724                     // 0x06600030
63725                     if (((instr & 0xf0000000) == 0xf0000000)) {
63726                       UnallocatedA32(instr);
63727                       return;
63728                     }
63729                     Condition condition((instr >> 28) & 0xf);
63730                     unsigned rd = (instr >> 12) & 0xf;
63731                     unsigned rn = (instr >> 16) & 0xf;
63732                     unsigned rm = instr & 0xf;
63733                     // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63734                     uqasx(condition, Register(rd), Register(rn), Register(rm));
63735                     if (((instr & 0xff00ff0) != 0x6600f30)) {
63736                       UnpredictableA32(instr);
63737                     }
63738                     break;
63739                   }
63740                   case 0x00100000: {
63741                     // 0x06700030
63742                     if (((instr & 0xf0000000) == 0xf0000000)) {
63743                       UnallocatedA32(instr);
63744                       return;
63745                     }
63746                     Condition condition((instr >> 28) & 0xf);
63747                     unsigned rd = (instr >> 12) & 0xf;
63748                     unsigned rn = (instr >> 16) & 0xf;
63749                     unsigned rm = instr & 0xf;
63750                     // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63751                     uhasx(condition, Register(rd), Register(rn), Register(rm));
63752                     if (((instr & 0xff00ff0) != 0x6700f30)) {
63753                       UnpredictableA32(instr);
63754                     }
63755                     break;
63756                   }
63757                   default:
63758                     UnallocatedA32(instr);
63759                     break;
63760                 }
63761                 break;
63762               }
63763               case 0x00000040: {
63764                 // 0x06600050
63765                 switch (instr & 0x00100080) {
63766                   case 0x00000000: {
63767                     // 0x06600050
63768                     if (((instr & 0xf0000000) == 0xf0000000)) {
63769                       UnallocatedA32(instr);
63770                       return;
63771                     }
63772                     Condition condition((instr >> 28) & 0xf);
63773                     unsigned rd = (instr >> 12) & 0xf;
63774                     unsigned rn = (instr >> 16) & 0xf;
63775                     unsigned rm = instr & 0xf;
63776                     // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63777                     uqsax(condition, Register(rd), Register(rn), Register(rm));
63778                     if (((instr & 0xff00ff0) != 0x6600f50)) {
63779                       UnpredictableA32(instr);
63780                     }
63781                     break;
63782                   }
63783                   case 0x00100000: {
63784                     // 0x06700050
63785                     if (((instr & 0xf0000000) == 0xf0000000)) {
63786                       UnallocatedA32(instr);
63787                       return;
63788                     }
63789                     Condition condition((instr >> 28) & 0xf);
63790                     unsigned rd = (instr >> 12) & 0xf;
63791                     unsigned rn = (instr >> 16) & 0xf;
63792                     unsigned rm = instr & 0xf;
63793                     // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63794                     uhsax(condition, Register(rd), Register(rn), Register(rm));
63795                     if (((instr & 0xff00ff0) != 0x6700f50)) {
63796                       UnpredictableA32(instr);
63797                     }
63798                     break;
63799                   }
63800                   default:
63801                     UnallocatedA32(instr);
63802                     break;
63803                 }
63804                 break;
63805               }
63806               case 0x00000060: {
63807                 // 0x06600070
63808                 switch (instr & 0x00100080) {
63809                   case 0x00000000: {
63810                     // 0x06600070
63811                     if (((instr & 0xf0000000) == 0xf0000000)) {
63812                       UnallocatedA32(instr);
63813                       return;
63814                     }
63815                     Condition condition((instr >> 28) & 0xf);
63816                     unsigned rd = (instr >> 12) & 0xf;
63817                     unsigned rn = (instr >> 16) & 0xf;
63818                     unsigned rm = instr & 0xf;
63819                     // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63820                     uqsub16(condition,
63821                             Register(rd),
63822                             Register(rn),
63823                             Register(rm));
63824                     if (((instr & 0xff00ff0) != 0x6600f70)) {
63825                       UnpredictableA32(instr);
63826                     }
63827                     break;
63828                   }
63829                   case 0x00000080: {
63830                     // 0x066000f0
63831                     if (((instr & 0xf0000000) == 0xf0000000)) {
63832                       UnallocatedA32(instr);
63833                       return;
63834                     }
63835                     Condition condition((instr >> 28) & 0xf);
63836                     unsigned rd = (instr >> 12) & 0xf;
63837                     unsigned rn = (instr >> 16) & 0xf;
63838                     unsigned rm = instr & 0xf;
63839                     // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63840                     uqsub8(condition, Register(rd), Register(rn), Register(rm));
63841                     if (((instr & 0xff00ff0) != 0x6600ff0)) {
63842                       UnpredictableA32(instr);
63843                     }
63844                     break;
63845                   }
63846                   case 0x00100000: {
63847                     // 0x06700070
63848                     if (((instr & 0xf0000000) == 0xf0000000)) {
63849                       UnallocatedA32(instr);
63850                       return;
63851                     }
63852                     Condition condition((instr >> 28) & 0xf);
63853                     unsigned rd = (instr >> 12) & 0xf;
63854                     unsigned rn = (instr >> 16) & 0xf;
63855                     unsigned rm = instr & 0xf;
63856                     // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63857                     uhsub16(condition,
63858                             Register(rd),
63859                             Register(rn),
63860                             Register(rm));
63861                     if (((instr & 0xff00ff0) != 0x6700f70)) {
63862                       UnpredictableA32(instr);
63863                     }
63864                     break;
63865                   }
63866                   case 0x00100080: {
63867                     // 0x067000f0
63868                     if (((instr & 0xf0000000) == 0xf0000000)) {
63869                       UnallocatedA32(instr);
63870                       return;
63871                     }
63872                     Condition condition((instr >> 28) & 0xf);
63873                     unsigned rd = (instr >> 12) & 0xf;
63874                     unsigned rn = (instr >> 16) & 0xf;
63875                     unsigned rm = instr & 0xf;
63876                     // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
63877                     uhsub8(condition, Register(rd), Register(rn), Register(rm));
63878                     if (((instr & 0xff00ff0) != 0x6700ff0)) {
63879                       UnpredictableA32(instr);
63880                     }
63881                     break;
63882                   }
63883                 }
63884                 break;
63885               }
63886               case 0x00800000: {
63887                 // 0x06e00010
63888                 if (((instr & 0xf0000000) == 0xf0000000)) {
63889                   UnallocatedA32(instr);
63890                   return;
63891                 }
63892                 Condition condition((instr >> 28) & 0xf);
63893                 unsigned rd = (instr >> 12) & 0xf;
63894                 uint32_t imm = (instr >> 16) & 0x1f;
63895                 unsigned rn = instr & 0xf;
63896                 uint32_t amount = (instr >> 7) & 0x1f;
63897                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
63898                 usat(condition,
63899                      Register(rd),
63900                      imm,
63901                      Operand(Register(rn), LSL, amount));
63902                 break;
63903               }
63904               case 0x00800020: {
63905                 // 0x06e00030
63906                 switch (instr & 0x00100080) {
63907                   case 0x00000000: {
63908                     // 0x06e00030
63909                     if (((instr & 0xf0000000) == 0xf0000000)) {
63910                       UnallocatedA32(instr);
63911                       return;
63912                     }
63913                     Condition condition((instr >> 28) & 0xf);
63914                     unsigned rd = (instr >> 12) & 0xf;
63915                     uint32_t imm = (instr >> 16) & 0xf;
63916                     unsigned rn = instr & 0xf;
63917                     // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
63918                     usat16(condition, Register(rd), imm, Register(rn));
63919                     if (((instr & 0xff00ff0) != 0x6e00f30)) {
63920                       UnpredictableA32(instr);
63921                     }
63922                     break;
63923                   }
63924                   case 0x00100000: {
63925                     // 0x06f00030
63926                     if (((instr & 0xf0000000) == 0xf0000000)) {
63927                       UnallocatedA32(instr);
63928                       return;
63929                     }
63930                     Condition condition((instr >> 28) & 0xf);
63931                     unsigned rd = (instr >> 12) & 0xf;
63932                     unsigned rm = instr & 0xf;
63933                     // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
63934                     rbit(condition, Register(rd), Register(rm));
63935                     if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
63936                       UnpredictableA32(instr);
63937                     }
63938                     break;
63939                   }
63940                   case 0x00100080: {
63941                     // 0x06f000b0
63942                     if (((instr & 0xf0000000) == 0xf0000000)) {
63943                       UnallocatedA32(instr);
63944                       return;
63945                     }
63946                     Condition condition((instr >> 28) & 0xf);
63947                     unsigned rd = (instr >> 12) & 0xf;
63948                     unsigned rm = instr & 0xf;
63949                     // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
63950                     revsh(condition, Best, Register(rd), Register(rm));
63951                     if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
63952                       UnpredictableA32(instr);
63953                     }
63954                     break;
63955                   }
63956                   default:
63957                     UnallocatedA32(instr);
63958                     break;
63959                 }
63960                 break;
63961               }
63962               case 0x00800040: {
63963                 // 0x06e00050
63964                 if (((instr & 0xf0000000) == 0xf0000000)) {
63965                   UnallocatedA32(instr);
63966                   return;
63967                 }
63968                 Condition condition((instr >> 28) & 0xf);
63969                 unsigned rd = (instr >> 12) & 0xf;
63970                 uint32_t imm = (instr >> 16) & 0x1f;
63971                 unsigned rn = instr & 0xf;
63972                 uint32_t amount = (instr >> 7) & 0x1f;
63973                 if (amount == 0) amount = 32;
63974                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
63975                 usat(condition,
63976                      Register(rd),
63977                      imm,
63978                      Operand(Register(rn), ASR, amount));
63979                 break;
63980               }
63981               case 0x00800060: {
63982                 // 0x06e00070
63983                 switch (instr & 0x00100080) {
63984                   case 0x00000000: {
63985                     // 0x06e00070
63986                     switch (instr & 0x000f0000) {
63987                       case 0x000f0000: {
63988                         // 0x06ef0070
63989                         if (((instr & 0xf0000000) == 0xf0000000)) {
63990                           UnallocatedA32(instr);
63991                           return;
63992                         }
63993                         Condition condition((instr >> 28) & 0xf);
63994                         unsigned rd = (instr >> 12) & 0xf;
63995                         unsigned rm = instr & 0xf;
63996                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
63997                         // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
63998                         uxtb(condition,
63999                              Best,
64000                              Register(rd),
64001                              Operand(Register(rm), ROR, amount));
64002                         if (((instr & 0xfff03f0) != 0x6ef0070)) {
64003                           UnpredictableA32(instr);
64004                         }
64005                         break;
64006                       }
64007                       default: {
64008                         if (((instr & 0xf0000000) == 0xf0000000) ||
64009                             ((instr & 0xf0000) == 0xf0000)) {
64010                           UnallocatedA32(instr);
64011                           return;
64012                         }
64013                         Condition condition((instr >> 28) & 0xf);
64014                         unsigned rd = (instr >> 12) & 0xf;
64015                         unsigned rn = (instr >> 16) & 0xf;
64016                         unsigned rm = instr & 0xf;
64017                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
64018                         // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
64019                         uxtab(condition,
64020                               Register(rd),
64021                               Register(rn),
64022                               Operand(Register(rm), ROR, amount));
64023                         if (((instr & 0xff003f0) != 0x6e00070)) {
64024                           UnpredictableA32(instr);
64025                         }
64026                         break;
64027                       }
64028                     }
64029                     break;
64030                   }
64031                   case 0x00100000: {
64032                     // 0x06f00070
64033                     switch (instr & 0x000f0000) {
64034                       case 0x000f0000: {
64035                         // 0x06ff0070
64036                         if (((instr & 0xf0000000) == 0xf0000000)) {
64037                           UnallocatedA32(instr);
64038                           return;
64039                         }
64040                         Condition condition((instr >> 28) & 0xf);
64041                         unsigned rd = (instr >> 12) & 0xf;
64042                         unsigned rm = instr & 0xf;
64043                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
64044                         // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
64045                         uxth(condition,
64046                              Best,
64047                              Register(rd),
64048                              Operand(Register(rm), ROR, amount));
64049                         if (((instr & 0xfff03f0) != 0x6ff0070)) {
64050                           UnpredictableA32(instr);
64051                         }
64052                         break;
64053                       }
64054                       default: {
64055                         if (((instr & 0xf0000000) == 0xf0000000) ||
64056                             ((instr & 0xf0000) == 0xf0000)) {
64057                           UnallocatedA32(instr);
64058                           return;
64059                         }
64060                         Condition condition((instr >> 28) & 0xf);
64061                         unsigned rd = (instr >> 12) & 0xf;
64062                         unsigned rn = (instr >> 16) & 0xf;
64063                         unsigned rm = instr & 0xf;
64064                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
64065                         // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
64066                         uxtah(condition,
64067                               Register(rd),
64068                               Register(rn),
64069                               Operand(Register(rm), ROR, amount));
64070                         if (((instr & 0xff003f0) != 0x6f00070)) {
64071                           UnpredictableA32(instr);
64072                         }
64073                         break;
64074                       }
64075                     }
64076                     break;
64077                   }
64078                   default:
64079                     UnallocatedA32(instr);
64080                     break;
64081                 }
64082                 break;
64083               }
64084             }
64085             break;
64086           }
64087           case 0x01000000: {
64088             // 0x07000000
64089             switch (instr & 0x00100000) {
64090               case 0x00000000: {
64091                 // 0x07000000
64092                 if (((instr & 0xf0000000) == 0xf0000000)) {
64093                   UnallocatedA32(instr);
64094                   return;
64095                 }
64096                 Condition condition((instr >> 28) & 0xf);
64097                 unsigned rt = (instr >> 12) & 0xf;
64098                 unsigned rn = (instr >> 16) & 0xf;
64099                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64100                 unsigned rm = instr & 0xf;
64101                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64102                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64103                                                     (imm_and_type_ & 0x7c) >>
64104                                                         2);
64105                 Shift shift = shift_operand.GetShift();
64106                 uint32_t amount = shift_operand.GetAmount();
64107                 AddrMode addrmode = Offset;
64108                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64109                 str(condition,
64110                     Best,
64111                     Register(rt),
64112                     MemOperand(Register(rn),
64113                                sign,
64114                                Register(rm),
64115                                shift,
64116                                amount,
64117                                addrmode));
64118                 break;
64119               }
64120               case 0x00100000: {
64121                 // 0x07100000
64122                 if (((instr & 0xf0000000) == 0xf0000000)) {
64123                   UnallocatedA32(instr);
64124                   return;
64125                 }
64126                 Condition condition((instr >> 28) & 0xf);
64127                 unsigned rt = (instr >> 12) & 0xf;
64128                 unsigned rn = (instr >> 16) & 0xf;
64129                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64130                 unsigned rm = instr & 0xf;
64131                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64132                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64133                                                     (imm_and_type_ & 0x7c) >>
64134                                                         2);
64135                 Shift shift = shift_operand.GetShift();
64136                 uint32_t amount = shift_operand.GetAmount();
64137                 AddrMode addrmode = Offset;
64138                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64139                 ldr(condition,
64140                     Best,
64141                     Register(rt),
64142                     MemOperand(Register(rn),
64143                                sign,
64144                                Register(rm),
64145                                shift,
64146                                amount,
64147                                addrmode));
64148                 break;
64149               }
64150             }
64151             break;
64152           }
64153           case 0x01000010: {
64154             // 0x07000010
64155             switch (instr & 0x009000e0) {
64156               case 0x00000000: {
64157                 // 0x07000010
64158                 switch (instr & 0x0000f000) {
64159                   case 0x0000f000: {
64160                     // 0x0700f010
64161                     if (((instr & 0xf0000000) == 0xf0000000)) {
64162                       UnallocatedA32(instr);
64163                       return;
64164                     }
64165                     Condition condition((instr >> 28) & 0xf);
64166                     unsigned rd = (instr >> 16) & 0xf;
64167                     unsigned rn = instr & 0xf;
64168                     unsigned rm = (instr >> 8) & 0xf;
64169                     // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64170                     smuad(condition, Register(rd), Register(rn), Register(rm));
64171                     break;
64172                   }
64173                   default: {
64174                     if (((instr & 0xf0000000) == 0xf0000000) ||
64175                         ((instr & 0xf000) == 0xf000)) {
64176                       UnallocatedA32(instr);
64177                       return;
64178                     }
64179                     Condition condition((instr >> 28) & 0xf);
64180                     unsigned rd = (instr >> 16) & 0xf;
64181                     unsigned rn = instr & 0xf;
64182                     unsigned rm = (instr >> 8) & 0xf;
64183                     unsigned ra = (instr >> 12) & 0xf;
64184                     // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64185                     smlad(condition,
64186                           Register(rd),
64187                           Register(rn),
64188                           Register(rm),
64189                           Register(ra));
64190                     break;
64191                   }
64192                 }
64193                 break;
64194               }
64195               case 0x00000020: {
64196                 // 0x07000030
64197                 switch (instr & 0x0000f000) {
64198                   case 0x0000f000: {
64199                     // 0x0700f030
64200                     if (((instr & 0xf0000000) == 0xf0000000)) {
64201                       UnallocatedA32(instr);
64202                       return;
64203                     }
64204                     Condition condition((instr >> 28) & 0xf);
64205                     unsigned rd = (instr >> 16) & 0xf;
64206                     unsigned rn = instr & 0xf;
64207                     unsigned rm = (instr >> 8) & 0xf;
64208                     // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64209                     smuadx(condition, Register(rd), Register(rn), Register(rm));
64210                     break;
64211                   }
64212                   default: {
64213                     if (((instr & 0xf0000000) == 0xf0000000) ||
64214                         ((instr & 0xf000) == 0xf000)) {
64215                       UnallocatedA32(instr);
64216                       return;
64217                     }
64218                     Condition condition((instr >> 28) & 0xf);
64219                     unsigned rd = (instr >> 16) & 0xf;
64220                     unsigned rn = instr & 0xf;
64221                     unsigned rm = (instr >> 8) & 0xf;
64222                     unsigned ra = (instr >> 12) & 0xf;
64223                     // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64224                     smladx(condition,
64225                            Register(rd),
64226                            Register(rn),
64227                            Register(rm),
64228                            Register(ra));
64229                     break;
64230                   }
64231                 }
64232                 break;
64233               }
64234               case 0x00000040: {
64235                 // 0x07000050
64236                 switch (instr & 0x0000f000) {
64237                   case 0x0000f000: {
64238                     // 0x0700f050
64239                     if (((instr & 0xf0000000) == 0xf0000000)) {
64240                       UnallocatedA32(instr);
64241                       return;
64242                     }
64243                     Condition condition((instr >> 28) & 0xf);
64244                     unsigned rd = (instr >> 16) & 0xf;
64245                     unsigned rn = instr & 0xf;
64246                     unsigned rm = (instr >> 8) & 0xf;
64247                     // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64248                     smusd(condition, Register(rd), Register(rn), Register(rm));
64249                     break;
64250                   }
64251                   default: {
64252                     if (((instr & 0xf0000000) == 0xf0000000) ||
64253                         ((instr & 0xf000) == 0xf000)) {
64254                       UnallocatedA32(instr);
64255                       return;
64256                     }
64257                     Condition condition((instr >> 28) & 0xf);
64258                     unsigned rd = (instr >> 16) & 0xf;
64259                     unsigned rn = instr & 0xf;
64260                     unsigned rm = (instr >> 8) & 0xf;
64261                     unsigned ra = (instr >> 12) & 0xf;
64262                     // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64263                     smlsd(condition,
64264                           Register(rd),
64265                           Register(rn),
64266                           Register(rm),
64267                           Register(ra));
64268                     break;
64269                   }
64270                 }
64271                 break;
64272               }
64273               case 0x00000060: {
64274                 // 0x07000070
64275                 switch (instr & 0x0000f000) {
64276                   case 0x0000f000: {
64277                     // 0x0700f070
64278                     if (((instr & 0xf0000000) == 0xf0000000)) {
64279                       UnallocatedA32(instr);
64280                       return;
64281                     }
64282                     Condition condition((instr >> 28) & 0xf);
64283                     unsigned rd = (instr >> 16) & 0xf;
64284                     unsigned rn = instr & 0xf;
64285                     unsigned rm = (instr >> 8) & 0xf;
64286                     // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64287                     smusdx(condition, Register(rd), Register(rn), Register(rm));
64288                     break;
64289                   }
64290                   default: {
64291                     if (((instr & 0xf0000000) == 0xf0000000) ||
64292                         ((instr & 0xf000) == 0xf000)) {
64293                       UnallocatedA32(instr);
64294                       return;
64295                     }
64296                     Condition condition((instr >> 28) & 0xf);
64297                     unsigned rd = (instr >> 16) & 0xf;
64298                     unsigned rn = instr & 0xf;
64299                     unsigned rm = (instr >> 8) & 0xf;
64300                     unsigned ra = (instr >> 12) & 0xf;
64301                     // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64302                     smlsdx(condition,
64303                            Register(rd),
64304                            Register(rn),
64305                            Register(rm),
64306                            Register(ra));
64307                     break;
64308                   }
64309                 }
64310                 break;
64311               }
64312               case 0x00100000: {
64313                 // 0x07100010
64314                 if (((instr & 0xf0000000) == 0xf0000000)) {
64315                   UnallocatedA32(instr);
64316                   return;
64317                 }
64318                 Condition condition((instr >> 28) & 0xf);
64319                 unsigned rd = (instr >> 16) & 0xf;
64320                 unsigned rn = instr & 0xf;
64321                 unsigned rm = (instr >> 8) & 0xf;
64322                 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64323                 sdiv(condition, Register(rd), Register(rn), Register(rm));
64324                 if (((instr & 0xff0f0f0) != 0x710f010)) {
64325                   UnpredictableA32(instr);
64326                 }
64327                 break;
64328               }
64329               case 0x00800000: {
64330                 // 0x07800010
64331                 switch (instr & 0x0000f000) {
64332                   case 0x0000f000: {
64333                     // 0x0780f010
64334                     if (((instr & 0xf0000000) == 0xf0000000)) {
64335                       UnallocatedA32(instr);
64336                       return;
64337                     }
64338                     Condition condition((instr >> 28) & 0xf);
64339                     unsigned rd = (instr >> 16) & 0xf;
64340                     unsigned rn = instr & 0xf;
64341                     unsigned rm = (instr >> 8) & 0xf;
64342                     // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64343                     usad8(condition, Register(rd), Register(rn), Register(rm));
64344                     break;
64345                   }
64346                   default: {
64347                     if (((instr & 0xf0000000) == 0xf0000000) ||
64348                         ((instr & 0xf000) == 0xf000)) {
64349                       UnallocatedA32(instr);
64350                       return;
64351                     }
64352                     Condition condition((instr >> 28) & 0xf);
64353                     unsigned rd = (instr >> 16) & 0xf;
64354                     unsigned rn = instr & 0xf;
64355                     unsigned rm = (instr >> 8) & 0xf;
64356                     unsigned ra = (instr >> 12) & 0xf;
64357                     // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64358                     usada8(condition,
64359                            Register(rd),
64360                            Register(rn),
64361                            Register(rm),
64362                            Register(ra));
64363                     break;
64364                   }
64365                 }
64366                 break;
64367               }
64368               default:
64369                 UnallocatedA32(instr);
64370                 break;
64371             }
64372             break;
64373           }
64374           case 0x01200000: {
64375             // 0x07200000
64376             switch (instr & 0x00100000) {
64377               case 0x00000000: {
64378                 // 0x07200000
64379                 if (((instr & 0xf0000000) == 0xf0000000)) {
64380                   UnallocatedA32(instr);
64381                   return;
64382                 }
64383                 Condition condition((instr >> 28) & 0xf);
64384                 unsigned rt = (instr >> 12) & 0xf;
64385                 unsigned rn = (instr >> 16) & 0xf;
64386                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64387                 unsigned rm = instr & 0xf;
64388                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64389                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64390                                                     (imm_and_type_ & 0x7c) >>
64391                                                         2);
64392                 Shift shift = shift_operand.GetShift();
64393                 uint32_t amount = shift_operand.GetAmount();
64394                 AddrMode addrmode = PreIndex;
64395                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64396                 str(condition,
64397                     Best,
64398                     Register(rt),
64399                     MemOperand(Register(rn),
64400                                sign,
64401                                Register(rm),
64402                                shift,
64403                                amount,
64404                                addrmode));
64405                 break;
64406               }
64407               case 0x00100000: {
64408                 // 0x07300000
64409                 if (((instr & 0xf0000000) == 0xf0000000)) {
64410                   UnallocatedA32(instr);
64411                   return;
64412                 }
64413                 Condition condition((instr >> 28) & 0xf);
64414                 unsigned rt = (instr >> 12) & 0xf;
64415                 unsigned rn = (instr >> 16) & 0xf;
64416                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64417                 unsigned rm = instr & 0xf;
64418                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64419                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64420                                                     (imm_and_type_ & 0x7c) >>
64421                                                         2);
64422                 Shift shift = shift_operand.GetShift();
64423                 uint32_t amount = shift_operand.GetAmount();
64424                 AddrMode addrmode = PreIndex;
64425                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64426                 ldr(condition,
64427                     Best,
64428                     Register(rt),
64429                     MemOperand(Register(rn),
64430                                sign,
64431                                Register(rm),
64432                                shift,
64433                                amount,
64434                                addrmode));
64435                 break;
64436               }
64437             }
64438             break;
64439           }
64440           case 0x01200010: {
64441             // 0x07200010
64442             switch (instr & 0x00800060) {
64443               case 0x00000000: {
64444                 // 0x07200010
64445                 if ((instr & 0x00100080) == 0x00100000) {
64446                   if (((instr & 0xf0000000) == 0xf0000000)) {
64447                     UnallocatedA32(instr);
64448                     return;
64449                   }
64450                   Condition condition((instr >> 28) & 0xf);
64451                   unsigned rd = (instr >> 16) & 0xf;
64452                   unsigned rn = instr & 0xf;
64453                   unsigned rm = (instr >> 8) & 0xf;
64454                   // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64455                   udiv(condition, Register(rd), Register(rn), Register(rm));
64456                   if (((instr & 0xff0f0f0) != 0x730f010)) {
64457                     UnpredictableA32(instr);
64458                   }
64459                 } else {
64460                   UnallocatedA32(instr);
64461                 }
64462                 break;
64463               }
64464               case 0x00800040: {
64465                 // 0x07a00050
64466                 if (((instr & 0xf0000000) == 0xf0000000)) {
64467                   UnallocatedA32(instr);
64468                   return;
64469                 }
64470                 Condition condition((instr >> 28) & 0xf);
64471                 unsigned rd = (instr >> 12) & 0xf;
64472                 unsigned rn = instr & 0xf;
64473                 uint32_t lsb = (instr >> 7) & 0x1f;
64474                 uint32_t widthm1 = (instr >> 16) & 0x1f;
64475                 uint32_t width = widthm1 + 1;
64476                 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64477                 sbfx(condition, Register(rd), Register(rn), lsb, width);
64478                 break;
64479               }
64480               default:
64481                 UnallocatedA32(instr);
64482                 break;
64483             }
64484             break;
64485           }
64486           case 0x01400000: {
64487             // 0x07400000
64488             switch (instr & 0x00100000) {
64489               case 0x00000000: {
64490                 // 0x07400000
64491                 if (((instr & 0xf0000000) == 0xf0000000)) {
64492                   UnallocatedA32(instr);
64493                   return;
64494                 }
64495                 Condition condition((instr >> 28) & 0xf);
64496                 unsigned rt = (instr >> 12) & 0xf;
64497                 unsigned rn = (instr >> 16) & 0xf;
64498                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64499                 unsigned rm = instr & 0xf;
64500                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64501                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64502                                                     (imm_and_type_ & 0x7c) >>
64503                                                         2);
64504                 Shift shift = shift_operand.GetShift();
64505                 uint32_t amount = shift_operand.GetAmount();
64506                 AddrMode addrmode = Offset;
64507                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64508                 strb(condition,
64509                      Best,
64510                      Register(rt),
64511                      MemOperand(Register(rn),
64512                                 sign,
64513                                 Register(rm),
64514                                 shift,
64515                                 amount,
64516                                 addrmode));
64517                 break;
64518               }
64519               case 0x00100000: {
64520                 // 0x07500000
64521                 if (((instr & 0xf0000000) == 0xf0000000)) {
64522                   UnallocatedA32(instr);
64523                   return;
64524                 }
64525                 Condition condition((instr >> 28) & 0xf);
64526                 unsigned rt = (instr >> 12) & 0xf;
64527                 unsigned rn = (instr >> 16) & 0xf;
64528                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64529                 unsigned rm = instr & 0xf;
64530                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64531                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64532                                                     (imm_and_type_ & 0x7c) >>
64533                                                         2);
64534                 Shift shift = shift_operand.GetShift();
64535                 uint32_t amount = shift_operand.GetAmount();
64536                 AddrMode addrmode = Offset;
64537                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
64538                 ldrb(condition,
64539                      Best,
64540                      Register(rt),
64541                      MemOperand(Register(rn),
64542                                 sign,
64543                                 Register(rm),
64544                                 shift,
64545                                 amount,
64546                                 addrmode));
64547                 break;
64548               }
64549             }
64550             break;
64551           }
64552           case 0x01400010: {
64553             // 0x07400010
64554             switch (instr & 0x00800060) {
64555               case 0x00000000: {
64556                 // 0x07400010
64557                 switch (instr & 0x00100080) {
64558                   case 0x00000000: {
64559                     // 0x07400010
64560                     if (((instr & 0xf0000000) == 0xf0000000)) {
64561                       UnallocatedA32(instr);
64562                       return;
64563                     }
64564                     Condition condition((instr >> 28) & 0xf);
64565                     unsigned rdlo = (instr >> 12) & 0xf;
64566                     unsigned rdhi = (instr >> 16) & 0xf;
64567                     unsigned rn = instr & 0xf;
64568                     unsigned rm = (instr >> 8) & 0xf;
64569                     // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64570                     smlald(condition,
64571                            Register(rdlo),
64572                            Register(rdhi),
64573                            Register(rn),
64574                            Register(rm));
64575                     break;
64576                   }
64577                   case 0x00100000: {
64578                     // 0x07500010
64579                     switch (instr & 0x0000f000) {
64580                       case 0x0000f000: {
64581                         // 0x0750f010
64582                         if (((instr & 0xf0000000) == 0xf0000000)) {
64583                           UnallocatedA32(instr);
64584                           return;
64585                         }
64586                         Condition condition((instr >> 28) & 0xf);
64587                         unsigned rd = (instr >> 16) & 0xf;
64588                         unsigned rn = instr & 0xf;
64589                         unsigned rm = (instr >> 8) & 0xf;
64590                         // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64591                         smmul(condition,
64592                               Register(rd),
64593                               Register(rn),
64594                               Register(rm));
64595                         break;
64596                       }
64597                       default: {
64598                         if (((instr & 0xf0000000) == 0xf0000000) ||
64599                             ((instr & 0xf000) == 0xf000)) {
64600                           UnallocatedA32(instr);
64601                           return;
64602                         }
64603                         Condition condition((instr >> 28) & 0xf);
64604                         unsigned rd = (instr >> 16) & 0xf;
64605                         unsigned rn = instr & 0xf;
64606                         unsigned rm = (instr >> 8) & 0xf;
64607                         unsigned ra = (instr >> 12) & 0xf;
64608                         // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64609                         smmla(condition,
64610                               Register(rd),
64611                               Register(rn),
64612                               Register(rm),
64613                               Register(ra));
64614                         break;
64615                       }
64616                     }
64617                     break;
64618                   }
64619                   default:
64620                     UnallocatedA32(instr);
64621                     break;
64622                 }
64623                 break;
64624               }
64625               case 0x00000020: {
64626                 // 0x07400030
64627                 switch (instr & 0x00100080) {
64628                   case 0x00000000: {
64629                     // 0x07400030
64630                     if (((instr & 0xf0000000) == 0xf0000000)) {
64631                       UnallocatedA32(instr);
64632                       return;
64633                     }
64634                     Condition condition((instr >> 28) & 0xf);
64635                     unsigned rdlo = (instr >> 12) & 0xf;
64636                     unsigned rdhi = (instr >> 16) & 0xf;
64637                     unsigned rn = instr & 0xf;
64638                     unsigned rm = (instr >> 8) & 0xf;
64639                     // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64640                     smlaldx(condition,
64641                             Register(rdlo),
64642                             Register(rdhi),
64643                             Register(rn),
64644                             Register(rm));
64645                     break;
64646                   }
64647                   case 0x00100000: {
64648                     // 0x07500030
64649                     switch (instr & 0x0000f000) {
64650                       case 0x0000f000: {
64651                         // 0x0750f030
64652                         if (((instr & 0xf0000000) == 0xf0000000)) {
64653                           UnallocatedA32(instr);
64654                           return;
64655                         }
64656                         Condition condition((instr >> 28) & 0xf);
64657                         unsigned rd = (instr >> 16) & 0xf;
64658                         unsigned rn = instr & 0xf;
64659                         unsigned rm = (instr >> 8) & 0xf;
64660                         // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
64661                         smmulr(condition,
64662                                Register(rd),
64663                                Register(rn),
64664                                Register(rm));
64665                         break;
64666                       }
64667                       default: {
64668                         if (((instr & 0xf0000000) == 0xf0000000) ||
64669                             ((instr & 0xf000) == 0xf000)) {
64670                           UnallocatedA32(instr);
64671                           return;
64672                         }
64673                         Condition condition((instr >> 28) & 0xf);
64674                         unsigned rd = (instr >> 16) & 0xf;
64675                         unsigned rn = instr & 0xf;
64676                         unsigned rm = (instr >> 8) & 0xf;
64677                         unsigned ra = (instr >> 12) & 0xf;
64678                         // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64679                         smmlar(condition,
64680                                Register(rd),
64681                                Register(rn),
64682                                Register(rm),
64683                                Register(ra));
64684                         break;
64685                       }
64686                     }
64687                     break;
64688                   }
64689                   default:
64690                     UnallocatedA32(instr);
64691                     break;
64692                 }
64693                 break;
64694               }
64695               case 0x00000040: {
64696                 // 0x07400050
64697                 switch (instr & 0x00100080) {
64698                   case 0x00000000: {
64699                     // 0x07400050
64700                     if (((instr & 0xf0000000) == 0xf0000000)) {
64701                       UnallocatedA32(instr);
64702                       return;
64703                     }
64704                     Condition condition((instr >> 28) & 0xf);
64705                     unsigned rdlo = (instr >> 12) & 0xf;
64706                     unsigned rdhi = (instr >> 16) & 0xf;
64707                     unsigned rn = instr & 0xf;
64708                     unsigned rm = (instr >> 8) & 0xf;
64709                     // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64710                     smlsld(condition,
64711                            Register(rdlo),
64712                            Register(rdhi),
64713                            Register(rn),
64714                            Register(rm));
64715                     break;
64716                   }
64717                   case 0x00100080: {
64718                     // 0x075000d0
64719                     if (((instr & 0xf0000000) == 0xf0000000)) {
64720                       UnallocatedA32(instr);
64721                       return;
64722                     }
64723                     Condition condition((instr >> 28) & 0xf);
64724                     unsigned rd = (instr >> 16) & 0xf;
64725                     unsigned rn = instr & 0xf;
64726                     unsigned rm = (instr >> 8) & 0xf;
64727                     unsigned ra = (instr >> 12) & 0xf;
64728                     // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64729                     smmls(condition,
64730                           Register(rd),
64731                           Register(rn),
64732                           Register(rm),
64733                           Register(ra));
64734                     break;
64735                   }
64736                   default:
64737                     UnallocatedA32(instr);
64738                     break;
64739                 }
64740                 break;
64741               }
64742               case 0x00000060: {
64743                 // 0x07400070
64744                 switch (instr & 0x00100080) {
64745                   case 0x00000000: {
64746                     // 0x07400070
64747                     if (((instr & 0xf0000000) == 0xf0000000)) {
64748                       UnallocatedA32(instr);
64749                       return;
64750                     }
64751                     Condition condition((instr >> 28) & 0xf);
64752                     unsigned rdlo = (instr >> 12) & 0xf;
64753                     unsigned rdhi = (instr >> 16) & 0xf;
64754                     unsigned rn = instr & 0xf;
64755                     unsigned rm = (instr >> 8) & 0xf;
64756                     // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
64757                     smlsldx(condition,
64758                             Register(rdlo),
64759                             Register(rdhi),
64760                             Register(rn),
64761                             Register(rm));
64762                     break;
64763                   }
64764                   case 0x00100080: {
64765                     // 0x075000f0
64766                     if (((instr & 0xf0000000) == 0xf0000000)) {
64767                       UnallocatedA32(instr);
64768                       return;
64769                     }
64770                     Condition condition((instr >> 28) & 0xf);
64771                     unsigned rd = (instr >> 16) & 0xf;
64772                     unsigned rn = instr & 0xf;
64773                     unsigned rm = (instr >> 8) & 0xf;
64774                     unsigned ra = (instr >> 12) & 0xf;
64775                     // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
64776                     smmlsr(condition,
64777                            Register(rd),
64778                            Register(rn),
64779                            Register(rm),
64780                            Register(ra));
64781                     break;
64782                   }
64783                   default:
64784                     UnallocatedA32(instr);
64785                     break;
64786                 }
64787                 break;
64788               }
64789               case 0x00800000: {
64790                 // 0x07c00010
64791                 switch (instr & 0x0000000f) {
64792                   case 0x0000000f: {
64793                     // 0x07c0001f
64794                     if (((instr & 0xf0000000) == 0xf0000000)) {
64795                       UnallocatedA32(instr);
64796                       return;
64797                     }
64798                     Condition condition((instr >> 28) & 0xf);
64799                     unsigned rd = (instr >> 12) & 0xf;
64800                     uint32_t lsb = (instr >> 7) & 0x1f;
64801                     uint32_t msb = (instr >> 16) & 0x1f;
64802                     uint32_t width = msb - lsb + 1;
64803                     // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
64804                     bfc(condition, Register(rd), lsb, width);
64805                     break;
64806                   }
64807                   default: {
64808                     if (((instr & 0xf0000000) == 0xf0000000) ||
64809                         ((instr & 0xf) == 0xf)) {
64810                       UnallocatedA32(instr);
64811                       return;
64812                     }
64813                     Condition condition((instr >> 28) & 0xf);
64814                     unsigned rd = (instr >> 12) & 0xf;
64815                     unsigned rn = instr & 0xf;
64816                     uint32_t lsb = (instr >> 7) & 0x1f;
64817                     uint32_t msb = (instr >> 16) & 0x1f;
64818                     uint32_t width = msb - lsb + 1;
64819                     // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64820                     bfi(condition, Register(rd), Register(rn), lsb, width);
64821                     break;
64822                   }
64823                 }
64824                 break;
64825               }
64826               default:
64827                 UnallocatedA32(instr);
64828                 break;
64829             }
64830             break;
64831           }
64832           case 0x01600000: {
64833             // 0x07600000
64834             switch (instr & 0x00100000) {
64835               case 0x00000000: {
64836                 // 0x07600000
64837                 if (((instr & 0xf0000000) == 0xf0000000)) {
64838                   UnallocatedA32(instr);
64839                   return;
64840                 }
64841                 Condition condition((instr >> 28) & 0xf);
64842                 unsigned rt = (instr >> 12) & 0xf;
64843                 unsigned rn = (instr >> 16) & 0xf;
64844                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64845                 unsigned rm = instr & 0xf;
64846                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64847                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64848                                                     (imm_and_type_ & 0x7c) >>
64849                                                         2);
64850                 Shift shift = shift_operand.GetShift();
64851                 uint32_t amount = shift_operand.GetAmount();
64852                 AddrMode addrmode = PreIndex;
64853                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64854                 strb(condition,
64855                      Best,
64856                      Register(rt),
64857                      MemOperand(Register(rn),
64858                                 sign,
64859                                 Register(rm),
64860                                 shift,
64861                                 amount,
64862                                 addrmode));
64863                 break;
64864               }
64865               case 0x00100000: {
64866                 // 0x07700000
64867                 if (((instr & 0xf0000000) == 0xf0000000)) {
64868                   UnallocatedA32(instr);
64869                   return;
64870                 }
64871                 Condition condition((instr >> 28) & 0xf);
64872                 unsigned rt = (instr >> 12) & 0xf;
64873                 unsigned rn = (instr >> 16) & 0xf;
64874                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
64875                 unsigned rm = instr & 0xf;
64876                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
64877                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
64878                                                     (imm_and_type_ & 0x7c) >>
64879                                                         2);
64880                 Shift shift = shift_operand.GetShift();
64881                 uint32_t amount = shift_operand.GetAmount();
64882                 AddrMode addrmode = PreIndex;
64883                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
64884                 ldrb(condition,
64885                      Best,
64886                      Register(rt),
64887                      MemOperand(Register(rn),
64888                                 sign,
64889                                 Register(rm),
64890                                 shift,
64891                                 amount,
64892                                 addrmode));
64893                 break;
64894               }
64895             }
64896             break;
64897           }
64898           case 0x01600010: {
64899             // 0x07600010
64900             switch (instr & 0x00800060) {
64901               case 0x00800040: {
64902                 // 0x07e00050
64903                 if (((instr & 0xf0000000) == 0xf0000000)) {
64904                   UnallocatedA32(instr);
64905                   return;
64906                 }
64907                 Condition condition((instr >> 28) & 0xf);
64908                 unsigned rd = (instr >> 12) & 0xf;
64909                 unsigned rn = instr & 0xf;
64910                 uint32_t lsb = (instr >> 7) & 0x1f;
64911                 uint32_t widthm1 = (instr >> 16) & 0x1f;
64912                 uint32_t width = widthm1 + 1;
64913                 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
64914                 ubfx(condition, Register(rd), Register(rn), lsb, width);
64915                 break;
64916               }
64917               case 0x00800060: {
64918                 // 0x07e00070
64919                 if ((instr & 0xf0100080) == 0xe0100080) {
64920                   uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
64921                   // UDF{<c>}{<q>} {#}<imm> ; A1
64922                   udf(al, Best, imm);
64923                 } else {
64924                   UnallocatedA32(instr);
64925                 }
64926                 break;
64927               }
64928               default:
64929                 UnallocatedA32(instr);
64930                 break;
64931             }
64932             break;
64933           }
64934         }
64935         break;
64936       }
64937       case 0x08000000: {
64938         // 0x08000000
64939         switch (instr & 0x00500000) {
64940           case 0x00000000: {
64941             // 0x08000000
64942             switch (instr & 0x01800000) {
64943               case 0x00000000: {
64944                 // 0x08000000
64945                 if (((instr & 0xf0000000) == 0xf0000000)) {
64946                   UnallocatedA32(instr);
64947                   return;
64948                 }
64949                 Condition condition((instr >> 28) & 0xf);
64950                 unsigned rn = (instr >> 16) & 0xf;
64951                 WriteBack write_back((instr >> 21) & 0x1);
64952                 RegisterList registers((instr & 0xffff));
64953                 // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
64954                 stmda(condition, Register(rn), write_back, registers);
64955                 break;
64956               }
64957               case 0x00800000: {
64958                 // 0x08800000
64959                 if (((instr & 0xf0000000) == 0xf0000000)) {
64960                   UnallocatedA32(instr);
64961                   return;
64962                 }
64963                 Condition condition((instr >> 28) & 0xf);
64964                 unsigned rn = (instr >> 16) & 0xf;
64965                 WriteBack write_back((instr >> 21) & 0x1);
64966                 RegisterList registers((instr & 0xffff));
64967                 // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
64968                 stm(condition, Best, Register(rn), write_back, registers);
64969                 break;
64970               }
64971               case 0x01000000: {
64972                 // 0x09000000
64973                 if (((instr & 0xf0000000) == 0xf0000000)) {
64974                   UnallocatedA32(instr);
64975                   return;
64976                 }
64977                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
64978                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
64979                     ((instr & 0xf0000000) != 0xf0000000) &&
64980                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
64981                   Condition condition((instr >> 28) & 0xf);
64982                   RegisterList registers((instr & 0xffff));
64983                   // PUSH{<c>}{<q>} <registers> ; A1
64984                   push(condition, Best, registers);
64985                   return;
64986                 }
64987                 Condition condition((instr >> 28) & 0xf);
64988                 unsigned rn = (instr >> 16) & 0xf;
64989                 WriteBack write_back((instr >> 21) & 0x1);
64990                 RegisterList registers((instr & 0xffff));
64991                 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
64992                 stmdb(condition, Best, Register(rn), write_back, registers);
64993                 break;
64994               }
64995               case 0x01800000: {
64996                 // 0x09800000
64997                 if (((instr & 0xf0000000) == 0xf0000000)) {
64998                   UnallocatedA32(instr);
64999                   return;
65000                 }
65001                 Condition condition((instr >> 28) & 0xf);
65002                 unsigned rn = (instr >> 16) & 0xf;
65003                 WriteBack write_back((instr >> 21) & 0x1);
65004                 RegisterList registers((instr & 0xffff));
65005                 // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65006                 stmib(condition, Register(rn), write_back, registers);
65007                 break;
65008               }
65009             }
65010             break;
65011           }
65012           case 0x00100000: {
65013             // 0x08100000
65014             switch (instr & 0x01800000) {
65015               case 0x00000000: {
65016                 // 0x08100000
65017                 if (((instr & 0xf0000000) == 0xf0000000)) {
65018                   UnallocatedA32(instr);
65019                   return;
65020                 }
65021                 Condition condition((instr >> 28) & 0xf);
65022                 unsigned rn = (instr >> 16) & 0xf;
65023                 WriteBack write_back((instr >> 21) & 0x1);
65024                 RegisterList registers((instr & 0xffff));
65025                 // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
65026                 ldmda(condition, Register(rn), write_back, registers);
65027                 break;
65028               }
65029               case 0x00800000: {
65030                 // 0x08900000
65031                 if (((instr & 0xf0000000) == 0xf0000000)) {
65032                   UnallocatedA32(instr);
65033                   return;
65034                 }
65035                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
65036                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
65037                     ((instr & 0xf0000000) != 0xf0000000) &&
65038                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
65039                   Condition condition((instr >> 28) & 0xf);
65040                   RegisterList registers((instr & 0xffff));
65041                   // POP{<c>}{<q>} <registers> ; A1
65042                   pop(condition, Best, registers);
65043                   return;
65044                 }
65045                 Condition condition((instr >> 28) & 0xf);
65046                 unsigned rn = (instr >> 16) & 0xf;
65047                 WriteBack write_back((instr >> 21) & 0x1);
65048                 RegisterList registers((instr & 0xffff));
65049                 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
65050                 ldm(condition, Best, Register(rn), write_back, registers);
65051                 break;
65052               }
65053               case 0x01000000: {
65054                 // 0x09100000
65055                 if (((instr & 0xf0000000) == 0xf0000000)) {
65056                   UnallocatedA32(instr);
65057                   return;
65058                 }
65059                 Condition condition((instr >> 28) & 0xf);
65060                 unsigned rn = (instr >> 16) & 0xf;
65061                 WriteBack write_back((instr >> 21) & 0x1);
65062                 RegisterList registers((instr & 0xffff));
65063                 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65064                 ldmdb(condition, Register(rn), write_back, registers);
65065                 break;
65066               }
65067               case 0x01800000: {
65068                 // 0x09900000
65069                 if (((instr & 0xf0000000) == 0xf0000000)) {
65070                   UnallocatedA32(instr);
65071                   return;
65072                 }
65073                 Condition condition((instr >> 28) & 0xf);
65074                 unsigned rn = (instr >> 16) & 0xf;
65075                 WriteBack write_back((instr >> 21) & 0x1);
65076                 RegisterList registers((instr & 0xffff));
65077                 // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
65078                 ldmib(condition, Register(rn), write_back, registers);
65079                 break;
65080               }
65081             }
65082             break;
65083           }
65084           case 0x00400000: {
65085             // 0x08400000
65086             if (((instr & 0xf0000000) == 0xf0000000)) {
65087               UnallocatedA32(instr);
65088               return;
65089             }
65090             UnimplementedA32("STM", instr);
65091             break;
65092           }
65093           case 0x00500000: {
65094             // 0x08500000
65095             switch (instr & 0x00008000) {
65096               case 0x00000000: {
65097                 // 0x08500000
65098                 if (((instr & 0xf0000000) == 0xf0000000)) {
65099                   UnallocatedA32(instr);
65100                   return;
65101                 }
65102                 UnimplementedA32("LDM", instr);
65103                 break;
65104               }
65105               case 0x00008000: {
65106                 // 0x08508000
65107                 if (((instr & 0xf0000000) == 0xf0000000)) {
65108                   UnallocatedA32(instr);
65109                   return;
65110                 }
65111                 UnimplementedA32("LDM", instr);
65112                 break;
65113               }
65114             }
65115             break;
65116           }
65117         }
65118         break;
65119       }
65120       case 0x0a000000: {
65121         // 0x0a000000
65122         switch (instr & 0x01000000) {
65123           case 0x00000000: {
65124             // 0x0a000000
65125             if (((instr & 0xf0000000) == 0xf0000000)) {
65126               UnallocatedA32(instr);
65127               return;
65128             }
65129             Condition condition((instr >> 28) & 0xf);
65130             int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
65131             Label label(imm, kA32PcDelta);
65132             // B{<c>}{<q>} <label> ; A1
65133             b(condition, Best, &label);
65134             break;
65135           }
65136           case 0x01000000: {
65137             // 0x0b000000
65138             if (((instr & 0xf0000000) == 0xf0000000)) {
65139               UnallocatedA32(instr);
65140               return;
65141             }
65142             Condition condition((instr >> 28) & 0xf);
65143             int32_t imm = SignExtend<int32_t>(instr & 0xffffff, 24) << 2;
65144             Label label(imm, kA32PcDelta);
65145             // BL{<c>}{<q>} <label> ; A1
65146             bl(condition, &label);
65147             break;
65148           }
65149         }
65150         break;
65151       }
65152       case 0x0c000000: {
65153         // 0x0c000000
65154         switch (instr & 0x01100000) {
65155           case 0x00000000: {
65156             // 0x0c000000
65157             switch (instr & 0x00000e00) {
65158               case 0x00000a00: {
65159                 // 0x0c000a00
65160                 switch (instr & 0x00800100) {
65161                   case 0x00000000: {
65162                     // 0x0c000a00
65163                     if ((instr & 0x006000d0) == 0x00400010) {
65164                       if (((instr & 0xf0000000) == 0xf0000000)) {
65165                         UnallocatedA32(instr);
65166                         return;
65167                       }
65168                       Condition condition((instr >> 28) & 0xf);
65169                       unsigned rm = ExtractSRegister(instr, 5, 0);
65170                       unsigned rt = (instr >> 12) & 0xf;
65171                       unsigned rt2 = (instr >> 16) & 0xf;
65172                       // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
65173                       vmov(condition,
65174                            SRegister(rm),
65175                            SRegister(rm + 1),
65176                            Register(rt),
65177                            Register(rt2));
65178                     } else {
65179                       UnallocatedA32(instr);
65180                     }
65181                     break;
65182                   }
65183                   case 0x00000100: {
65184                     // 0x0c000b00
65185                     if ((instr & 0x006000d0) == 0x00400010) {
65186                       if (((instr & 0xf0000000) == 0xf0000000)) {
65187                         UnallocatedA32(instr);
65188                         return;
65189                       }
65190                       Condition condition((instr >> 28) & 0xf);
65191                       unsigned rm = ExtractDRegister(instr, 5, 0);
65192                       unsigned rt = (instr >> 12) & 0xf;
65193                       unsigned rt2 = (instr >> 16) & 0xf;
65194                       // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
65195                       vmov(condition,
65196                            DRegister(rm),
65197                            Register(rt),
65198                            Register(rt2));
65199                     } else {
65200                       UnallocatedA32(instr);
65201                     }
65202                     break;
65203                   }
65204                   case 0x00800000: {
65205                     // 0x0c800a00
65206                     if (((instr & 0xf0000000) == 0xf0000000)) {
65207                       UnallocatedA32(instr);
65208                       return;
65209                     }
65210                     Condition condition((instr >> 28) & 0xf);
65211                     unsigned rn = (instr >> 16) & 0xf;
65212                     WriteBack write_back((instr >> 21) & 0x1);
65213                     unsigned first = ExtractSRegister(instr, 22, 12);
65214                     unsigned len = instr & 0xff;
65215                     // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
65216                     vstm(condition,
65217                          kDataTypeValueNone,
65218                          Register(rn),
65219                          write_back,
65220                          SRegisterList(SRegister(first), len));
65221                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65222                       UnpredictableA32(instr);
65223                     }
65224                     break;
65225                   }
65226                   case 0x00800100: {
65227                     // 0x0c800b00
65228                     switch (instr & 0x00000001) {
65229                       case 0x00000000: {
65230                         // 0x0c800b00
65231                         if (((instr & 0xf0000000) == 0xf0000000)) {
65232                           UnallocatedA32(instr);
65233                           return;
65234                         }
65235                         Condition condition((instr >> 28) & 0xf);
65236                         unsigned rn = (instr >> 16) & 0xf;
65237                         WriteBack write_back((instr >> 21) & 0x1);
65238                         unsigned first = ExtractDRegister(instr, 22, 12);
65239                         unsigned imm8 = (instr & 0xff);
65240                         unsigned len = imm8 / 2;
65241                         unsigned end = first + len;
65242                         // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
65243                         vstm(condition,
65244                              kDataTypeValueNone,
65245                              Register(rn),
65246                              write_back,
65247                              DRegisterList(DRegister(first), len));
65248                         if ((len == 0) || (len > 16) ||
65249                             (end > kMaxNumberOfDRegisters)) {
65250                           UnpredictableA32(instr);
65251                         }
65252                         break;
65253                       }
65254                       case 0x00000001: {
65255                         // 0x0c800b01
65256                         if (((instr & 0xf0000000) == 0xf0000000)) {
65257                           UnallocatedA32(instr);
65258                           return;
65259                         }
65260                         Condition condition((instr >> 28) & 0xf);
65261                         unsigned rn = (instr >> 16) & 0xf;
65262                         WriteBack write_back((instr >> 21) & 0x1);
65263                         unsigned first = ExtractDRegister(instr, 22, 12);
65264                         unsigned imm8 = (instr & 0xff);
65265                         unsigned len = imm8 / 2;
65266                         unsigned end = first + len;
65267                         // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
65268                         fstmiax(condition,
65269                                 Register(rn),
65270                                 write_back,
65271                                 DRegisterList(DRegister(first), len));
65272                         if ((len == 0) || (len > 16) || (end > 16)) {
65273                           UnpredictableA32(instr);
65274                         }
65275                         break;
65276                       }
65277                     }
65278                     break;
65279                   }
65280                 }
65281                 break;
65282               }
65283               default: {
65284                 switch (instr & 0x00200000) {
65285                   case 0x00000000: {
65286                     // 0x0c000000
65287                     switch (instr & 0x00800000) {
65288                       case 0x00000000: {
65289                         // 0x0c000000
65290                         if ((instr & 0x00400000) == 0x00400000) {
65291                           if (((instr & 0xf0000000) == 0xf0000000) ||
65292                               ((instr & 0xe00) == 0xa00)) {
65293                             UnallocatedA32(instr);
65294                             return;
65295                           }
65296                           UnimplementedA32("MCRR", instr);
65297                         } else {
65298                           UnallocatedA32(instr);
65299                         }
65300                         break;
65301                       }
65302                       case 0x00800000: {
65303                         // 0x0c800000
65304                         if (((instr & 0xf0000000) == 0xf0000000) ||
65305                             ((instr & 0xe00) == 0xa00)) {
65306                           UnallocatedA32(instr);
65307                           return;
65308                         }
65309                         UnimplementedA32("STC", instr);
65310                         break;
65311                       }
65312                     }
65313                     break;
65314                   }
65315                   case 0x00200000: {
65316                     // 0x0c200000
65317                     if (((instr & 0xf0000000) == 0xf0000000) ||
65318                         ((instr & 0xe00) == 0xa00)) {
65319                       UnallocatedA32(instr);
65320                       return;
65321                     }
65322                     UnimplementedA32("STC", instr);
65323                     break;
65324                   }
65325                 }
65326                 break;
65327               }
65328             }
65329             break;
65330           }
65331           case 0x00100000: {
65332             // 0x0c100000
65333             switch (instr & 0x00000e00) {
65334               case 0x00000a00: {
65335                 // 0x0c100a00
65336                 switch (instr & 0x00800100) {
65337                   case 0x00000000: {
65338                     // 0x0c100a00
65339                     if ((instr & 0x006000d0) == 0x00400010) {
65340                       if (((instr & 0xf0000000) == 0xf0000000)) {
65341                         UnallocatedA32(instr);
65342                         return;
65343                       }
65344                       Condition condition((instr >> 28) & 0xf);
65345                       unsigned rt = (instr >> 12) & 0xf;
65346                       unsigned rt2 = (instr >> 16) & 0xf;
65347                       unsigned rm = ExtractSRegister(instr, 5, 0);
65348                       // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
65349                       vmov(condition,
65350                            Register(rt),
65351                            Register(rt2),
65352                            SRegister(rm),
65353                            SRegister(rm + 1));
65354                     } else {
65355                       UnallocatedA32(instr);
65356                     }
65357                     break;
65358                   }
65359                   case 0x00000100: {
65360                     // 0x0c100b00
65361                     if ((instr & 0x006000d0) == 0x00400010) {
65362                       if (((instr & 0xf0000000) == 0xf0000000)) {
65363                         UnallocatedA32(instr);
65364                         return;
65365                       }
65366                       Condition condition((instr >> 28) & 0xf);
65367                       unsigned rt = (instr >> 12) & 0xf;
65368                       unsigned rt2 = (instr >> 16) & 0xf;
65369                       unsigned rm = ExtractDRegister(instr, 5, 0);
65370                       // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
65371                       vmov(condition,
65372                            Register(rt),
65373                            Register(rt2),
65374                            DRegister(rm));
65375                     } else {
65376                       UnallocatedA32(instr);
65377                     }
65378                     break;
65379                   }
65380                   case 0x00800000: {
65381                     // 0x0c900a00
65382                     if (((instr & 0xf0000000) == 0xf0000000)) {
65383                       UnallocatedA32(instr);
65384                       return;
65385                     }
65386                     if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
65387                          Uint32(0x1)) &&
65388                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
65389                          Uint32(0xd)) &&
65390                         ((instr & 0xf0000000) != 0xf0000000)) {
65391                       Condition condition((instr >> 28) & 0xf);
65392                       unsigned first = ExtractSRegister(instr, 22, 12);
65393                       unsigned len = instr & 0xff;
65394                       // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
65395                       vpop(condition,
65396                            kDataTypeValueNone,
65397                            SRegisterList(SRegister(first), len));
65398                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65399                         UnpredictableA32(instr);
65400                       }
65401                       return;
65402                     }
65403                     Condition condition((instr >> 28) & 0xf);
65404                     unsigned rn = (instr >> 16) & 0xf;
65405                     WriteBack write_back((instr >> 21) & 0x1);
65406                     unsigned first = ExtractSRegister(instr, 22, 12);
65407                     unsigned len = instr & 0xff;
65408                     // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
65409                     vldm(condition,
65410                          kDataTypeValueNone,
65411                          Register(rn),
65412                          write_back,
65413                          SRegisterList(SRegister(first), len));
65414                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
65415                       UnpredictableA32(instr);
65416                     }
65417                     break;
65418                   }
65419                   case 0x00800100: {
65420                     // 0x0c900b00
65421                     switch (instr & 0x00000001) {
65422                       case 0x00000000: {
65423                         // 0x0c900b00
65424                         if (((instr & 0xf0000000) == 0xf0000000)) {
65425                           UnallocatedA32(instr);
65426                           return;
65427                         }
65428                         if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
65429                              Uint32(0x1)) &&
65430                             ((Uint32((instr >> 16)) & Uint32(0xf)) ==
65431                              Uint32(0xd)) &&
65432                             ((instr & 0xf0000000) != 0xf0000000)) {
65433                           Condition condition((instr >> 28) & 0xf);
65434                           unsigned first = ExtractDRegister(instr, 22, 12);
65435                           unsigned imm8 = (instr & 0xff);
65436                           unsigned len = imm8 / 2;
65437                           unsigned end = first + len;
65438                           // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
65439                           vpop(condition,
65440                                kDataTypeValueNone,
65441                                DRegisterList(DRegister(first), len));
65442                           if ((len == 0) || (len > 16) ||
65443                               (end > kMaxNumberOfDRegisters)) {
65444                             UnpredictableA32(instr);
65445                           }
65446                           return;
65447                         }
65448                         Condition condition((instr >> 28) & 0xf);
65449                         unsigned rn = (instr >> 16) & 0xf;
65450                         WriteBack write_back((instr >> 21) & 0x1);
65451                         unsigned first = ExtractDRegister(instr, 22, 12);
65452                         unsigned imm8 = (instr & 0xff);
65453                         unsigned len = imm8 / 2;
65454                         unsigned end = first + len;
65455                         // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
65456                         vldm(condition,
65457                              kDataTypeValueNone,
65458                              Register(rn),
65459                              write_back,
65460                              DRegisterList(DRegister(first), len));
65461                         if ((len == 0) || (len > 16) ||
65462                             (end > kMaxNumberOfDRegisters)) {
65463                           UnpredictableA32(instr);
65464                         }
65465                         break;
65466                       }
65467                       case 0x00000001: {
65468                         // 0x0c900b01
65469                         if (((instr & 0xf0000000) == 0xf0000000)) {
65470                           UnallocatedA32(instr);
65471                           return;
65472                         }
65473                         Condition condition((instr >> 28) & 0xf);
65474                         unsigned rn = (instr >> 16) & 0xf;
65475                         WriteBack write_back((instr >> 21) & 0x1);
65476                         unsigned first = ExtractDRegister(instr, 22, 12);
65477                         unsigned imm8 = (instr & 0xff);
65478                         unsigned len = imm8 / 2;
65479                         unsigned end = first + len;
65480                         // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
65481                         fldmiax(condition,
65482                                 Register(rn),
65483                                 write_back,
65484                                 DRegisterList(DRegister(first), len));
65485                         if ((len == 0) || (len > 16) || (end > 16)) {
65486                           UnpredictableA32(instr);
65487                         }
65488                         break;
65489                       }
65490                     }
65491                     break;
65492                   }
65493                 }
65494                 break;
65495               }
65496               default: {
65497                 switch (instr & 0x00200000) {
65498                   case 0x00000000: {
65499                     // 0x0c100000
65500                     switch (instr & 0x00800000) {
65501                       case 0x00000000: {
65502                         // 0x0c100000
65503                         if ((instr & 0x00400000) == 0x00400000) {
65504                           if (((instr & 0xf0000000) == 0xf0000000) ||
65505                               ((instr & 0xe00) == 0xa00)) {
65506                             UnallocatedA32(instr);
65507                             return;
65508                           }
65509                           UnimplementedA32("MRRC", instr);
65510                         } else {
65511                           UnallocatedA32(instr);
65512                         }
65513                         break;
65514                       }
65515                       case 0x00800000: {
65516                         // 0x0c900000
65517                         switch (instr & 0x000f0000) {
65518                           case 0x000f0000: {
65519                             // 0x0c9f0000
65520                             if (((instr & 0xf0000000) == 0xf0000000) ||
65521                                 ((instr & 0xe00) == 0xa00)) {
65522                               UnallocatedA32(instr);
65523                               return;
65524                             }
65525                             UnimplementedA32("LDC", instr);
65526                             break;
65527                           }
65528                           default: {
65529                             if (((instr & 0xf0000000) == 0xf0000000) ||
65530                                 ((instr & 0xf0000) == 0xf0000) ||
65531                                 ((instr & 0xe00) == 0xa00)) {
65532                               UnallocatedA32(instr);
65533                               return;
65534                             }
65535                             UnimplementedA32("LDC", instr);
65536                             break;
65537                           }
65538                         }
65539                         break;
65540                       }
65541                     }
65542                     break;
65543                   }
65544                   case 0x00200000: {
65545                     // 0x0c300000
65546                     if (((instr & 0xf0000000) == 0xf0000000) ||
65547                         ((instr & 0xf0000) == 0xf0000) ||
65548                         ((instr & 0xe00) == 0xa00)) {
65549                       UnallocatedA32(instr);
65550                       return;
65551                     }
65552                     UnimplementedA32("LDC", instr);
65553                     break;
65554                   }
65555                 }
65556                 break;
65557               }
65558             }
65559             break;
65560           }
65561           case 0x01000000: {
65562             // 0x0d000000
65563             switch (instr & 0x00200000) {
65564               case 0x00000000: {
65565                 // 0x0d000000
65566                 switch (instr & 0x00000e00) {
65567                   case 0x00000a00: {
65568                     // 0x0d000a00
65569                     switch (instr & 0x00000100) {
65570                       case 0x00000000: {
65571                         // 0x0d000a00
65572                         if (((instr & 0xf0000000) == 0xf0000000)) {
65573                           UnallocatedA32(instr);
65574                           return;
65575                         }
65576                         Condition condition((instr >> 28) & 0xf);
65577                         unsigned rd = ExtractSRegister(instr, 22, 12);
65578                         unsigned rn = (instr >> 16) & 0xf;
65579                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65580                         int32_t offset = (instr & 0xff) << 2;
65581                         // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
65582                         vstr(condition,
65583                              kDataTypeValueNone,
65584                              SRegister(rd),
65585                              MemOperand(Register(rn), sign, offset, Offset));
65586                         break;
65587                       }
65588                       case 0x00000100: {
65589                         // 0x0d000b00
65590                         if (((instr & 0xf0000000) == 0xf0000000)) {
65591                           UnallocatedA32(instr);
65592                           return;
65593                         }
65594                         Condition condition((instr >> 28) & 0xf);
65595                         unsigned rd = ExtractDRegister(instr, 22, 12);
65596                         unsigned rn = (instr >> 16) & 0xf;
65597                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
65598                         int32_t offset = (instr & 0xff) << 2;
65599                         // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
65600                         vstr(condition,
65601                              kDataTypeValueNone,
65602                              DRegister(rd),
65603                              MemOperand(Register(rn), sign, offset, Offset));
65604                         break;
65605                       }
65606                     }
65607                     break;
65608                   }
65609                   default: {
65610                     if (((instr & 0xf0000000) == 0xf0000000) ||
65611                         ((instr & 0xe00) == 0xa00)) {
65612                       UnallocatedA32(instr);
65613                       return;
65614                     }
65615                     UnimplementedA32("STC", instr);
65616                     break;
65617                   }
65618                 }
65619                 break;
65620               }
65621               case 0x00200000: {
65622                 // 0x0d200000
65623                 switch (instr & 0x00000e00) {
65624                   case 0x00000a00: {
65625                     // 0x0d200a00
65626                     switch (instr & 0x00800100) {
65627                       case 0x00000000: {
65628                         // 0x0d200a00
65629                         if (((instr & 0xf0000000) == 0xf0000000)) {
65630                           UnallocatedA32(instr);
65631                           return;
65632                         }
65633                         if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
65634                              Uint32(0xd)) &&
65635                             ((instr & 0xf0000000) != 0xf0000000)) {
65636                           Condition condition((instr >> 28) & 0xf);
65637                           unsigned first = ExtractSRegister(instr, 22, 12);
65638                           unsigned len = instr & 0xff;
65639                           // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
65640                           vpush(condition,
65641                                 kDataTypeValueNone,
65642                                 SRegisterList(SRegister(first), len));
65643                           if ((len == 0) ||
65644                               ((first + len) > kNumberOfSRegisters)) {
65645                             UnpredictableA32(instr);
65646                           }
65647                           return;
65648                         }
65649                         Condition condition((instr >> 28) & 0xf);
65650                         unsigned rn = (instr >> 16) & 0xf;
65651                         unsigned first = ExtractSRegister(instr, 22, 12);
65652                         unsigned len = instr & 0xff;
65653                         // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65654                         vstmdb(condition,
65655                                kDataTypeValueNone,
65656                                Register(rn),
65657                                WriteBack(WRITE_BACK),
65658                                SRegisterList(SRegister(first), len));
65659                         if ((len == 0) ||
65660                             ((first + len) > kNumberOfSRegisters)) {
65661                           UnpredictableA32(instr);
65662                         }
65663                         break;
65664                       }
65665                       case 0x00000100: {
65666                         // 0x0d200b00
65667                         switch (instr & 0x00000001) {
65668                           case 0x00000000: {
65669                             // 0x0d200b00
65670                             if (((instr & 0xf0000000) == 0xf0000000)) {
65671                               UnallocatedA32(instr);
65672                               return;
65673                             }
65674                             if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
65675                                  Uint32(0xd)) &&
65676                                 ((instr & 0xf0000000) != 0xf0000000)) {
65677                               Condition condition((instr >> 28) & 0xf);
65678                               unsigned first = ExtractDRegister(instr, 22, 12);
65679                               unsigned imm8 = (instr & 0xff);
65680                               unsigned len = imm8 / 2;
65681                               unsigned end = first + len;
65682                               // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
65683                               vpush(condition,
65684                                     kDataTypeValueNone,
65685                                     DRegisterList(DRegister(first), len));
65686                               if ((len == 0) || (len > 16) ||
65687                                   (end > kMaxNumberOfDRegisters)) {
65688                                 UnpredictableA32(instr);
65689                               }
65690                               return;
65691                             }
65692                             Condition condition((instr >> 28) & 0xf);
65693                             unsigned rn = (instr >> 16) & 0xf;
65694                             unsigned first = ExtractDRegister(instr, 22, 12);
65695                             unsigned imm8 = (instr & 0xff);
65696                             unsigned len = imm8 / 2;
65697                             unsigned end = first + len;
65698                             // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65699                             vstmdb(condition,
65700                                    kDataTypeValueNone,
65701                                    Register(rn),
65702                                    WriteBack(WRITE_BACK),
65703                                    DRegisterList(DRegister(first), len));
65704                             if ((len == 0) || (len > 16) ||
65705                                 (end > kMaxNumberOfDRegisters)) {
65706                               UnpredictableA32(instr);
65707                             }
65708                             break;
65709                           }
65710                           case 0x00000001: {
65711                             // 0x0d200b01
65712                             if (((instr & 0xf0000000) == 0xf0000000)) {
65713                               UnallocatedA32(instr);
65714                               return;
65715                             }
65716                             Condition condition((instr >> 28) & 0xf);
65717                             unsigned rn = (instr >> 16) & 0xf;
65718                             unsigned first = ExtractDRegister(instr, 22, 12);
65719                             unsigned imm8 = (instr & 0xff);
65720                             unsigned len = imm8 / 2;
65721                             unsigned end = first + len;
65722                             // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65723                             fstmdbx(condition,
65724                                     Register(rn),
65725                                     WriteBack(WRITE_BACK),
65726                                     DRegisterList(DRegister(first), len));
65727                             if ((len == 0) || (len > 16) || (end > 16)) {
65728                               UnpredictableA32(instr);
65729                             }
65730                             break;
65731                           }
65732                         }
65733                         break;
65734                       }
65735                       default:
65736                         UnallocatedA32(instr);
65737                         break;
65738                     }
65739                     break;
65740                   }
65741                   default: {
65742                     if (((instr & 0xf0000000) == 0xf0000000) ||
65743                         ((instr & 0xe00) == 0xa00)) {
65744                       UnallocatedA32(instr);
65745                       return;
65746                     }
65747                     UnimplementedA32("STC", instr);
65748                     break;
65749                   }
65750                 }
65751                 break;
65752               }
65753             }
65754             break;
65755           }
65756           case 0x01100000: {
65757             // 0x0d100000
65758             switch (instr & 0x00200000) {
65759               case 0x00000000: {
65760                 // 0x0d100000
65761                 switch (instr & 0x000f0000) {
65762                   case 0x000f0000: {
65763                     // 0x0d1f0000
65764                     switch (instr & 0x00000e00) {
65765                       case 0x00000a00: {
65766                         // 0x0d1f0a00
65767                         switch (instr & 0x00000100) {
65768                           case 0x00000000: {
65769                             // 0x0d1f0a00
65770                             if (((instr & 0xf0000000) == 0xf0000000)) {
65771                               UnallocatedA32(instr);
65772                               return;
65773                             }
65774                             Condition condition((instr >> 28) & 0xf);
65775                             unsigned rd = ExtractSRegister(instr, 22, 12);
65776                             uint32_t U = (instr >> 23) & 0x1;
65777                             int32_t imm = instr & 0xff;
65778                             imm <<= 2;
65779                             if (U == 0) imm = -imm;
65780                             bool minus_zero = (imm == 0) && (U == 0);
65781                             Label label(imm, kA32PcDelta, minus_zero);
65782                             // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
65783                             vldr(condition,
65784                                  kDataTypeValueNone,
65785                                  SRegister(rd),
65786                                  &label);
65787                             break;
65788                           }
65789                           case 0x00000100: {
65790                             // 0x0d1f0b00
65791                             if (((instr & 0xf0000000) == 0xf0000000)) {
65792                               UnallocatedA32(instr);
65793                               return;
65794                             }
65795                             Condition condition((instr >> 28) & 0xf);
65796                             unsigned rd = ExtractDRegister(instr, 22, 12);
65797                             uint32_t U = (instr >> 23) & 0x1;
65798                             int32_t imm = instr & 0xff;
65799                             imm <<= 2;
65800                             if (U == 0) imm = -imm;
65801                             bool minus_zero = (imm == 0) && (U == 0);
65802                             Label label(imm, kA32PcDelta, minus_zero);
65803                             // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
65804                             vldr(condition,
65805                                  kDataTypeValueNone,
65806                                  DRegister(rd),
65807                                  &label);
65808                             break;
65809                           }
65810                         }
65811                         break;
65812                       }
65813                       default: {
65814                         if (((instr & 0xf0000000) == 0xf0000000) ||
65815                             ((instr & 0xe00) == 0xa00)) {
65816                           UnallocatedA32(instr);
65817                           return;
65818                         }
65819                         UnimplementedA32("LDC", instr);
65820                         break;
65821                       }
65822                     }
65823                     break;
65824                   }
65825                   default: {
65826                     switch (instr & 0x00000e00) {
65827                       case 0x00000a00: {
65828                         // 0x0d100a00
65829                         switch (instr & 0x00000100) {
65830                           case 0x00000000: {
65831                             // 0x0d100a00
65832                             if (((instr & 0xf0000000) == 0xf0000000) ||
65833                                 ((instr & 0xf0000) == 0xf0000)) {
65834                               UnallocatedA32(instr);
65835                               return;
65836                             }
65837                             Condition condition((instr >> 28) & 0xf);
65838                             unsigned rd = ExtractSRegister(instr, 22, 12);
65839                             unsigned rn = (instr >> 16) & 0xf;
65840                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
65841                                                                    : plus);
65842                             int32_t offset = (instr & 0xff) << 2;
65843                             // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2 NOLINT(whitespace/line_length)
65844                             vldr(condition,
65845                                  kDataTypeValueNone,
65846                                  SRegister(rd),
65847                                  MemOperand(Register(rn),
65848                                             sign,
65849                                             offset,
65850                                             Offset));
65851                             break;
65852                           }
65853                           case 0x00000100: {
65854                             // 0x0d100b00
65855                             if (((instr & 0xf0000000) == 0xf0000000) ||
65856                                 ((instr & 0xf0000) == 0xf0000)) {
65857                               UnallocatedA32(instr);
65858                               return;
65859                             }
65860                             Condition condition((instr >> 28) & 0xf);
65861                             unsigned rd = ExtractDRegister(instr, 22, 12);
65862                             unsigned rn = (instr >> 16) & 0xf;
65863                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
65864                                                                    : plus);
65865                             int32_t offset = (instr & 0xff) << 2;
65866                             // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1 NOLINT(whitespace/line_length)
65867                             vldr(condition,
65868                                  kDataTypeValueNone,
65869                                  DRegister(rd),
65870                                  MemOperand(Register(rn),
65871                                             sign,
65872                                             offset,
65873                                             Offset));
65874                             break;
65875                           }
65876                         }
65877                         break;
65878                       }
65879                       default: {
65880                         if (((instr & 0xf0000000) == 0xf0000000) ||
65881                             ((instr & 0xf0000) == 0xf0000) ||
65882                             ((instr & 0xe00) == 0xa00)) {
65883                           UnallocatedA32(instr);
65884                           return;
65885                         }
65886                         UnimplementedA32("LDC", instr);
65887                         break;
65888                       }
65889                     }
65890                     break;
65891                   }
65892                 }
65893                 break;
65894               }
65895               case 0x00200000: {
65896                 // 0x0d300000
65897                 switch (instr & 0x00000e00) {
65898                   case 0x00000a00: {
65899                     // 0x0d300a00
65900                     switch (instr & 0x00800100) {
65901                       case 0x00000000: {
65902                         // 0x0d300a00
65903                         if (((instr & 0xf0000000) == 0xf0000000)) {
65904                           UnallocatedA32(instr);
65905                           return;
65906                         }
65907                         Condition condition((instr >> 28) & 0xf);
65908                         unsigned rn = (instr >> 16) & 0xf;
65909                         unsigned first = ExtractSRegister(instr, 22, 12);
65910                         unsigned len = instr & 0xff;
65911                         // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
65912                         vldmdb(condition,
65913                                kDataTypeValueNone,
65914                                Register(rn),
65915                                WriteBack(WRITE_BACK),
65916                                SRegisterList(SRegister(first), len));
65917                         if ((len == 0) ||
65918                             ((first + len) > kNumberOfSRegisters)) {
65919                           UnpredictableA32(instr);
65920                         }
65921                         break;
65922                       }
65923                       case 0x00000100: {
65924                         // 0x0d300b00
65925                         switch (instr & 0x00000001) {
65926                           case 0x00000000: {
65927                             // 0x0d300b00
65928                             if (((instr & 0xf0000000) == 0xf0000000)) {
65929                               UnallocatedA32(instr);
65930                               return;
65931                             }
65932                             Condition condition((instr >> 28) & 0xf);
65933                             unsigned rn = (instr >> 16) & 0xf;
65934                             unsigned first = ExtractDRegister(instr, 22, 12);
65935                             unsigned imm8 = (instr & 0xff);
65936                             unsigned len = imm8 / 2;
65937                             unsigned end = first + len;
65938                             // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
65939                             vldmdb(condition,
65940                                    kDataTypeValueNone,
65941                                    Register(rn),
65942                                    WriteBack(WRITE_BACK),
65943                                    DRegisterList(DRegister(first), len));
65944                             if ((len == 0) || (len > 16) ||
65945                                 (end > kMaxNumberOfDRegisters)) {
65946                               UnpredictableA32(instr);
65947                             }
65948                             break;
65949                           }
65950                           case 0x00000001: {
65951                             // 0x0d300b01
65952                             if (((instr & 0xf0000000) == 0xf0000000)) {
65953                               UnallocatedA32(instr);
65954                               return;
65955                             }
65956                             Condition condition((instr >> 28) & 0xf);
65957                             unsigned rn = (instr >> 16) & 0xf;
65958                             unsigned first = ExtractDRegister(instr, 22, 12);
65959                             unsigned imm8 = (instr & 0xff);
65960                             unsigned len = imm8 / 2;
65961                             unsigned end = first + len;
65962                             // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
65963                             fldmdbx(condition,
65964                                     Register(rn),
65965                                     WriteBack(WRITE_BACK),
65966                                     DRegisterList(DRegister(first), len));
65967                             if ((len == 0) || (len > 16) || (end > 16)) {
65968                               UnpredictableA32(instr);
65969                             }
65970                             break;
65971                           }
65972                         }
65973                         break;
65974                       }
65975                       default:
65976                         UnallocatedA32(instr);
65977                         break;
65978                     }
65979                     break;
65980                   }
65981                   default: {
65982                     if (((instr & 0xf0000000) == 0xf0000000) ||
65983                         ((instr & 0xf0000) == 0xf0000) ||
65984                         ((instr & 0xe00) == 0xa00)) {
65985                       UnallocatedA32(instr);
65986                       return;
65987                     }
65988                     UnimplementedA32("LDC", instr);
65989                     break;
65990                   }
65991                 }
65992                 break;
65993               }
65994             }
65995             break;
65996           }
65997         }
65998         break;
65999       }
66000       case 0x0e000000: {
66001         // 0x0e000000
66002         switch (instr & 0x01000000) {
66003           case 0x00000000: {
66004             // 0x0e000000
66005             switch (instr & 0x00000010) {
66006               case 0x00000000: {
66007                 // 0x0e000000
66008                 switch (instr & 0x00000e00) {
66009                   case 0x00000a00: {
66010                     // 0x0e000a00
66011                     switch (instr & 0x00b00140) {
66012                       case 0x00000000: {
66013                         // 0x0e000a00
66014                         if (((instr & 0xf0000000) == 0xf0000000)) {
66015                           UnallocatedA32(instr);
66016                           return;
66017                         }
66018                         Condition condition((instr >> 28) & 0xf);
66019                         unsigned rd = ExtractSRegister(instr, 22, 12);
66020                         unsigned rn = ExtractSRegister(instr, 7, 16);
66021                         unsigned rm = ExtractSRegister(instr, 5, 0);
66022                         // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66023                         vmla(condition,
66024                              F32,
66025                              SRegister(rd),
66026                              SRegister(rn),
66027                              SRegister(rm));
66028                         break;
66029                       }
66030                       case 0x00000040: {
66031                         // 0x0e000a40
66032                         if (((instr & 0xf0000000) == 0xf0000000)) {
66033                           UnallocatedA32(instr);
66034                           return;
66035                         }
66036                         Condition condition((instr >> 28) & 0xf);
66037                         unsigned rd = ExtractSRegister(instr, 22, 12);
66038                         unsigned rn = ExtractSRegister(instr, 7, 16);
66039                         unsigned rm = ExtractSRegister(instr, 5, 0);
66040                         // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66041                         vmls(condition,
66042                              F32,
66043                              SRegister(rd),
66044                              SRegister(rn),
66045                              SRegister(rm));
66046                         break;
66047                       }
66048                       case 0x00000100: {
66049                         // 0x0e000b00
66050                         if (((instr & 0xf0000000) == 0xf0000000)) {
66051                           UnallocatedA32(instr);
66052                           return;
66053                         }
66054                         Condition condition((instr >> 28) & 0xf);
66055                         unsigned rd = ExtractDRegister(instr, 22, 12);
66056                         unsigned rn = ExtractDRegister(instr, 7, 16);
66057                         unsigned rm = ExtractDRegister(instr, 5, 0);
66058                         // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66059                         vmla(condition,
66060                              F64,
66061                              DRegister(rd),
66062                              DRegister(rn),
66063                              DRegister(rm));
66064                         break;
66065                       }
66066                       case 0x00000140: {
66067                         // 0x0e000b40
66068                         if (((instr & 0xf0000000) == 0xf0000000)) {
66069                           UnallocatedA32(instr);
66070                           return;
66071                         }
66072                         Condition condition((instr >> 28) & 0xf);
66073                         unsigned rd = ExtractDRegister(instr, 22, 12);
66074                         unsigned rn = ExtractDRegister(instr, 7, 16);
66075                         unsigned rm = ExtractDRegister(instr, 5, 0);
66076                         // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66077                         vmls(condition,
66078                              F64,
66079                              DRegister(rd),
66080                              DRegister(rn),
66081                              DRegister(rm));
66082                         break;
66083                       }
66084                       case 0x00100000: {
66085                         // 0x0e100a00
66086                         if (((instr & 0xf0000000) == 0xf0000000)) {
66087                           UnallocatedA32(instr);
66088                           return;
66089                         }
66090                         Condition condition((instr >> 28) & 0xf);
66091                         unsigned rd = ExtractSRegister(instr, 22, 12);
66092                         unsigned rn = ExtractSRegister(instr, 7, 16);
66093                         unsigned rm = ExtractSRegister(instr, 5, 0);
66094                         // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66095                         vnmls(condition,
66096                               F32,
66097                               SRegister(rd),
66098                               SRegister(rn),
66099                               SRegister(rm));
66100                         break;
66101                       }
66102                       case 0x00100040: {
66103                         // 0x0e100a40
66104                         if (((instr & 0xf0000000) == 0xf0000000)) {
66105                           UnallocatedA32(instr);
66106                           return;
66107                         }
66108                         Condition condition((instr >> 28) & 0xf);
66109                         unsigned rd = ExtractSRegister(instr, 22, 12);
66110                         unsigned rn = ExtractSRegister(instr, 7, 16);
66111                         unsigned rm = ExtractSRegister(instr, 5, 0);
66112                         // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66113                         vnmla(condition,
66114                               F32,
66115                               SRegister(rd),
66116                               SRegister(rn),
66117                               SRegister(rm));
66118                         break;
66119                       }
66120                       case 0x00100100: {
66121                         // 0x0e100b00
66122                         if (((instr & 0xf0000000) == 0xf0000000)) {
66123                           UnallocatedA32(instr);
66124                           return;
66125                         }
66126                         Condition condition((instr >> 28) & 0xf);
66127                         unsigned rd = ExtractDRegister(instr, 22, 12);
66128                         unsigned rn = ExtractDRegister(instr, 7, 16);
66129                         unsigned rm = ExtractDRegister(instr, 5, 0);
66130                         // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66131                         vnmls(condition,
66132                               F64,
66133                               DRegister(rd),
66134                               DRegister(rn),
66135                               DRegister(rm));
66136                         break;
66137                       }
66138                       case 0x00100140: {
66139                         // 0x0e100b40
66140                         if (((instr & 0xf0000000) == 0xf0000000)) {
66141                           UnallocatedA32(instr);
66142                           return;
66143                         }
66144                         Condition condition((instr >> 28) & 0xf);
66145                         unsigned rd = ExtractDRegister(instr, 22, 12);
66146                         unsigned rn = ExtractDRegister(instr, 7, 16);
66147                         unsigned rm = ExtractDRegister(instr, 5, 0);
66148                         // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66149                         vnmla(condition,
66150                               F64,
66151                               DRegister(rd),
66152                               DRegister(rn),
66153                               DRegister(rm));
66154                         break;
66155                       }
66156                       case 0x00200000: {
66157                         // 0x0e200a00
66158                         if (((instr & 0xf0000000) == 0xf0000000)) {
66159                           UnallocatedA32(instr);
66160                           return;
66161                         }
66162                         Condition condition((instr >> 28) & 0xf);
66163                         unsigned rd = ExtractSRegister(instr, 22, 12);
66164                         unsigned rn = ExtractSRegister(instr, 7, 16);
66165                         unsigned rm = ExtractSRegister(instr, 5, 0);
66166                         // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66167                         vmul(condition,
66168                              F32,
66169                              SRegister(rd),
66170                              SRegister(rn),
66171                              SRegister(rm));
66172                         break;
66173                       }
66174                       case 0x00200040: {
66175                         // 0x0e200a40
66176                         if (((instr & 0xf0000000) == 0xf0000000)) {
66177                           UnallocatedA32(instr);
66178                           return;
66179                         }
66180                         Condition condition((instr >> 28) & 0xf);
66181                         unsigned rd = ExtractSRegister(instr, 22, 12);
66182                         unsigned rn = ExtractSRegister(instr, 7, 16);
66183                         unsigned rm = ExtractSRegister(instr, 5, 0);
66184                         // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
66185                         vnmul(condition,
66186                               F32,
66187                               SRegister(rd),
66188                               SRegister(rn),
66189                               SRegister(rm));
66190                         break;
66191                       }
66192                       case 0x00200100: {
66193                         // 0x0e200b00
66194                         if (((instr & 0xf0000000) == 0xf0000000)) {
66195                           UnallocatedA32(instr);
66196                           return;
66197                         }
66198                         Condition condition((instr >> 28) & 0xf);
66199                         unsigned rd = ExtractDRegister(instr, 22, 12);
66200                         unsigned rn = ExtractDRegister(instr, 7, 16);
66201                         unsigned rm = ExtractDRegister(instr, 5, 0);
66202                         // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66203                         vmul(condition,
66204                              F64,
66205                              DRegister(rd),
66206                              DRegister(rn),
66207                              DRegister(rm));
66208                         break;
66209                       }
66210                       case 0x00200140: {
66211                         // 0x0e200b40
66212                         if (((instr & 0xf0000000) == 0xf0000000)) {
66213                           UnallocatedA32(instr);
66214                           return;
66215                         }
66216                         Condition condition((instr >> 28) & 0xf);
66217                         unsigned rd = ExtractDRegister(instr, 22, 12);
66218                         unsigned rn = ExtractDRegister(instr, 7, 16);
66219                         unsigned rm = ExtractDRegister(instr, 5, 0);
66220                         // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
66221                         vnmul(condition,
66222                               F64,
66223                               DRegister(rd),
66224                               DRegister(rn),
66225                               DRegister(rm));
66226                         break;
66227                       }
66228                       case 0x00300000: {
66229                         // 0x0e300a00
66230                         if (((instr & 0xf0000000) == 0xf0000000)) {
66231                           UnallocatedA32(instr);
66232                           return;
66233                         }
66234                         Condition condition((instr >> 28) & 0xf);
66235                         unsigned rd = ExtractSRegister(instr, 22, 12);
66236                         unsigned rn = ExtractSRegister(instr, 7, 16);
66237                         unsigned rm = ExtractSRegister(instr, 5, 0);
66238                         // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66239                         vadd(condition,
66240                              F32,
66241                              SRegister(rd),
66242                              SRegister(rn),
66243                              SRegister(rm));
66244                         break;
66245                       }
66246                       case 0x00300040: {
66247                         // 0x0e300a40
66248                         if (((instr & 0xf0000000) == 0xf0000000)) {
66249                           UnallocatedA32(instr);
66250                           return;
66251                         }
66252                         Condition condition((instr >> 28) & 0xf);
66253                         unsigned rd = ExtractSRegister(instr, 22, 12);
66254                         unsigned rn = ExtractSRegister(instr, 7, 16);
66255                         unsigned rm = ExtractSRegister(instr, 5, 0);
66256                         // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
66257                         vsub(condition,
66258                              F32,
66259                              SRegister(rd),
66260                              SRegister(rn),
66261                              SRegister(rm));
66262                         break;
66263                       }
66264                       case 0x00300100: {
66265                         // 0x0e300b00
66266                         if (((instr & 0xf0000000) == 0xf0000000)) {
66267                           UnallocatedA32(instr);
66268                           return;
66269                         }
66270                         Condition condition((instr >> 28) & 0xf);
66271                         unsigned rd = ExtractDRegister(instr, 22, 12);
66272                         unsigned rn = ExtractDRegister(instr, 7, 16);
66273                         unsigned rm = ExtractDRegister(instr, 5, 0);
66274                         // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66275                         vadd(condition,
66276                              F64,
66277                              DRegister(rd),
66278                              DRegister(rn),
66279                              DRegister(rm));
66280                         break;
66281                       }
66282                       case 0x00300140: {
66283                         // 0x0e300b40
66284                         if (((instr & 0xf0000000) == 0xf0000000)) {
66285                           UnallocatedA32(instr);
66286                           return;
66287                         }
66288                         Condition condition((instr >> 28) & 0xf);
66289                         unsigned rd = ExtractDRegister(instr, 22, 12);
66290                         unsigned rn = ExtractDRegister(instr, 7, 16);
66291                         unsigned rm = ExtractDRegister(instr, 5, 0);
66292                         // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
66293                         vsub(condition,
66294                              F64,
66295                              DRegister(rd),
66296                              DRegister(rn),
66297                              DRegister(rm));
66298                         break;
66299                       }
66300                       case 0x00800000: {
66301                         // 0x0e800a00
66302                         if (((instr & 0xf0000000) == 0xf0000000)) {
66303                           UnallocatedA32(instr);
66304                           return;
66305                         }
66306                         Condition condition((instr >> 28) & 0xf);
66307                         unsigned rd = ExtractSRegister(instr, 22, 12);
66308                         unsigned rn = ExtractSRegister(instr, 7, 16);
66309                         unsigned rm = ExtractSRegister(instr, 5, 0);
66310                         // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
66311                         vdiv(condition,
66312                              F32,
66313                              SRegister(rd),
66314                              SRegister(rn),
66315                              SRegister(rm));
66316                         break;
66317                       }
66318                       case 0x00800100: {
66319                         // 0x0e800b00
66320                         if (((instr & 0xf0000000) == 0xf0000000)) {
66321                           UnallocatedA32(instr);
66322                           return;
66323                         }
66324                         Condition condition((instr >> 28) & 0xf);
66325                         unsigned rd = ExtractDRegister(instr, 22, 12);
66326                         unsigned rn = ExtractDRegister(instr, 7, 16);
66327                         unsigned rm = ExtractDRegister(instr, 5, 0);
66328                         // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
66329                         vdiv(condition,
66330                              F64,
66331                              DRegister(rd),
66332                              DRegister(rn),
66333                              DRegister(rm));
66334                         break;
66335                       }
66336                       case 0x00900000: {
66337                         // 0x0e900a00
66338                         if (((instr & 0xf0000000) == 0xf0000000)) {
66339                           UnallocatedA32(instr);
66340                           return;
66341                         }
66342                         Condition condition((instr >> 28) & 0xf);
66343                         unsigned rd = ExtractSRegister(instr, 22, 12);
66344                         unsigned rn = ExtractSRegister(instr, 7, 16);
66345                         unsigned rm = ExtractSRegister(instr, 5, 0);
66346                         // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66347                         vfnms(condition,
66348                               F32,
66349                               SRegister(rd),
66350                               SRegister(rn),
66351                               SRegister(rm));
66352                         break;
66353                       }
66354                       case 0x00900040: {
66355                         // 0x0e900a40
66356                         if (((instr & 0xf0000000) == 0xf0000000)) {
66357                           UnallocatedA32(instr);
66358                           return;
66359                         }
66360                         Condition condition((instr >> 28) & 0xf);
66361                         unsigned rd = ExtractSRegister(instr, 22, 12);
66362                         unsigned rn = ExtractSRegister(instr, 7, 16);
66363                         unsigned rm = ExtractSRegister(instr, 5, 0);
66364                         // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
66365                         vfnma(condition,
66366                               F32,
66367                               SRegister(rd),
66368                               SRegister(rn),
66369                               SRegister(rm));
66370                         break;
66371                       }
66372                       case 0x00900100: {
66373                         // 0x0e900b00
66374                         if (((instr & 0xf0000000) == 0xf0000000)) {
66375                           UnallocatedA32(instr);
66376                           return;
66377                         }
66378                         Condition condition((instr >> 28) & 0xf);
66379                         unsigned rd = ExtractDRegister(instr, 22, 12);
66380                         unsigned rn = ExtractDRegister(instr, 7, 16);
66381                         unsigned rm = ExtractDRegister(instr, 5, 0);
66382                         // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66383                         vfnms(condition,
66384                               F64,
66385                               DRegister(rd),
66386                               DRegister(rn),
66387                               DRegister(rm));
66388                         break;
66389                       }
66390                       case 0x00900140: {
66391                         // 0x0e900b40
66392                         if (((instr & 0xf0000000) == 0xf0000000)) {
66393                           UnallocatedA32(instr);
66394                           return;
66395                         }
66396                         Condition condition((instr >> 28) & 0xf);
66397                         unsigned rd = ExtractDRegister(instr, 22, 12);
66398                         unsigned rn = ExtractDRegister(instr, 7, 16);
66399                         unsigned rm = ExtractDRegister(instr, 5, 0);
66400                         // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
66401                         vfnma(condition,
66402                               F64,
66403                               DRegister(rd),
66404                               DRegister(rn),
66405                               DRegister(rm));
66406                         break;
66407                       }
66408                       case 0x00a00000: {
66409                         // 0x0ea00a00
66410                         if (((instr & 0xf0000000) == 0xf0000000)) {
66411                           UnallocatedA32(instr);
66412                           return;
66413                         }
66414                         Condition condition((instr >> 28) & 0xf);
66415                         unsigned rd = ExtractSRegister(instr, 22, 12);
66416                         unsigned rn = ExtractSRegister(instr, 7, 16);
66417                         unsigned rm = ExtractSRegister(instr, 5, 0);
66418                         // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66419                         vfma(condition,
66420                              F32,
66421                              SRegister(rd),
66422                              SRegister(rn),
66423                              SRegister(rm));
66424                         break;
66425                       }
66426                       case 0x00a00040: {
66427                         // 0x0ea00a40
66428                         if (((instr & 0xf0000000) == 0xf0000000)) {
66429                           UnallocatedA32(instr);
66430                           return;
66431                         }
66432                         Condition condition((instr >> 28) & 0xf);
66433                         unsigned rd = ExtractSRegister(instr, 22, 12);
66434                         unsigned rn = ExtractSRegister(instr, 7, 16);
66435                         unsigned rm = ExtractSRegister(instr, 5, 0);
66436                         // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
66437                         vfms(condition,
66438                              F32,
66439                              SRegister(rd),
66440                              SRegister(rn),
66441                              SRegister(rm));
66442                         break;
66443                       }
66444                       case 0x00a00100: {
66445                         // 0x0ea00b00
66446                         if (((instr & 0xf0000000) == 0xf0000000)) {
66447                           UnallocatedA32(instr);
66448                           return;
66449                         }
66450                         Condition condition((instr >> 28) & 0xf);
66451                         unsigned rd = ExtractDRegister(instr, 22, 12);
66452                         unsigned rn = ExtractDRegister(instr, 7, 16);
66453                         unsigned rm = ExtractDRegister(instr, 5, 0);
66454                         // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66455                         vfma(condition,
66456                              F64,
66457                              DRegister(rd),
66458                              DRegister(rn),
66459                              DRegister(rm));
66460                         break;
66461                       }
66462                       case 0x00a00140: {
66463                         // 0x0ea00b40
66464                         if (((instr & 0xf0000000) == 0xf0000000)) {
66465                           UnallocatedA32(instr);
66466                           return;
66467                         }
66468                         Condition condition((instr >> 28) & 0xf);
66469                         unsigned rd = ExtractDRegister(instr, 22, 12);
66470                         unsigned rn = ExtractDRegister(instr, 7, 16);
66471                         unsigned rm = ExtractDRegister(instr, 5, 0);
66472                         // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
66473                         vfms(condition,
66474                              F64,
66475                              DRegister(rd),
66476                              DRegister(rn),
66477                              DRegister(rm));
66478                         break;
66479                       }
66480                       case 0x00b00000: {
66481                         // 0x0eb00a00
66482                         if (((instr & 0xf0000000) == 0xf0000000)) {
66483                           UnallocatedA32(instr);
66484                           return;
66485                         }
66486                         Condition condition((instr >> 28) & 0xf);
66487                         unsigned rd = ExtractSRegister(instr, 22, 12);
66488                         uint32_t encoded_imm =
66489                             (instr & 0xf) | ((instr >> 12) & 0xf0);
66490                         NeonImmediate imm =
66491                             ImmediateVFP::Decode<float>(encoded_imm);
66492                         // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
66493                         vmov(condition, F32, SRegister(rd), imm);
66494                         if (((instr & 0xfb00ff0) != 0xeb00a00)) {
66495                           UnpredictableA32(instr);
66496                         }
66497                         break;
66498                       }
66499                       case 0x00b00040: {
66500                         // 0x0eb00a40
66501                         switch (instr & 0x000e0000) {
66502                           case 0x00000000: {
66503                             // 0x0eb00a40
66504                             switch (instr & 0x00010080) {
66505                               case 0x00000000: {
66506                                 // 0x0eb00a40
66507                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66508                                   UnallocatedA32(instr);
66509                                   return;
66510                                 }
66511                                 Condition condition((instr >> 28) & 0xf);
66512                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66513                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66514                                 // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66515                                 vmov(condition,
66516                                      F32,
66517                                      SRegister(rd),
66518                                      SRegister(rm));
66519                                 break;
66520                               }
66521                               case 0x00000080: {
66522                                 // 0x0eb00ac0
66523                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66524                                   UnallocatedA32(instr);
66525                                   return;
66526                                 }
66527                                 Condition condition((instr >> 28) & 0xf);
66528                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66529                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66530                                 // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66531                                 vabs(condition,
66532                                      F32,
66533                                      SRegister(rd),
66534                                      SRegister(rm));
66535                                 break;
66536                               }
66537                               case 0x00010000: {
66538                                 // 0x0eb10a40
66539                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66540                                   UnallocatedA32(instr);
66541                                   return;
66542                                 }
66543                                 Condition condition((instr >> 28) & 0xf);
66544                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66545                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66546                                 // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
66547                                 vneg(condition,
66548                                      F32,
66549                                      SRegister(rd),
66550                                      SRegister(rm));
66551                                 break;
66552                               }
66553                               case 0x00010080: {
66554                                 // 0x0eb10ac0
66555                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66556                                   UnallocatedA32(instr);
66557                                   return;
66558                                 }
66559                                 Condition condition((instr >> 28) & 0xf);
66560                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66561                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66562                                 // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66563                                 vsqrt(condition,
66564                                       F32,
66565                                       SRegister(rd),
66566                                       SRegister(rm));
66567                                 break;
66568                               }
66569                             }
66570                             break;
66571                           }
66572                           case 0x00020000: {
66573                             // 0x0eb20a40
66574                             switch (instr & 0x00010080) {
66575                               case 0x00000000: {
66576                                 // 0x0eb20a40
66577                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66578                                   UnallocatedA32(instr);
66579                                   return;
66580                                 }
66581                                 Condition condition((instr >> 28) & 0xf);
66582                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66583                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66584                                 // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66585                                 vcvtb(condition,
66586                                       F32,
66587                                       F16,
66588                                       SRegister(rd),
66589                                       SRegister(rm));
66590                                 break;
66591                               }
66592                               case 0x00000080: {
66593                                 // 0x0eb20ac0
66594                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66595                                   UnallocatedA32(instr);
66596                                   return;
66597                                 }
66598                                 Condition condition((instr >> 28) & 0xf);
66599                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66600                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66601                                 // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
66602                                 vcvtt(condition,
66603                                       F32,
66604                                       F16,
66605                                       SRegister(rd),
66606                                       SRegister(rm));
66607                                 break;
66608                               }
66609                               case 0x00010000: {
66610                                 // 0x0eb30a40
66611                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66612                                   UnallocatedA32(instr);
66613                                   return;
66614                                 }
66615                                 Condition condition((instr >> 28) & 0xf);
66616                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66617                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66618                                 // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66619                                 vcvtb(condition,
66620                                       F16,
66621                                       F32,
66622                                       SRegister(rd),
66623                                       SRegister(rm));
66624                                 break;
66625                               }
66626                               case 0x00010080: {
66627                                 // 0x0eb30ac0
66628                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66629                                   UnallocatedA32(instr);
66630                                   return;
66631                                 }
66632                                 Condition condition((instr >> 28) & 0xf);
66633                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66634                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66635                                 // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
66636                                 vcvtt(condition,
66637                                       F16,
66638                                       F32,
66639                                       SRegister(rd),
66640                                       SRegister(rm));
66641                                 break;
66642                               }
66643                             }
66644                             break;
66645                           }
66646                           case 0x00040000: {
66647                             // 0x0eb40a40
66648                             switch (instr & 0x00010080) {
66649                               case 0x00000000: {
66650                                 // 0x0eb40a40
66651                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66652                                   UnallocatedA32(instr);
66653                                   return;
66654                                 }
66655                                 Condition condition((instr >> 28) & 0xf);
66656                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66657                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66658                                 // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66659                                 vcmp(condition,
66660                                      F32,
66661                                      SRegister(rd),
66662                                      SRegister(rm));
66663                                 break;
66664                               }
66665                               case 0x00000080: {
66666                                 // 0x0eb40ac0
66667                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66668                                   UnallocatedA32(instr);
66669                                   return;
66670                                 }
66671                                 Condition condition((instr >> 28) & 0xf);
66672                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66673                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66674                                 // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
66675                                 vcmpe(condition,
66676                                       F32,
66677                                       SRegister(rd),
66678                                       SRegister(rm));
66679                                 break;
66680                               }
66681                               case 0x00010000: {
66682                                 // 0x0eb50a40
66683                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66684                                   UnallocatedA32(instr);
66685                                   return;
66686                                 }
66687                                 Condition condition((instr >> 28) & 0xf);
66688                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66689                                 // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66690                                 vcmp(condition, F32, SRegister(rd), 0.0);
66691                                 if (((instr & 0xfbf0fff) != 0xeb50a40)) {
66692                                   UnpredictableA32(instr);
66693                                 }
66694                                 break;
66695                               }
66696                               case 0x00010080: {
66697                                 // 0x0eb50ac0
66698                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66699                                   UnallocatedA32(instr);
66700                                   return;
66701                                 }
66702                                 Condition condition((instr >> 28) & 0xf);
66703                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66704                                 // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
66705                                 vcmpe(condition, F32, SRegister(rd), 0.0);
66706                                 if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
66707                                   UnpredictableA32(instr);
66708                                 }
66709                                 break;
66710                               }
66711                             }
66712                             break;
66713                           }
66714                           case 0x00060000: {
66715                             // 0x0eb60a40
66716                             switch (instr & 0x00010080) {
66717                               case 0x00000000: {
66718                                 // 0x0eb60a40
66719                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66720                                   UnallocatedA32(instr);
66721                                   return;
66722                                 }
66723                                 Condition condition((instr >> 28) & 0xf);
66724                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66725                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66726                                 // VRINTR{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
66727                                 vrintr(condition,
66728                                        F32,
66729                                        F32,
66730                                        SRegister(rd),
66731                                        SRegister(rm));
66732                                 break;
66733                               }
66734                               case 0x00000080: {
66735                                 // 0x0eb60ac0
66736                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66737                                   UnallocatedA32(instr);
66738                                   return;
66739                                 }
66740                                 Condition condition((instr >> 28) & 0xf);
66741                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66742                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66743                                 // VRINTZ{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
66744                                 vrintz(condition,
66745                                        F32,
66746                                        F32,
66747                                        SRegister(rd),
66748                                        SRegister(rm));
66749                                 break;
66750                               }
66751                               case 0x00010000: {
66752                                 // 0x0eb70a40
66753                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66754                                   UnallocatedA32(instr);
66755                                   return;
66756                                 }
66757                                 Condition condition((instr >> 28) & 0xf);
66758                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66759                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66760                                 // VRINTX{<c>}{<q>}.F32.F32 <Sd>, <Sm> ; A1
66761                                 vrintx(condition,
66762                                        F32,
66763                                        F32,
66764                                        SRegister(rd),
66765                                        SRegister(rm));
66766                                 break;
66767                               }
66768                               case 0x00010080: {
66769                                 // 0x0eb70ac0
66770                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66771                                   UnallocatedA32(instr);
66772                                   return;
66773                                 }
66774                                 Condition condition((instr >> 28) & 0xf);
66775                                 unsigned rd = ExtractDRegister(instr, 22, 12);
66776                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66777                                 // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
66778                                 vcvt(condition,
66779                                      F64,
66780                                      F32,
66781                                      DRegister(rd),
66782                                      SRegister(rm));
66783                                 break;
66784                               }
66785                             }
66786                             break;
66787                           }
66788                           case 0x00080000: {
66789                             // 0x0eb80a40
66790                             if ((instr & 0x00010000) == 0x00000000) {
66791                               if (((instr & 0xf0000000) == 0xf0000000)) {
66792                                 UnallocatedA32(instr);
66793                                 return;
66794                               }
66795                               Condition condition((instr >> 28) & 0xf);
66796                               DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
66797                               if (dt.Is(kDataTypeValueInvalid)) {
66798                                 UnallocatedA32(instr);
66799                                 return;
66800                               }
66801                               unsigned rd = ExtractSRegister(instr, 22, 12);
66802                               unsigned rm = ExtractSRegister(instr, 5, 0);
66803                               // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
66804                               vcvt(condition,
66805                                    F32,
66806                                    dt,
66807                                    SRegister(rd),
66808                                    SRegister(rm));
66809                             } else {
66810                               UnallocatedA32(instr);
66811                             }
66812                             break;
66813                           }
66814                           case 0x000a0000: {
66815                             // 0x0eba0a40
66816                             if (((instr & 0xf0000000) == 0xf0000000)) {
66817                               UnallocatedA32(instr);
66818                               return;
66819                             }
66820                             Condition condition((instr >> 28) & 0xf);
66821                             DataType dt = Dt_U_sx_1_Decode(
66822                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
66823                             if (dt.Is(kDataTypeValueInvalid)) {
66824                               UnallocatedA32(instr);
66825                               return;
66826                             }
66827                             unsigned rd = ExtractSRegister(instr, 22, 12);
66828                             unsigned offset = 32;
66829                             if (dt.Is(S16) || dt.Is(U16)) {
66830                               offset = 16;
66831                             }
66832                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66833                                                        ((instr << 1) & 0x1e));
66834                             // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
66835                             vcvt(condition,
66836                                  F32,
66837                                  dt,
66838                                  SRegister(rd),
66839                                  SRegister(rd),
66840                                  fbits);
66841                             break;
66842                           }
66843                           case 0x000c0000: {
66844                             // 0x0ebc0a40
66845                             switch (instr & 0x00010080) {
66846                               case 0x00000000: {
66847                                 // 0x0ebc0a40
66848                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66849                                   UnallocatedA32(instr);
66850                                   return;
66851                                 }
66852                                 Condition condition((instr >> 28) & 0xf);
66853                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66854                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66855                                 // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
66856                                 vcvtr(condition,
66857                                       U32,
66858                                       F32,
66859                                       SRegister(rd),
66860                                       SRegister(rm));
66861                                 break;
66862                               }
66863                               case 0x00000080: {
66864                                 // 0x0ebc0ac0
66865                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66866                                   UnallocatedA32(instr);
66867                                   return;
66868                                 }
66869                                 Condition condition((instr >> 28) & 0xf);
66870                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66871                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66872                                 // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
66873                                 vcvt(condition,
66874                                      U32,
66875                                      F32,
66876                                      SRegister(rd),
66877                                      SRegister(rm));
66878                                 break;
66879                               }
66880                               case 0x00010000: {
66881                                 // 0x0ebd0a40
66882                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66883                                   UnallocatedA32(instr);
66884                                   return;
66885                                 }
66886                                 Condition condition((instr >> 28) & 0xf);
66887                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66888                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66889                                 // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
66890                                 vcvtr(condition,
66891                                       S32,
66892                                       F32,
66893                                       SRegister(rd),
66894                                       SRegister(rm));
66895                                 break;
66896                               }
66897                               case 0x00010080: {
66898                                 // 0x0ebd0ac0
66899                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66900                                   UnallocatedA32(instr);
66901                                   return;
66902                                 }
66903                                 Condition condition((instr >> 28) & 0xf);
66904                                 unsigned rd = ExtractSRegister(instr, 22, 12);
66905                                 unsigned rm = ExtractSRegister(instr, 5, 0);
66906                                 // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
66907                                 vcvt(condition,
66908                                      S32,
66909                                      F32,
66910                                      SRegister(rd),
66911                                      SRegister(rm));
66912                                 break;
66913                               }
66914                             }
66915                             break;
66916                           }
66917                           case 0x000e0000: {
66918                             // 0x0ebe0a40
66919                             if (((instr & 0xf0000000) == 0xf0000000)) {
66920                               UnallocatedA32(instr);
66921                               return;
66922                             }
66923                             Condition condition((instr >> 28) & 0xf);
66924                             DataType dt = Dt_U_sx_1_Decode(
66925                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
66926                             if (dt.Is(kDataTypeValueInvalid)) {
66927                               UnallocatedA32(instr);
66928                               return;
66929                             }
66930                             unsigned rd = ExtractSRegister(instr, 22, 12);
66931                             unsigned offset = 32;
66932                             if (dt.Is(S16) || dt.Is(U16)) {
66933                               offset = 16;
66934                             }
66935                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
66936                                                        ((instr << 1) & 0x1e));
66937                             // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
66938                             vcvt(condition,
66939                                  dt,
66940                                  F32,
66941                                  SRegister(rd),
66942                                  SRegister(rd),
66943                                  fbits);
66944                             break;
66945                           }
66946                         }
66947                         break;
66948                       }
66949                       case 0x00b00100: {
66950                         // 0x0eb00b00
66951                         if (((instr & 0xf0000000) == 0xf0000000)) {
66952                           UnallocatedA32(instr);
66953                           return;
66954                         }
66955                         Condition condition((instr >> 28) & 0xf);
66956                         unsigned rd = ExtractDRegister(instr, 22, 12);
66957                         uint32_t encoded_imm =
66958                             (instr & 0xf) | ((instr >> 12) & 0xf0);
66959                         NeonImmediate imm =
66960                             ImmediateVFP::Decode<double>(encoded_imm);
66961                         // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
66962                         vmov(condition, F64, DRegister(rd), imm);
66963                         if (((instr & 0xfb00ff0) != 0xeb00b00)) {
66964                           UnpredictableA32(instr);
66965                         }
66966                         break;
66967                       }
66968                       case 0x00b00140: {
66969                         // 0x0eb00b40
66970                         switch (instr & 0x000e0000) {
66971                           case 0x00000000: {
66972                             // 0x0eb00b40
66973                             switch (instr & 0x00010080) {
66974                               case 0x00000000: {
66975                                 // 0x0eb00b40
66976                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66977                                   UnallocatedA32(instr);
66978                                   return;
66979                                 }
66980                                 Condition condition((instr >> 28) & 0xf);
66981                                 unsigned rd = ExtractDRegister(instr, 22, 12);
66982                                 unsigned rm = ExtractDRegister(instr, 5, 0);
66983                                 // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
66984                                 vmov(condition,
66985                                      F64,
66986                                      DRegister(rd),
66987                                      DRegister(rm));
66988                                 break;
66989                               }
66990                               case 0x00000080: {
66991                                 // 0x0eb00bc0
66992                                 if (((instr & 0xf0000000) == 0xf0000000)) {
66993                                   UnallocatedA32(instr);
66994                                   return;
66995                                 }
66996                                 Condition condition((instr >> 28) & 0xf);
66997                                 unsigned rd = ExtractDRegister(instr, 22, 12);
66998                                 unsigned rm = ExtractDRegister(instr, 5, 0);
66999                                 // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
67000                                 vabs(condition,
67001                                      F64,
67002                                      DRegister(rd),
67003                                      DRegister(rm));
67004                                 break;
67005                               }
67006                               case 0x00010000: {
67007                                 // 0x0eb10b40
67008                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67009                                   UnallocatedA32(instr);
67010                                   return;
67011                                 }
67012                                 Condition condition((instr >> 28) & 0xf);
67013                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67014                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67015                                 // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
67016                                 vneg(condition,
67017                                      F64,
67018                                      DRegister(rd),
67019                                      DRegister(rm));
67020                                 break;
67021                               }
67022                               case 0x00010080: {
67023                                 // 0x0eb10bc0
67024                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67025                                   UnallocatedA32(instr);
67026                                   return;
67027                                 }
67028                                 Condition condition((instr >> 28) & 0xf);
67029                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67030                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67031                                 // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
67032                                 vsqrt(condition,
67033                                       F64,
67034                                       DRegister(rd),
67035                                       DRegister(rm));
67036                                 break;
67037                               }
67038                             }
67039                             break;
67040                           }
67041                           case 0x00020000: {
67042                             // 0x0eb20b40
67043                             switch (instr & 0x00010080) {
67044                               case 0x00000000: {
67045                                 // 0x0eb20b40
67046                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67047                                   UnallocatedA32(instr);
67048                                   return;
67049                                 }
67050                                 Condition condition((instr >> 28) & 0xf);
67051                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67052                                 unsigned rm = ExtractSRegister(instr, 5, 0);
67053                                 // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
67054                                 vcvtb(condition,
67055                                       F64,
67056                                       F16,
67057                                       DRegister(rd),
67058                                       SRegister(rm));
67059                                 break;
67060                               }
67061                               case 0x00000080: {
67062                                 // 0x0eb20bc0
67063                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67064                                   UnallocatedA32(instr);
67065                                   return;
67066                                 }
67067                                 Condition condition((instr >> 28) & 0xf);
67068                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67069                                 unsigned rm = ExtractSRegister(instr, 5, 0);
67070                                 // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
67071                                 vcvtt(condition,
67072                                       F64,
67073                                       F16,
67074                                       DRegister(rd),
67075                                       SRegister(rm));
67076                                 break;
67077                               }
67078                               case 0x00010000: {
67079                                 // 0x0eb30b40
67080                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67081                                   UnallocatedA32(instr);
67082                                   return;
67083                                 }
67084                                 Condition condition((instr >> 28) & 0xf);
67085                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67086                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67087                                 // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
67088                                 vcvtb(condition,
67089                                       F16,
67090                                       F64,
67091                                       SRegister(rd),
67092                                       DRegister(rm));
67093                                 break;
67094                               }
67095                               case 0x00010080: {
67096                                 // 0x0eb30bc0
67097                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67098                                   UnallocatedA32(instr);
67099                                   return;
67100                                 }
67101                                 Condition condition((instr >> 28) & 0xf);
67102                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67103                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67104                                 // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
67105                                 vcvtt(condition,
67106                                       F16,
67107                                       F64,
67108                                       SRegister(rd),
67109                                       DRegister(rm));
67110                                 break;
67111                               }
67112                             }
67113                             break;
67114                           }
67115                           case 0x00040000: {
67116                             // 0x0eb40b40
67117                             switch (instr & 0x00010080) {
67118                               case 0x00000000: {
67119                                 // 0x0eb40b40
67120                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67121                                   UnallocatedA32(instr);
67122                                   return;
67123                                 }
67124                                 Condition condition((instr >> 28) & 0xf);
67125                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67126                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67127                                 // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
67128                                 vcmp(condition,
67129                                      F64,
67130                                      DRegister(rd),
67131                                      DRegister(rm));
67132                                 break;
67133                               }
67134                               case 0x00000080: {
67135                                 // 0x0eb40bc0
67136                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67137                                   UnallocatedA32(instr);
67138                                   return;
67139                                 }
67140                                 Condition condition((instr >> 28) & 0xf);
67141                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67142                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67143                                 // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
67144                                 vcmpe(condition,
67145                                       F64,
67146                                       DRegister(rd),
67147                                       DRegister(rm));
67148                                 break;
67149                               }
67150                               case 0x00010000: {
67151                                 // 0x0eb50b40
67152                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67153                                   UnallocatedA32(instr);
67154                                   return;
67155                                 }
67156                                 Condition condition((instr >> 28) & 0xf);
67157                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67158                                 // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
67159                                 vcmp(condition, F64, DRegister(rd), 0.0);
67160                                 if (((instr & 0xfbf0fff) != 0xeb50b40)) {
67161                                   UnpredictableA32(instr);
67162                                 }
67163                                 break;
67164                               }
67165                               case 0x00010080: {
67166                                 // 0x0eb50bc0
67167                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67168                                   UnallocatedA32(instr);
67169                                   return;
67170                                 }
67171                                 Condition condition((instr >> 28) & 0xf);
67172                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67173                                 // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
67174                                 vcmpe(condition, F64, DRegister(rd), 0.0);
67175                                 if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
67176                                   UnpredictableA32(instr);
67177                                 }
67178                                 break;
67179                               }
67180                             }
67181                             break;
67182                           }
67183                           case 0x00060000: {
67184                             // 0x0eb60b40
67185                             switch (instr & 0x00010080) {
67186                               case 0x00000000: {
67187                                 // 0x0eb60b40
67188                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67189                                   UnallocatedA32(instr);
67190                                   return;
67191                                 }
67192                                 Condition condition((instr >> 28) & 0xf);
67193                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67194                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67195                                 // VRINTR{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
67196                                 vrintr(condition,
67197                                        F64,
67198                                        F64,
67199                                        DRegister(rd),
67200                                        DRegister(rm));
67201                                 break;
67202                               }
67203                               case 0x00000080: {
67204                                 // 0x0eb60bc0
67205                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67206                                   UnallocatedA32(instr);
67207                                   return;
67208                                 }
67209                                 Condition condition((instr >> 28) & 0xf);
67210                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67211                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67212                                 // VRINTZ{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
67213                                 vrintz(condition,
67214                                        F64,
67215                                        F64,
67216                                        DRegister(rd),
67217                                        DRegister(rm));
67218                                 break;
67219                               }
67220                               case 0x00010000: {
67221                                 // 0x0eb70b40
67222                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67223                                   UnallocatedA32(instr);
67224                                   return;
67225                                 }
67226                                 Condition condition((instr >> 28) & 0xf);
67227                                 unsigned rd = ExtractDRegister(instr, 22, 12);
67228                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67229                                 // VRINTX{<c>}{<q>}.F64.F64 <Dd>, <Dm> ; A1
67230                                 vrintx(condition,
67231                                        F64,
67232                                        F64,
67233                                        DRegister(rd),
67234                                        DRegister(rm));
67235                                 break;
67236                               }
67237                               case 0x00010080: {
67238                                 // 0x0eb70bc0
67239                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67240                                   UnallocatedA32(instr);
67241                                   return;
67242                                 }
67243                                 Condition condition((instr >> 28) & 0xf);
67244                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67245                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67246                                 // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
67247                                 vcvt(condition,
67248                                      F32,
67249                                      F64,
67250                                      SRegister(rd),
67251                                      DRegister(rm));
67252                                 break;
67253                               }
67254                             }
67255                             break;
67256                           }
67257                           case 0x00080000: {
67258                             // 0x0eb80b40
67259                             if ((instr & 0x00010000) == 0x00000000) {
67260                               if (((instr & 0xf0000000) == 0xf0000000)) {
67261                                 UnallocatedA32(instr);
67262                                 return;
67263                               }
67264                               Condition condition((instr >> 28) & 0xf);
67265                               DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
67266                               if (dt.Is(kDataTypeValueInvalid)) {
67267                                 UnallocatedA32(instr);
67268                                 return;
67269                               }
67270                               unsigned rd = ExtractDRegister(instr, 22, 12);
67271                               unsigned rm = ExtractSRegister(instr, 5, 0);
67272                               // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
67273                               vcvt(condition,
67274                                    F64,
67275                                    dt,
67276                                    DRegister(rd),
67277                                    SRegister(rm));
67278                             } else {
67279                               UnallocatedA32(instr);
67280                             }
67281                             break;
67282                           }
67283                           case 0x000a0000: {
67284                             // 0x0eba0b40
67285                             if (((instr & 0xf0000000) == 0xf0000000)) {
67286                               UnallocatedA32(instr);
67287                               return;
67288                             }
67289                             Condition condition((instr >> 28) & 0xf);
67290                             DataType dt = Dt_U_sx_1_Decode(
67291                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
67292                             if (dt.Is(kDataTypeValueInvalid)) {
67293                               UnallocatedA32(instr);
67294                               return;
67295                             }
67296                             unsigned rd = ExtractDRegister(instr, 22, 12);
67297                             unsigned offset = 32;
67298                             if (dt.Is(S16) || dt.Is(U16)) {
67299                               offset = 16;
67300                             }
67301                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67302                                                        ((instr << 1) & 0x1e));
67303                             // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
67304                             vcvt(condition,
67305                                  F64,
67306                                  dt,
67307                                  DRegister(rd),
67308                                  DRegister(rd),
67309                                  fbits);
67310                             break;
67311                           }
67312                           case 0x000c0000: {
67313                             // 0x0ebc0b40
67314                             switch (instr & 0x00010080) {
67315                               case 0x00000000: {
67316                                 // 0x0ebc0b40
67317                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67318                                   UnallocatedA32(instr);
67319                                   return;
67320                                 }
67321                                 Condition condition((instr >> 28) & 0xf);
67322                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67323                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67324                                 // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
67325                                 vcvtr(condition,
67326                                       U32,
67327                                       F64,
67328                                       SRegister(rd),
67329                                       DRegister(rm));
67330                                 break;
67331                               }
67332                               case 0x00000080: {
67333                                 // 0x0ebc0bc0
67334                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67335                                   UnallocatedA32(instr);
67336                                   return;
67337                                 }
67338                                 Condition condition((instr >> 28) & 0xf);
67339                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67340                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67341                                 // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
67342                                 vcvt(condition,
67343                                      U32,
67344                                      F64,
67345                                      SRegister(rd),
67346                                      DRegister(rm));
67347                                 break;
67348                               }
67349                               case 0x00010000: {
67350                                 // 0x0ebd0b40
67351                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67352                                   UnallocatedA32(instr);
67353                                   return;
67354                                 }
67355                                 Condition condition((instr >> 28) & 0xf);
67356                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67357                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67358                                 // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67359                                 vcvtr(condition,
67360                                       S32,
67361                                       F64,
67362                                       SRegister(rd),
67363                                       DRegister(rm));
67364                                 break;
67365                               }
67366                               case 0x00010080: {
67367                                 // 0x0ebd0bc0
67368                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67369                                   UnallocatedA32(instr);
67370                                   return;
67371                                 }
67372                                 Condition condition((instr >> 28) & 0xf);
67373                                 unsigned rd = ExtractSRegister(instr, 22, 12);
67374                                 unsigned rm = ExtractDRegister(instr, 5, 0);
67375                                 // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
67376                                 vcvt(condition,
67377                                      S32,
67378                                      F64,
67379                                      SRegister(rd),
67380                                      DRegister(rm));
67381                                 break;
67382                               }
67383                             }
67384                             break;
67385                           }
67386                           case 0x000e0000: {
67387                             // 0x0ebe0b40
67388                             if (((instr & 0xf0000000) == 0xf0000000)) {
67389                               UnallocatedA32(instr);
67390                               return;
67391                             }
67392                             Condition condition((instr >> 28) & 0xf);
67393                             DataType dt = Dt_U_sx_1_Decode(
67394                                 ((instr >> 7) & 0x1) | ((instr >> 15) & 0x2));
67395                             if (dt.Is(kDataTypeValueInvalid)) {
67396                               UnallocatedA32(instr);
67397                               return;
67398                             }
67399                             unsigned rd = ExtractDRegister(instr, 22, 12);
67400                             unsigned offset = 32;
67401                             if (dt.Is(S16) || dt.Is(U16)) {
67402                               offset = 16;
67403                             }
67404                             uint32_t fbits = offset - (((instr >> 5) & 0x1) |
67405                                                        ((instr << 1) & 0x1e));
67406                             // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
67407                             vcvt(condition,
67408                                  dt,
67409                                  F64,
67410                                  DRegister(rd),
67411                                  DRegister(rd),
67412                                  fbits);
67413                             break;
67414                           }
67415                         }
67416                         break;
67417                       }
67418                       default:
67419                         UnallocatedA32(instr);
67420                         break;
67421                     }
67422                     break;
67423                   }
67424                   default: {
67425                     if (((instr & 0xf0000000) == 0xf0000000) ||
67426                         ((instr & 0xe00) == 0xa00)) {
67427                       UnallocatedA32(instr);
67428                       return;
67429                     }
67430                     UnimplementedA32("CDP", instr);
67431                     break;
67432                   }
67433                 }
67434                 break;
67435               }
67436               case 0x00000010: {
67437                 // 0x0e000010
67438                 switch (instr & 0x00100000) {
67439                   case 0x00000000: {
67440                     // 0x0e000010
67441                     switch (instr & 0x00000e00) {
67442                       case 0x00000a00: {
67443                         // 0x0e000a10
67444                         switch (instr & 0x00800100) {
67445                           case 0x00000000: {
67446                             // 0x0e000a10
67447                             if ((instr & 0x00600000) == 0x00000000) {
67448                               if (((instr & 0xf0000000) == 0xf0000000)) {
67449                                 UnallocatedA32(instr);
67450                                 return;
67451                               }
67452                               Condition condition((instr >> 28) & 0xf);
67453                               unsigned rn = ExtractSRegister(instr, 7, 16);
67454                               unsigned rt = (instr >> 12) & 0xf;
67455                               // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
67456                               vmov(condition, SRegister(rn), Register(rt));
67457                               if (((instr & 0xff00f7f) != 0xe000a10)) {
67458                                 UnpredictableA32(instr);
67459                               }
67460                             } else {
67461                               UnallocatedA32(instr);
67462                             }
67463                             break;
67464                           }
67465                           case 0x00000100: {
67466                             // 0x0e000b10
67467                             if (((instr & 0xf0000000) == 0xf0000000)) {
67468                               UnallocatedA32(instr);
67469                               return;
67470                             }
67471                             Condition condition((instr >> 28) & 0xf);
67472                             unsigned lane;
67473                             DataType dt =
67474                                 Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
67475                                                           ((instr >> 19) & 0xc),
67476                                                       &lane);
67477                             if (dt.Is(kDataTypeValueInvalid)) {
67478                               UnallocatedA32(instr);
67479                               return;
67480                             }
67481                             unsigned rd = ExtractDRegister(instr, 7, 16);
67482                             unsigned rt = (instr >> 12) & 0xf;
67483                             // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
67484                             vmov(condition,
67485                                  dt,
67486                                  DRegisterLane(rd, lane),
67487                                  Register(rt));
67488                             if (((instr & 0xf900f1f) != 0xe000b10)) {
67489                               UnpredictableA32(instr);
67490                             }
67491                             break;
67492                           }
67493                           case 0x00800000: {
67494                             // 0x0e800a10
67495                             if ((instr & 0x00600000) == 0x00600000) {
67496                               if (((instr & 0xf0000000) == 0xf0000000)) {
67497                                 UnallocatedA32(instr);
67498                                 return;
67499                               }
67500                               Condition condition((instr >> 28) & 0xf);
67501                               unsigned spec_reg = (instr >> 16) & 0xf;
67502                               unsigned rt = (instr >> 12) & 0xf;
67503                               switch (spec_reg) {
67504                                 case 0x0:
67505                                 case 0x1:
67506                                 case 0x8: {
67507                                   // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
67508                                   vmsr(condition,
67509                                        SpecialFPRegister(spec_reg),
67510                                        Register(rt));
67511                                   if (((instr & 0xff00fff) != 0xee00a10)) {
67512                                     UnpredictableA32(instr);
67513                                   }
67514                                   break;
67515                                 }
67516                                 default:
67517                                   UnallocatedA32(instr);
67518                                   break;
67519                               }
67520                             } else {
67521                               UnallocatedA32(instr);
67522                             }
67523                             break;
67524                           }
67525                           case 0x00800100: {
67526                             // 0x0e800b10
67527                             switch (instr & 0x00200040) {
67528                               case 0x00000000: {
67529                                 // 0x0e800b10
67530                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67531                                   UnallocatedA32(instr);
67532                                   return;
67533                                 }
67534                                 Condition condition((instr >> 28) & 0xf);
67535                                 DataType dt =
67536                                     Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
67537                                                     ((instr >> 21) & 0x2));
67538                                 if (dt.Is(kDataTypeValueInvalid)) {
67539                                   UnallocatedA32(instr);
67540                                   return;
67541                                 }
67542                                 unsigned rd = ExtractDRegister(instr, 7, 16);
67543                                 unsigned rt = (instr >> 12) & 0xf;
67544                                 // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
67545                                 vdup(condition,
67546                                      dt,
67547                                      DRegister(rd),
67548                                      Register(rt));
67549                                 if (((instr & 0xfb00f5f) != 0xe800b10)) {
67550                                   UnpredictableA32(instr);
67551                                 }
67552                                 break;
67553                               }
67554                               case 0x00200000: {
67555                                 // 0x0ea00b10
67556                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67557                                   UnallocatedA32(instr);
67558                                   return;
67559                                 }
67560                                 Condition condition((instr >> 28) & 0xf);
67561                                 DataType dt =
67562                                     Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
67563                                                     ((instr >> 21) & 0x2));
67564                                 if (dt.Is(kDataTypeValueInvalid)) {
67565                                   UnallocatedA32(instr);
67566                                   return;
67567                                 }
67568                                 if (((instr >> 16) & 1) != 0) {
67569                                   UnallocatedA32(instr);
67570                                   return;
67571                                 }
67572                                 unsigned rd = ExtractQRegister(instr, 7, 16);
67573                                 unsigned rt = (instr >> 12) & 0xf;
67574                                 // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
67575                                 vdup(condition,
67576                                      dt,
67577                                      QRegister(rd),
67578                                      Register(rt));
67579                                 if (((instr & 0xfb00f5f) != 0xea00b10)) {
67580                                   UnpredictableA32(instr);
67581                                 }
67582                                 break;
67583                               }
67584                               default:
67585                                 UnallocatedA32(instr);
67586                                 break;
67587                             }
67588                             break;
67589                           }
67590                         }
67591                         break;
67592                       }
67593                       default: {
67594                         if (((instr & 0xf0000000) == 0xf0000000) ||
67595                             ((instr & 0xe00) == 0xa00)) {
67596                           UnallocatedA32(instr);
67597                           return;
67598                         }
67599                         UnimplementedA32("MCR", instr);
67600                         break;
67601                       }
67602                     }
67603                     break;
67604                   }
67605                   case 0x00100000: {
67606                     // 0x0e100010
67607                     switch (instr & 0x00000e00) {
67608                       case 0x00000a00: {
67609                         // 0x0e100a10
67610                         switch (instr & 0x00000100) {
67611                           case 0x00000000: {
67612                             // 0x0e100a10
67613                             switch (instr & 0x00e00000) {
67614                               case 0x00000000: {
67615                                 // 0x0e100a10
67616                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67617                                   UnallocatedA32(instr);
67618                                   return;
67619                                 }
67620                                 Condition condition((instr >> 28) & 0xf);
67621                                 unsigned rt = (instr >> 12) & 0xf;
67622                                 unsigned rn = ExtractSRegister(instr, 7, 16);
67623                                 // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
67624                                 vmov(condition, Register(rt), SRegister(rn));
67625                                 if (((instr & 0xff00f7f) != 0xe100a10)) {
67626                                   UnpredictableA32(instr);
67627                                 }
67628                                 break;
67629                               }
67630                               case 0x00e00000: {
67631                                 // 0x0ef00a10
67632                                 if (((instr & 0xf0000000) == 0xf0000000)) {
67633                                   UnallocatedA32(instr);
67634                                   return;
67635                                 }
67636                                 Condition condition((instr >> 28) & 0xf);
67637                                 unsigned rt = (instr >> 12) & 0xf;
67638                                 unsigned spec_reg = (instr >> 16) & 0xf;
67639                                 switch (spec_reg) {
67640                                   case 0x0:
67641                                   case 0x1:
67642                                   case 0x5:
67643                                   case 0x6:
67644                                   case 0x7:
67645                                   case 0x8: {
67646                                     // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
67647                                     vmrs(condition,
67648                                          RegisterOrAPSR_nzcv(rt),
67649                                          SpecialFPRegister(spec_reg));
67650                                     if (((instr & 0xff00fff) != 0xef00a10)) {
67651                                       UnpredictableA32(instr);
67652                                     }
67653                                     break;
67654                                   }
67655                                   default:
67656                                     UnallocatedA32(instr);
67657                                     break;
67658                                 }
67659                                 break;
67660                               }
67661                               default:
67662                                 UnallocatedA32(instr);
67663                                 break;
67664                             }
67665                             break;
67666                           }
67667                           case 0x00000100: {
67668                             // 0x0e100b10
67669                             if (((instr & 0xf0000000) == 0xf0000000)) {
67670                               UnallocatedA32(instr);
67671                               return;
67672                             }
67673                             Condition condition((instr >> 28) & 0xf);
67674                             unsigned lane;
67675                             DataType dt =
67676                                 Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
67677                                                             ((instr >> 19) &
67678                                                              0xc) |
67679                                                             ((instr >> 19) &
67680                                                              0x10),
67681                                                         &lane);
67682                             if (dt.Is(kDataTypeValueInvalid)) {
67683                               UnallocatedA32(instr);
67684                               return;
67685                             }
67686                             unsigned rt = (instr >> 12) & 0xf;
67687                             unsigned rn = ExtractDRegister(instr, 7, 16);
67688                             // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
67689                             vmov(condition,
67690                                  dt,
67691                                  Register(rt),
67692                                  DRegisterLane(rn, lane));
67693                             if (((instr & 0xf100f1f) != 0xe100b10)) {
67694                               UnpredictableA32(instr);
67695                             }
67696                             break;
67697                           }
67698                         }
67699                         break;
67700                       }
67701                       default: {
67702                         if (((instr & 0xf0000000) == 0xf0000000) ||
67703                             ((instr & 0xe00) == 0xa00)) {
67704                           UnallocatedA32(instr);
67705                           return;
67706                         }
67707                         UnimplementedA32("MRC", instr);
67708                         break;
67709                       }
67710                     }
67711                     break;
67712                   }
67713                 }
67714                 break;
67715               }
67716             }
67717             break;
67718           }
67719           case 0x01000000: {
67720             // 0x0f000000
67721             if (((instr & 0xf0000000) == 0xf0000000)) {
67722               UnallocatedA32(instr);
67723               return;
67724             }
67725             Condition condition((instr >> 28) & 0xf);
67726             uint32_t imm = instr & 0xffffff;
67727             // SVC{<c>}{<q>} {#}<imm> ; A1
67728             svc(condition, imm);
67729             break;
67730           }
67731         }
67732         break;
67733       }
67734     }
67735   }
67736 }  // NOLINT(readability/fn_size)
67737 // End of generated code.
67738 
DecodeT32At(const uint16_t * instruction_address,const uint16_t * buffer_end)67739 const uint16_t* PrintDisassembler::DecodeT32At(
67740     const uint16_t* instruction_address, const uint16_t* buffer_end) {
67741   uint32_t instruction = *instruction_address++ << 16;
67742 
67743   if (instruction >= kLowestT32_32Opcode) {
67744     if (instruction_address >= buffer_end) {
67745       os() << "?\n";
67746       return instruction_address;
67747     }
67748     instruction |= *instruction_address++;
67749   }
67750 
67751   DecodeT32(instruction);
67752   return instruction_address;
67753 }
67754 
DecodeT32(uint32_t instruction)67755 void PrintDisassembler::DecodeT32(uint32_t instruction) {
67756   PrintCodeAddress(GetCodeAddress());
67757   if (T32Size(instruction) == 2) {
67758     PrintOpcode16(instruction >> 16);
67759     Disassembler::DecodeT32(instruction);
67760   } else {
67761     PrintOpcode32(instruction);
67762     Disassembler::DecodeT32(instruction);
67763   }
67764   os() << "\n";
67765 }
67766 
67767 
DecodeA32(uint32_t instruction)67768 void PrintDisassembler::DecodeA32(uint32_t instruction) {
67769   PrintCodeAddress(GetCodeAddress());
67770   PrintOpcode32(instruction);
67771   Disassembler::DecodeA32(instruction);
67772   os() << "\n";
67773 }
67774 
67775 
DisassembleA32Buffer(const uint32_t * buffer,size_t size_in_bytes)67776 void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
67777                                              size_t size_in_bytes) {
67778   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
67779   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
67780   const uint32_t* const end_buffer =
67781       buffer + (size_in_bytes / sizeof(uint32_t));
67782   while (buffer < end_buffer) {
67783     DecodeA32(*buffer++);
67784   }
67785 }
67786 
67787 
DisassembleT32Buffer(const uint16_t * buffer,size_t size_in_bytes)67788 void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
67789                                              size_t size_in_bytes) {
67790   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
67791   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
67792   const uint16_t* const end_buffer =
67793       buffer + (size_in_bytes / sizeof(uint16_t));
67794   while (buffer < end_buffer) {
67795     buffer = DecodeT32At(buffer, end_buffer);
67796   }
67797   VIXL_ASSERT(buffer == end_buffer);
67798 }
67799 
67800 }  // namespace aarch32
67801 }  // namespace vixl
67802